부모 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 실행 간의 구성이 다를 수 있다는 이상한 동작이 발생합니다.
'code' 카테고리의 다른 글
Pass a lambda expression in place of IComparer or IEqualityComparer or any single-method interface? (0) | 2021.01.08 |
---|---|
g++ linker: force static linking if static library exists? (0) | 2021.01.08 |
NLP 및 Elasticsearch를 사용한 의미 검색 (0) | 2021.01.08 |
테이블에 계산 된 열을 어떻게 추가합니까? (0) | 2021.01.08 |
"#! / bin / env"는 무엇을 의미합니까 (node.js 스크립트 맨 위에 있음)? (0) | 2021.01.08 |