code

부모 CMakeLists.txt에서 CMake의 기본 옵션 (…) 값 재정의

codestyles 2021. 1. 8. 08:15
반응형

부모 CMakeLists.txt에서 CMake의 기본 옵션 (…) 값 재정의


업그레이드의 용이성을 위해 빌드 시스템을 최소한으로 변경하여 소스 트리에 여러 타사 라이브러리를 포함하려고합니다. 그들은 모두 나처럼 CMake를 사용하므로 내 CMakeLists.txt add_subdirectory(extern/foo)에서 libfoo에 사용할 수 있습니다 .

그러나 foo CMakeLists.txt는 테스트 하네스를 컴파일하고 문서, 필요하지 않은 공유 라이브러리 등을 빌드합니다. libfoo 작성자는 옵션 ( option(FOO_BUILD_SHARED "Build libfoo shared library" ON)예 : CMake 명령 줄을 통해 설정할 수 있음)을 통해 이러한 항목을 제어 할 수있는 예지력이있었습니다 . 하지만 기본적으로 해제하고 명령 줄을 통해 재정의 할 수 있도록하고 싶습니다.

나는 set(FOO_BUILD_SHARED OFF)전에 해보았 다 add_subdirectory(extern/foo). 이는 두 번째 및 후속 빌드 시도 중에 공유 라이브러리를 빌드하지 않는 효과가 있지만, 속도를 높이기 위해 정말 필요한 첫 번째 빌드 동안에는 그렇지 않습니다.

이것이 가능합니까, 아니면 이러한 프로젝트에 대해 분기 된 CMakeLists.txt를 유지해야합니까?


CACHE에서 변수를 설정하십시오.

SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")

참고 : CMake가 GUI에이 항목을 표시하는 방법을 알 수 있도록 변수 유형과 설명을 지정해야합니다.


이 질문은 다소 오래되었지만 Google이 나를 여기로 데려 왔습니다.

문제 SET(<variable name> <value> CACHE BOOL "" FORCE)는 옵션 프로젝트 전체를 설정한다는 것입니다. 라이브러리 인 하위 프로젝트를 사용하고 싶은 경우,이를 사용하여 하위 BUILD_STATIC_LIBS프로젝트 ( ParentLibrary)에 SET(... CACHE BOOL "" FORCE)대해 설정하려는 경우 모든 프로젝트에 대한 값이 설정됩니다.

다음 프로젝트 구조를 사용하고 있습니다.

|CMakeLists.txt (root)
|- dependencies
   | CMakeLists.txt (dependencies)
   |- ParentLibrary
      | CMakeLists.txt (parent)
|- lib
   | CMakeLists.txt (lib)

이제 CMakeLists.txt (dependencies)다음과 같이 보입니다.

# Copy the option you want to change from ParentLibrary here
option (BUILD_SHARED_LIBS "Build shared libraries" ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(ParentLibrary)

장점은 수정할 필요가없고 ParentLibrary해당 프로젝트에 대해서만 옵션을 설정할 수 있다는 것입니다.

CMake 구성을 처음 실행할 때에서 option명령 을 명시 적으로 복사해야 ParentLibrary합니다. 처음에는 변수 값이 set명령에 의해 먼저 설정되고 나중에 option캐시에 값이 없기 때문에 값이 명령에 의해 덮어 쓰여집니다 . 두 번째로 CMake 구성을 실행할 때 option캐시에 이미 값이 있고 set명령 의 값 이 사용 되기 때문에 명령이 무시 됩니다. 이로 인해 두 CMake 실행 간의 구성이 다를 수 있다는 이상한 동작이 발생합니다.

참조 URL : https://stackoverflow.com/questions/3766740/overriding-a-default-option-value-in-cmake-from-a-parent-cmakelists-txt

반응형