CMake 출력 / 빌드 디렉토리


116

저는 CMake를 처음 접했으며 사용 방법에 대한 몇 가지 자습서를 읽고 3 개의 다른 컴파일러 용 프로그램을 만들기 위해 복잡한 50 줄의 CMake 스크립트를 작성했습니다. 이것은 아마도 CMake에 대한 모든 지식을 마칠 것입니다.

이제 내 문제는 프로그램을 만들 때 폴더를 만지거나 방해하고 싶지 않은 소스 코드가 있다는 것입니다. 모든 CMake 및 make출력 파일과 폴더가으로 이동하기 ../Compile/를 원하므로 CMake 스크립트에서 몇 가지 변수를 변경했으며 내 노트북에서 다음과 같은 작업을 수행했을 때 언젠가는 작동했습니다.

Compile$ cmake ../src
Compile$ make

그것으로 내가 지금있는 폴더에 깨끗한 출력이 있었는데, 정확히 내가 찾고있는 것입니다.

이제 다른 컴퓨터로 옮겨서 CMake 2.8.11.2를 다시 컴파일했고 거의 정사각형으로 돌아 왔습니다! 항상 srcmy CMakeLists.txt가 있는 폴더로 물건을 컴파일합니다 .

내 CMake 스크립트에서 디렉토리를 선택하는 부분은 다음과 같습니다.

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR  ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})

그리고 이제는 항상 다음으로 끝납니다.

-- Build files have been written to: /.../src

내가 뭔가를 놓치고 있습니까?


4
설정하는 모든 변수를 설정할 필요가 거의 없습니다. CMake는 적절한 기본값으로 설정합니다. 당신은 확실히해야 하지 , 수정 CMAKE_BINARY_DIR또는 CMAKE_CACHEFILE_DIR. 이러한 모든 set()호출 을 제거 하고 그냥 수행 하면 어떻게됩니까 cd Compile; rm -rf *; cmake ../src?
문헌 : Angew는 더 이상 자랑 SO의없는

5
기본적으로 CMake를 실행할 때 소스 디렉터리 외부에있는 한 CMakeList가 명시 적으로 지시하지 않는 한 소스 디렉터리를 수정하지 않습니다.
문헌 : Angew는 더 이상 자랑 SO의없는

@Angew 놀라운 팁을 주셔서 감사합니다! 나는 그 모든 줄을 제거하고 cmake ../src를 사용했고 그것은 매력처럼 작동했습니다! CMake를 처음 배울 때 전에 시도했지만 작동하지 않았기 때문에 이것은 너무 놀랍습니다. 당신에게 큰 뚱뚱한 체크 표시 :) 제공하는 공식 답변에 답변을 넣어주세요
양자 물리학

1
저를 구한 것은 @Adam Bowen이 "인소 스 빌드로 소스 디렉토리에 대한 소스 외부 빌드를 만들 수 없습니다"라는 발언이었습니다.
Aur Saraf

답변:


60

설정하는 모든 변수를 설정할 필요가 거의 없습니다. CMake는 적절한 기본값으로 설정합니다. 당신은 확실히해야 하지 , 수정 CMAKE_BINARY_DIR또는 CMAKE_CACHEFILE_DIR. 읽기 전용으로 취급하십시오.

먼저 src 디렉터리에서 문제가있는 기존 캐시 파일을 제거합니다.

cd src
rm CMakeCache.txt
cd ..

그런 다음 모든 set()명령을 제거하고 다음을 수행하십시오.

cd Compile
rm -rf *
cmake ../src

CMake를 실행할 때 소스 디렉터리 외부에있는 한 CMakeList가 명시 적으로 지시하지 않는 한 소스 디렉터리를 수정하지 않습니다.

이 작업이 완료되면 CMake가 기본적으로 항목을 배치하는 위치를 볼 수 있으며 기본 위치 (예 : 기본값)가 만족스럽지 않은 경우에만 필요한 위치 EXECUTABLE_OUTPUT_PATH만 수정할 수 있습니다. 그리고 상대에게 표현하려고 CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, PROJECT_BINARY_DIR

CMake 문서를 보면 의미 론적 섹션으로 분할 된 변수를 볼 수 있습니다. 매우 특별한 상황을 제외하고 "정보를 제공하는 변수"에 나열된 모든 항목을 CMakeLists 내에서 읽기 전용으로 처리해야합니다.


2
src 디렉토리의 빌드와 함께 cmake를 사용하기 시작했습니다.이 기술은 처음에는 실패했습니다. src 디렉토리에서 모든 cmake 빌드 파일 / 캐시를 삭제하면이 기술이 작동했습니다. 감사!
Avi Tevet 2014 년

18
사용을 권장하지 않는 것이 좋습니다 rm -rf *. cd Compile실패 해도 예쁘지 않습니다 ...
Roman

2
@Roman 나는 그러한 명령 줄 예제를 거의 의사 코드로 간주합니다. "디렉토리를 입력하고 Compile거기에서 모든 것을 삭제 한 다음 소스 디렉토리의 경로로 CMake를 실행합니다." 라고 입력하는 것보다 덜 장황하고 정확 합니다. 나는 독자의 기본적인 상식과 판단을 가정합니다.
Angew는 더 이상 SO

@AviTevet : 이것이 정답이라고 생각합니다. 소스 디렉토리 내에 이전 cmake 호출의 cmake 캐시 파일이있는 경우 소스 디렉토리에서 이전 파일을 모두 삭제하지 않는 한 cmake가 생성 된 파일에 대해 다른 디렉토리를 선택하지 않습니다. 제 생각에는 CMake의 꽤 깨진 동작입니다. 다른 답을 쓰지 그래?
조 그래서

113

아웃 오브 소스 빌드 를 원하는 것 같습니다 . 소스 외부 빌드를 생성 할 수있는 몇 가지 방법이 있습니다.

  1. 하던 일을하고 달려

    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder
    

    이는 cmake가 발생하게됩니다 빌드 트리/path/to/my/build/folder위한 소스 트리 에서 /path/to/my/source/folder.

    일단 생성하면 cmake는 소스 폴더의 위치를 ​​기억하므로 빌드 트리에서 cmake를 다시 실행할 수 있습니다.

    cmake /path/to/my/build/folder

    또는

    cmake .

    현재 디렉토리가 이미 빌드 폴더 인 경우.

  2. CMake 3.13 이상의 경우이 옵션을 사용하여 소스 및 빌드 폴더를 설정합니다.

    cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
  3. 이전 CMake의 경우 문서화되지 않은 옵션을 사용하여 소스를 설정하고 폴더를 빌드합니다 .

    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder

    (1)과 똑같은 작업을 수행하지만 현재 작업 디렉토리에 의존하지 않습니다.

CMake 는 기본적으로 모든 출력을 빌드 트리 에 배치하므로 자유롭게 ${CMAKE_SOURCE_DIR}또는 ${CMAKE_CURRENT_SOURCE_DIR}cmake 파일을 사용하지 않는 한 소스 트리를 건드리지 않아야합니다 .

잘못 될 수있는 가장 큰 문제는 이전에 소스 트리에서 빌드 트리를 생성 한 경우입니다 (즉 , 소스 빌드가있는 경우). 이 작업을 완료하면 위의 (1)의 두 번째 부분이 시작되고 cmake는 소스 또는 빌드 위치를 변경하지 않습니다. 따라서 소스 내 빌드를 사용하여 소스 디렉터리에 대한 소스 외부 빌드를 만들 수 없습니다 . CMakeCache.txt소스 디렉토리에서 ( 최소한) 제거하면이 문제를 상당히 쉽게 해결할 수 있습니다 . CMakeFilesCMake가 생성 하는 몇 가지 다른 파일 (대부분 디렉터리에 있음)도 제거해야하지만 cmake가 소스 트리를 빌드 트리로 취급하지는 않습니다.

소스 외부 빌드가 소스 내부 빌드보다 종종 더 바람직하기 때문에 소스 외부 빌드를 요구하도록 cmake를 수정할 수 있습니다.

# Ensures that we do an out of source build

MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${CMAKE_BINARY_DIR}" insource)
     GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${PARENTDIR}" insourcesubdir)
    IF(insource OR insourcesubdir)
        MESSAGE(FATAL_ERROR "${MSG}")
    ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)

MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
    "${CMAKE_PROJECT_NAME} requires an out of source build."
)

위의 매크로는 일반적으로 사용되는 MacroOutOfSourceBuild. MacroOutOfSourceBuild.cmakeGoogle에 대한 많은 소스가 있지만 원본을 찾을 수없는 것 같고 여기에 전체를 포함하기에 충분히 짧습니다.

불행히도 cmake는 일반적으로 매크로가 호출 될 때 몇 개의 파일을 작성 했으므로 실제로 빌드를 수행하지 못하더라도 여전히 CMakeCache.txtCMakeFiles.

바이너리, 공유 및 정적 라이브러리가 작성되는 경로를 설정하는 것이 유용 할 수 있습니다. 어떤 경우 cmake 출력을 'bin'dir로 만드는지 확인 하십시오 . (면책 조항, 나는 그 질문에 대해 가장 많이 득표 한 답변을 가지고 있지만, 그것이 내가 그것에 대해 아는 방법입니다).


실제로 소스 폴더를 설정하는 옵션은 -S아닙니다-H
smac89

@ smac89 감사합니다! 3.13에서 문서화 한 것 같습니다. 최신 CMake를 반영하도록 답변을 업데이트했습니다.
Adam Bowen

8

내 의견을 답으로 바꾸기 :

누군가 내가 한 일을 한 경우 모든 빌드 파일을 소스 디렉토리에 넣는 것으로 시작했습니다.

cd src
cmake .

cmake는 빌드 파일과 캐시 파일 (잔뜩 넣어 것이다 CMakeCache.txt, CMakeFiles, cmake_install.cmake에서, 등) src디렉토리.

소스 외부 빌드로 변경하려면 해당 파일을 모두 제거해야했습니다. 그런 다음 @Angew가 그의 대답에서 권장하는 것을 할 수 있습니다.

mkdir -p src/build
cd src/build
cmake ..

7

현재로 CMake 위키 :

소스에서 빌드하는 경우 CMAKE_BINARY_DIR, 이는 CMAKE_SOURCE_DIR과 동일하고, 그렇지 않은 경우 빌드 트리의 최상위 디렉토리입니다.

이 두 변수를 비교하여 소스 외부 빌드가 시작되었는지 확인


6

스크립트에서 하드 코딩 된 빌드 디렉토리 이름에 의존해서는 안되므로이 행을 ../Compile변경해야합니다.

컴파일 할 위치는 사용자가 결정해야하기 때문입니다.

대신 미리 정의 된 변수의 사용이 하나의 : http://www.cmake.org/Wiki/CMake_Useful_Variables (대한 모양 CMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIR)


2
이것은 내가 찾고 있던 것입니다- CMAKE_CURRENT_BINARY_DIR일반적으로 현재 바이너리 빌드 경로에 대해 알려줍니다. 종속 libs / bin 빌드를 설정하는 데 사용할 수 있습니다.
parasrish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.