[cmake] CMake가 ‘configure –prefix = DIR && make all install’과 동등한 것은 무엇입니까?

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

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

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



답변

명령 행에서 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)에서만 사용되며 무시됩니다. 다른 사람들에 의해.


답변

허용 된 답변의 “: PATH”부분은 생략 할 수 있습니다. 이 구문은 더 기억에 남을 수 있습니다.

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

여기 의 답변에 사용 됩니다 .


답변

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를 사용해야하는 경우에는 적합하지 않습니다.


답변

플랫폼 간 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)에서 작동한다는 것입니다.

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


답변

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

당신의 대답은 위험한 혼란을 야기합니다. 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 등).


답변

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위해 닌자 임의 발생기 특정 명령을 기억할 필요가 없음).


답변

CMake 3.15부터는이를 달성하는 올바른 방법은 다음과 같습니다.

cmake --install <dir> --prefix "/usr"

공식 문서