저는 CMake를 처음 접했으며 사용 방법에 대한 몇 가지 자습서를 읽고 3 개의 다른 컴파일러 용 프로그램을 만들기 위해 복잡한 50 줄의 CMake 스크립트를 작성했습니다. 이것은 아마도 CMake에 대한 모든 지식을 마칠 것입니다.
이제 내 문제는 프로그램을 만들 때 폴더를 만지거나 방해하고 싶지 않은 소스 코드가 있다는 것입니다. 모든 CMake 및 make
출력 파일과 폴더가으로 이동하기 ../Compile/
를 원하므로 CMake 스크립트에서 몇 가지 변수를 변경했으며 내 노트북에서 다음과 같은 작업을 수행했을 때 언젠가는 작동했습니다.
Compile$ cmake ../src
Compile$ make
그것으로 내가 지금있는 폴더에 깨끗한 출력이 있었는데, 정확히 내가 찾고있는 것입니다.
이제 다른 컴퓨터로 옮겨서 CMake 2.8.11.2를 다시 컴파일했고 거의 정사각형으로 돌아 왔습니다! 항상 src
my 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
내가 뭔가를 놓치고 있습니까?
답변
설정하는 모든 변수를 설정할 필요가 거의 없습니다. 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 내에서 읽기 전용으로 처리해야합니다.
답변
아웃 오브 소스 빌드 를 원하는 것 같습니다 . 소스 외부 빌드를 생성 할 수있는 몇 가지 방법이 있습니다.
-
하던 일을하고 달려
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 .
현재 디렉토리가 이미 빌드 폴더 인 경우.
-
CMake 3.13 이상의 경우이 옵션을 사용하여 소스 및 빌드 폴더를 설정합니다.
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
-
이전 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
소스 디렉토리에서 ( 최소한) 제거하면이 문제를 상당히 쉽게 해결할 수 있습니다 . CMakeFiles
CMake가 생성 하는 몇 가지 다른 파일 (대부분 디렉터리에 있음)도 제거해야하지만 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.cmake
Google에 대한 많은 소스가 있지만 원본을 찾을 수없는 것 같고 여기에 전체를 포함하기에 충분히 짧습니다.
불행히도 cmake는 일반적으로 매크로가 호출 될 때 몇 개의 파일을 작성 했으므로 실제로 빌드를 수행하지 못하더라도 여전히 CMakeCache.txt
및 CMakeFiles
.
바이너리, 공유 및 정적 라이브러리가 작성되는 경로를 설정하는 것이 유용 할 수 있습니다. 어떤 경우 cmake 출력을 ‘bin’dir로 만드는지 확인 하십시오 . (면책 조항, 나는 그 질문에 대해 가장 많이 득표 한 답변을 가지고 있지만, 그것이 내가 그것에 대해 아는 방법입니다).
답변
내 의견을 답으로 바꾸기 :
누군가 내가 한 일을 한 경우 모든 빌드 파일을 소스 디렉토리에 넣는 것으로 시작했습니다.
cd src
cmake .
cmake는 빌드 파일과 캐시 파일 (잔뜩 넣어 것이다 CMakeCache.txt
, CMakeFiles
, cmake_install.cmake
에서, 등) src
디렉토리.
소스 외부 빌드로 변경하려면 해당 파일을 모두 제거해야했습니다. 그런 다음 @Angew가 그의 대답에서 권장하는 것을 할 수 있습니다.
mkdir -p src/build
cd src/build
cmake ..
답변
현재로 CMake 위키 :
소스에서 빌드하는 경우 CMAKE_BINARY_DIR, 이는 CMAKE_SOURCE_DIR과 동일하고, 그렇지 않은 경우 빌드 트리의 최상위 디렉토리입니다.
이 두 변수를 비교하여 소스 외부 빌드가 시작되었는지 확인
답변
스크립트에서 하드 코딩 된 빌드 디렉토리 이름에 의존해서는 안되므로이 행을 ../Compile
변경해야합니다.
컴파일 할 위치는 사용자가 결정해야하기 때문입니다.
대신 미리 정의 된 변수의 사용이 하나의 :
http://www.cmake.org/Wiki/CMake_Useful_Variables
(대한 모양 CMAKE_BINARY_DIR
과 CMAKE_CURRENT_BINARY_DIR
)