CMake는 정확히 어떻게 작동합니까?


158

나는 이것을 나 자신에게 요구하지 않습니다. 나는이 질문이 저를 좋아하는 많은 초보자를위한 참고 자료가되기를 바랍니다.이 작은 CMakeLists.txt파일의 경우 장면 뒤에서 정확히 무슨 일이 있었는지에 대해 완전히 당황했습니다.

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

그리고 그런 작은 tutorial.cpp

int main() { return 0; } 

너무 많은 파일이 생성됩니다

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

그리고 CMakeFiles너무 많은 파일과 폴더와 폴더

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

CMake를 배우는 데 가장 큰 장애물은 장면 뒤에서 무슨 일이 있었는지 이해하지 못하는 것입니다 (즉, 파일이 생성되어야하는 이유와 목적이 무엇인지).

아는 사람이 있다면 후손을 위해 설명해 주시겠습니까? 이 파일의 목적은 무엇이며, 입력 할 때 cmake .프로젝트를 빌드하기 전에 cmake가 구성하고 생성하는 것이 정확히 무엇입니까?


1
소스 외부 빌드를 알고 있습니다. 누군가가 소스를 만들지 않았고 여전히 생성 된 파일을 정리하는 방법을 찾고 있다면,이 기술은 잘 작동합니다 : stackoverflow.com/a/12055610/453673
Nav

3
aosabook.org/en/cmake.html에 멋진 설명이 있고 아마도 질문에 대한 심층적 인 답변이 있습니다 (여기에서 간단히 요약 할 수는 없습니다).
parasrish

@SebTu 끊어진 링크. cmake.html 페이지가 없습니다.
Nav

3
@Nav Yap, 마크 업 구문을 엉망으로 만들었습니다. 죄송합니다. 따라서 수정 된 버전은 다음과 같습니다. cmake를 처음 사용하는 사람들에게는 cmake 아키텍처를 읽는 것이 좋습니다 . 그것은 cmake가 세부 사항을 잃지 않고 작동하는 방식을 느끼기에 충분한 정보를 제공합니다.
SebNag

답변:


92

비밀은 생성 된 파일의 기능을 이해할 필요가 없다는 것입니다.

CMake는 빌드 시스템에 많은 복잡성을 도입했으며, 대부분 복잡한 소프트웨어 프로젝트를 빌드하는 데 사용하는 경우에만 비용을 지불합니다.

좋은 소식은 CMake가 이러한 혼란을 멀리하는 좋은 일을한다는 것입니다. 소스 외부 빌드 를 사용하면 생성 된 파일을 볼 필요조차 없습니다. 지금까지이 작업을 수행하지 않은 경우 (필자가 작성한 이후로 추측됩니다 cmake .) 계속하기 전에 확인하십시오 . 빌드와 소스 디렉토리를 혼합하는 것은 CMake에서 정말 고통스럽고 시스템이 사용되는 방식이 아닙니다.

간단히 말해서 : 대신

cd <source_dir>
cmake .

항상 사용

cd <build_dir_different_from_source_dir>
cmake <source_dir>

대신에. 나는 보통 build소스 디렉토리 안에 빈 서브 폴더 를 빌드 디렉토리로 사용한다.

고통을 덜기 위해 CMake가 생성하는 관련 파일에 대해 간략히 설명하겠습니다.

  • 프로젝트 파일 / 메이크 파일 -실제로 관심있는 항목 : 선택한 생성기에서 프로젝트를 빌드하는 데 필요한 파일. 이것은 Unix Makefile에서 Visual Studio 솔루션에 이르기까지 무엇이든 될 수 있습니다.
  • CMakeCache.txt- 실행 사이의 값을 캐시하는 데 사용되는 영구 키 / 값 문자열 스토리지입니다. 여기에 저장된 값은 라이브러리 종속성에 대한 경로이거나 선택적 구성 요소를 빌드해야하는지 여부입니다. 변수의 목록은 실행시 표시되는 것과 거의 동일하다 ccmakecmake-gui. 이것은 때때로 살펴 보는 것이 유용 할 수 있지만 가능하면 위에서 언급 한 도구를 사용하여 값을 변경하는 것이 좋습니다.
  • 생성 된 파일 -빌드 된 프로젝트를 다른 CMake 프로젝트와 다시 통합하는 데 도움이되는 자동 생성 된 소스 파일에서 내보내기 매크로에 이르기까지 다양합니다. 이들 대부분은 요청시에만 생성되며 질문과 같은 간단한 프로젝트에는 나타나지 않습니다.
  • 빌드 시스템을 행복하게 유지하기 위해 다른 것은 거의 소음입니다. 특히, 나는 CMakeFiles서브 디렉토리 안에서 일어나는 일에 신경 쓸 필요가 없었습니다 .

일반적으로 CMake가 생성 한 파일을 엉망으로 만들면 안됩니다. 모든 문제는 어떤 CMakeLists.txt방식 으로든 다른 방식 으로 해결할 수 있습니다 . 결과가 예상대로 프로젝트를 빌드하는 한 괜찮을 것입니다. 까다로운 세부 사항에 대해 너무 걱정하지 마십시오. 이것이 CMake가 처음부터 당신을 아끼려 고했던 것이기 때문입니다.


감사. 소스 빌드가 부족하다는 것을 알고 있었지만,보다시피,이 질문을하는 목적은 더 많은 것을 이해하는 것이 었습니다. 답변의 CMakeCache.txt 부분이 실제로 도움이되었습니다. 내가 찾던 이런 종류의 설명입니다. 또한, 내 질문의 마지막 문장 : " 프로젝트를 빌드하기 전에 cmake가 정확히 구성하고 생성하는 것 "
Nav

1
CMakeFiles디렉토리에는 CMake 빌드 문제 해결에 포함 CMakeError.log되며 CMakeOutput.log중요합니다.
Serge Rogatch

1
때때로 CMakeFiles/target_name.dir디렉토리 에서 체크인해야하는 두 가지가 flags.makelink.txt파일입니다. 나는 업스트림 프로젝트에서 플래그 / 링크 된 물건을 상속받은 복잡한 프로젝트에서 이것을 확인해야했습니다. 예 : TPL A가 TPL B에 종속되어 있기 때문에 오류가 발생했습니다. 또한 프로젝트에 B에 종속되어 로컬에 설치했습니다. 하지만 A는 로컬 설치가 아닌 내 시스템의 B 버전을 사용하여 다른 활성화 옵션을 사용했으며 프로젝트에 오류가 발생했습니다. link.txt 만보 고 이것이 일어나는 것을 알 수있었습니다.
bartgol

13

웹 사이트에 명시된 바와 같이 :

Cmake는 컴파일러 독립적 인 방법을 사용하여 소프트웨어의 빌드 프로세스를 관리하기위한 크로스 플랫폼, 오픈 소스 빌드 시스템입니다.

대부분의 경우 프로젝트 / 메이크 파일을 생성하는 데 사용됩니다. 예를 들어 Makefile소프트웨어 (대부분 Linux / Unix 플랫폼)를 빌드하는 데 사용되는 파일이 생성되었습니다 .

Cmake는 특정 컴파일 / 플랫폼을위한 플랫폼 별 프로젝트 / 메이크 파일을 생성하는 크로스 플랫폼 빌드 파일을 제공합니다.

예를 들어 Visual Studio를 사용하여 Windows에서 소프트웨어를 컴파일 한 다음 CMakeLists.txt파일에 적절한 구문을 사용하여 시작할 수 있습니다.

cmake .

Windows 플랫폼의 프로젝트 디렉토리 내부에서 Cmake는 필요한 모든 프로젝트 / 솔루션 파일 .sln등 을 생성합니다 .

Linux / Unix 플랫폼에서 소프트웨어를 빌드하려면 CMakeLists.txt파일 이있는 소스 디렉토리로 이동 하여 동일하게 트리거하면 cmake .단순 make또는 소프트웨어를 통해 소프트웨어를 빌드하는 데 필요한 모든 파일이 생성됩니다. make all .

다음은 주요 Cmake 기능에 대한 훌륭한 프레젠테이션입니다. http://www.elpauer.org/stuff/learning_cmake.pdf

편집하다

플랫폼 종속 라이브러리에 / 변수 정의 등을 포함 시키려면 CMakeLists.txt파일 에서이 구문을 사용할 수 있습니다

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

당신은 예를 들어 당신이 부스트 라이브러리가없는 사실을 통지 할 것입니다 Cmake 실패에서 제자리에 빌드를 방지 할 수있는 사용하여 명령을 많이도 있습니다 filesystemregex시스템에 설치가. 이를 위해 다음 구문을 사용할 수 있습니다.

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

적절한 시스템 / IDE / 컴파일러에 대한 makefile을 생성하는지 확인했습니다.


1
감사합니다 Patryk. 유용한 답변이지만 링크 된 PDF는 주로 CMake를 구현하는 CMake 학습의 두 번째 단계를 설명합니다. 나는 CMake에서 사람이 지구상에서 무슨 일이 일어나고 있는지 이해해야하는 첫 번째 단계에 대한 설명을 묻습니다!
Nav

@ Nav 내 답변을 조금 확장했습니다. 자세한 정보는 여전히 웹을 검색 할 수 있습니다.
Patryk

이것은 질문에 대답하는 것과는 거리가 멀다.
SenhorLucas

1

CMake의 작동 방식은 개발자에게 중요한 질문이므로 여기에서는이 질문에 답변 할 수 없습니다.

그러나 CMake를 사용해야 할 때와 작동 방식에 대해 걱정할 필요가있을 때 유용한 지침을 제공 할 수 있습니다. 나는 "어쩌면 작동한다"라는 대답을 좋아하지도 않는다. 특히 소프트웨어에서는 "작동하지 않는다"는 말이 있기 때문에 어떤 시점에서는 항상 세부 사항을 파악해야한다.

CMake는 강력한 도구입니다. 매우 복잡한 여러 프로세스를 자동화하고 특히 상당히 새로운 개발자로서 알지 못할 수있는 많은 변수를 고려합니다. CMake가 처리 할 수있는 모든 운영 체제 및 빌드 도구에 대한 지식이 제한되어있을 것입니다. 너무 많은 파일이 생성되는 이유와 사물이 너무 복잡해 보이는 이유는 다른 모든 시스템이 복잡하기 때문에 설명하고 자동화해야하기 때문입니다. 또한 "캐싱"및 도구의 다른 시간 절약 기능과 관련된 문제가 있습니다. CMake의 모든 것을 이해한다는 것은 이러한 빌드 도구와 OS 및 이러한 변수의 가능한 모든 조합을 이해하는 것이 불가능하다는 것을 의미합니다.

대형 크로스 플랫폼 빌드 시스템 관리를 담당하지 않고 코드 기반이 몇 개의 KLOC, 최대 100KLOG 인 경우 CMake를 사용하면 100,000 달러의 임업 트리 제거를 사용하는 것처럼 보입니다. 2 발 2 발 꽃밭에서 잡초를 제거하는 기계. (그런데, 그런 기계를 본 적이 없다면, 유튜브에서 하나를 찾아야 만합니다.)

빌드 시스템이 작고 단순하다면 직접 직접 메이크 파일을 작성하거나 직접 스크립트를 작성하는 것이 좋습니다. makefile이 다루기 어려워 지거나 다른 플랫폼에서 시스템 버전을 빌드해야하는 경우 CMake로 전환 할 수 있습니다. 이 시점에서 해결해야 할 많은 문제가 있으며 이에 대해보다 집중적 인 질문을 할 수 있습니다. 그 사이에 CMake에 관해 쓰여진 훌륭한 책 중 일부를 확인하거나 더 나은 책을 직접 작성하십시오! 8)

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