CMake가 'configure --prefix = DIR && make all install'과 동등한 것은 무엇입니까?


386

그렇습니다 cmake . && make all install. 이것은 작동하지만에 설치됩니다 /usr/local.

다른 접두사 (예 : to /usr) 에 설치해야합니다 .

이란 무엇입니까 cmakemake설치 명령 줄에 /usr대신 /usr/local?


1
이는 설치 디렉토리를 즉시 변경하는 데 유용한 질문이지만 왜 그렇게 일반적으로 필요한가? 내 관점에서 대답은 명령 줄 옵션을 사용하지 말고 대신 기준 CMakeLists.txt을 설정하고 잊어 버릴 수 있도록 편집하십시오 . 나는 설치 디렉토리를 즉석에서 변경하는 일반적인 유스 케이스가 없다고 말하지는 않는다. 분명히 투표 수에 의해 판단된다. 나는 CMake를 처음 접 했고이 문제가 생길 때 호기심이 많다.
CivFan

8
@CivFan 프로젝트를 특정 위치에 빌드 및 설치하려는 사용자에게 제공하지만 프로젝트 개발자 / 유지 업체와 같은 사람은 아닙니다.
David Röthlisberger 2016 년

4
@CivFan 따라서 관리자로서, make install임시 경로 로 테스트 하여 설치해야 할 모든 것이 개발 시스템을 손상시키지 않고 올바른 위치에 설치되었는지 확인하는 것은 드문 일이 아닙니다 . 한 가지 예만 있습니다. 또 다른 경우는 다른 아키텍처에 대한 크로스 컴파일입니다.
Daniel

5
@CivFan : RPM 패키지를 만들고 싶기 때문에 이것이 필요합니다. 를 변경 CMakeLists.txt해야 할 경우 원래 소스를 패치해야합니다. 커맨드 라인 옵션 만 있으면 Fedora spec파일 에서 경로를 바로 얻을 수 있습니다.
Martin Ueding

1
@CivFan (및 다른 사람들이 이것을 읽음) 참고로 CMakeLists.txt소프트웨어를 빌드하고 설치하는 경우 파일 을 편집하는 것은 좋지 않은 것으로 간주됩니다. 명령 줄 또는 초기 캐시 파일에서 변수를 재정의 / 설정하는 것이 선호되는 "소비자"입니다. 옵션 설정 방법.
Ryan Pavlik

답변:


444

명령 행에서 CMake 변수를 전달하거나 ccmake / cmake-gui를 사용하여 캐시 된 변수를 편집 할 수 있습니다. 명령 행에서

cmake -DCMAKE_INSTALL_PREFIX : PATH = / usr. && 모두 설치

프로젝트를 구성하고 모든 대상을 빌드하고 / usr 접두사에 설치하십시오. 유형 (PATH)이 반드시 필요한 것은 아니지만 Qt 기반 cmake-gui가 디렉토리 선택기 대화 상자를 표시하게합니다.

의견으로 일부 사소한 추가는 간단한 동등성을 제공하는 것만으로는 충분하지 않음을 분명히합니다. 모범 사례는 외부 빌드 디렉토리를 사용하는 것입니다 (예 : 소스가 아닌). 또한 생성기를 추상화하는보다 일반적인 CMake 구문을 사용합니다.

mkdir 빌드 && cd 빌드 && cmake -DCMAKE_INSTALL_PREFIX : PATH = / usr .. && cmake --build. --target install --config 릴리즈

상당히 길어지고 더 이상 직접적으로 동등하지는 않지만 상당히 간결한 형태로 모범 사례에 더 가깝습니다. --config는 다중 구성 생성기 (예 : MSVC)에서만 사용되며 무시됩니다. 다른 사람들에 의해.


21
: PATH가 무엇인지 궁금하십니까? cmake-gui에 유용하며 해당 변수의 위젯을 선택하는 데 도움이됩니다. linux.die.net/man/1/cmake-gui의 문서 (섹션 참조)
albfan

2
CMake GUI에 힌트를 제공합니다. CMake의 모든 것은 사실상 문자열이지만 PATH, FILEPATH, STRING, BOOL 등을 설정하면 GUI가 더 적절한 위젯을 제공하는 데 도움이됩니다.
Marcus D. Hanwell

13
"cmake --build --target install"을 사용할 수도 있습니다. 대신에.
RobertJMaynard

2
/ usr 이후의 점은 무엇입니까? /usr .
bodacydo

5
CMakeLists.txt가 생성 된 폴더의 @bodacydo 위치
Kamiccolo


29

CMake 및 Autotools 모두 에서 구성시 항상 설치 경로를 설정할 필요는 없습니다. 다음 과 같이 설치시 DESTDIR 을 사용할 수 있습니다 ( 여기 참조 ).

make DESTDIR=<installhere> install

DESTDIR과 PREFIX의 미묘한 차이점을 설명하는 이 질문 도 참조하십시오 .

이는 단계별 설치를위한 것이며 프로그램을 실행하는 곳이 아닌 다른 위치 (예 : /etc/alternatives기호 링크)에 프로그램을 저장할 수 있도록 합니다.

그러나 패키지를 재배치 할 있고 구성 단계를 통해 설정된 하드 코딩 된 (접두사) 경로가 필요하지 않으면 건너 뛸 수 있습니다. 따라서 대신 :

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

당신은 실행할 것입니다 :

cmake . && make DESTDIR=/usr all install

user7498341이 지적했듯이 실제로 PREFIX를 사용해야하는 경우에는 적합하지 않습니다.


9
의 사용을 보여주는 것이 좋습니다 DESTDIR. 그러나 실제로 이것은 잘못되었습니다. cmake docs cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... make DESTDIR=/home/john install을 참조해야 합니다. 설치 접두사를 사용하여 관련 소프트웨어를 설치합니다 (예 : DESTDIR 값 앞에“/ usr / local”) 결국 "/ home / john / usr / local"을 제공합니다.
Joakim

1
나는 그것이 모순이라고 생각하지 않습니다. 패키지를 재배치 할 수 있으면 CMAKE_INSTALL_PREFIX가 필요하지 않으며 두 가지 방법 중 하나를 선택할 수 있습니다. 그렇지 않으면 빌드 시점에 CMAKE_INSTALL_PREFIX가 구워 져 있기 때문입니다.
Bruce Adams

당신의 생성기가 Makefile이라는 것을 알고 있다면 ... 나는 선호 cmake --build build --target install -- DESTDIR=/usr합니다 : 이것은 또한 Ninja 생성기와 함께 작동해야합니다 (규칙은 포함하는 것 같습니다 $ENV{DESTDIR})
Mizux

@Joakim은 CMAKE_INSTALL_PREFIX를 사용하고 싶은만큼 컴파일 된 파일에 설치 경로를 포함 시켰습니다. 그것이 일어날 때, 나는 단지 .rpm 패키지를 만들고 있었으므로 그렇게하지 않았습니다. DESTDIR은 빌드 루트에 물건을 넣는 매력처럼 일했습니다.
Mr Redstoner

18

플랫폼 간 CMake 프로젝트를 빌드하는 방법은 다음과 같습니다.

/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
/project-root/build> cmake --build . --target=install --config=Release
  • 처음 두 줄은 소스 외부 빌드 디렉토리를 만듭니다.
  • 세 번째 줄은 설치 결과를 넣을 위치를 지정하는 빌드 시스템을 생성합니다 (항상 배치합니다 ./project-root/build/stage-경로는 절대가 아닌 경우 항상 현재 디렉토리를 기준으로 간주됩니다)
  • 네 번째 라인은 .이전 라인에서 구성된 빌드 시스템으로 구성된 프로젝트를 빌드합니다 . install필요한 모든 종속 대상을 빌드 해야하는 대상을 실행 한 다음 파일을에 복사합니다 CMAKE_INSTALL_PREFIX(이 경우에는 ./project-root/build/stage. Visual Studio에서와 같이 다중 구성 빌드의 경우 선택적 --config <config>플래그.
  • cmake --build명령을 사용할 때 좋은 점은 다른 명령이 없어도 모든 생성기 (예 : makefile 및 Visual Studio)에서 작동한다는 것입니다.

나중에 설치된 파일을 사용하여 패키지를 만들거나 다른 프로젝트에 포함시킵니다.


단계별 설명 감사합니다! IMO는 이것이 유일한 방법입니다. 그렇지 않으면 cmake (플랫폼 독립성)의 전체 포인트가 삭제됩니다.
helmesjo

1
3 행에 소스 (../) 경로를 포함시키는 것을 잊었습니까? BTW 이것은 정답입니다.
Slava

1
LIne 3은 다음과 같아야합니다.cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
codenamezero

1
부가 적으로, 실용적으로 사람들은 make -j $(nproc)을 사용하여 빌드 스레드 수를 지정하고 cmake --build . --target=install --config=Release -- -j 8Makefile 생성기 또는 cmake --build . --target=install --config=Release -- /m:88 스레드가있는 Visual Studio 생성기에서 수행합니다. 실제로, 다음 명령 줄 매개 변수를 전달할 수 있습니다.--
Cloud

1
@MrRedstoner -j는 cmake에 대한 플래그가 아니며, 모든 플래그 --는 기본 빌드 시스템으로 전달됩니다.
Cloud

4

브루스 아담스의 답변에 대해 :

당신의 대답은 위험한 혼란을 야기합니다. DESTDIR은 루트 트리에서 설치하기위한 것입니다. DESTDIR을 지정하지 않은 경우 루트 트리에 설치 될 내용을 볼 수 있습니다. PREFIX는 실제 설치의 기반이되는 기본 디렉토리입니다.

예를 들어 PREFIX = / usr / local은 패키지 의 최종 대상이 / usr / local임을 나타냅니다 . DESTDIR = $ HOME을 사용하면 $ HOME이 루트 (/) 인 것처럼 파일을 설치합니다. DESTDIR이라고하면 / tmp / destdir라면 'make install'이 어떤 영향을 미치는지 알 수 있습니다. 그 정신, DESTDIR이해야 결코 내장 객체에 영향을 미치지 않습니다.

그것을 설명하는 makefile 세그먼트 :

install:
    cp program $DESTDIR$PREFIX/bin/program

프로그램은 PREFIX가 최종 (즉, 프로덕션) 디렉토리의 기본 디렉토리라고 가정해야합니다. DESTDIR = / something에 설치된 프로그램을 심볼릭 링크 할 수 있다는 것은 단지 프로그램이 단순히 작동하지 않기 때문에 PREFIX를 기반으로 파일에 액세스하지 않음을 의미합니다. cat (1)은 (가장 간단한 형태) 어디서나 실행할 수있는 프로그램입니다. 다음은 그렇지 않은 예입니다.

prog.pseudo.in:
    open("@prefix@/share/prog.db")
    ...

prog:
    sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
    compile prog.pseudo

install:
    cp prog $DESTDIR$PREFIX/bin/prog
    cp prog.db $DESTDIR$PREFIX/share/prog.db

$ PREFIX / bin / prog 이외의 곳에서 prog를 실행하려고하면 prog.db가 예상 위치에 없으므로 찾을 수 없습니다.

마지막으로 / etc / alternatives는 실제로 이런 방식으로 작동하지 않습니다. 루트 트리에 설치된 프로그램에 대한 심볼릭 링크가 있습니다 (예 : vi-> / usr / bin / nvi, vi-> / usr / bin / vim 등).


1
이 답변은 더 나은에 대한 답변으로 배치 될 수 stackoverflow.com/questions/11307465/destdir-and-prefix-of-make
브루스 아담스

2

CMake를make 사용하는 경우 실제 생성기 (예 : via ) 를 호출하는 것은 나쁜 습관으로 간주됩니다 . 다음과 같이하는 것이 좋습니다.

  1. 단계 구성 :

    cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
    
  2. 빌드 설치 단계

    cmake --build _builds/foo/debug --config Debug --target install
    

이 방법에 따라하면 쉽게 발생 (예를 전환 할 수 -GNinja위해 닌자 임의 발생기 특정 명령을 기억할 필요가 없음).


1
사용 된 모든 주장과 그 이유에 대한 설명이 제공된다면 더 나은 답이 될 수 있습니다. 특히, --config논쟁 의 요점은 무엇 입니까?
Dmitry Kabanov

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.