cmake
변수 및 속성
수색…
소개
기본 CMake 변수의 단순성은 전체 변수 구문의 복잡성에 달려 있습니다. 이 페이지는 예제와 함께 다양한 변수 사례를 문서화하고 피할 수있는 함정을 지적합니다.
통사론
- set (variable_name 값 [CACHE 유형 설명 [FORCE]])
비고
변수 이름은 대소 문자를 구분합니다. 이들의 값은 string 유형입니다. 변수의 값은 다음을 통해 참조됩니다.
${variable_name}
따옴표로 묶인 인수 내에서 평가됩니다.
"${variable_name}/directory"
캐시 된 (전역) 변수
set(my_global_string "a string value"
CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
CACHE BOOL "a description on the boolean cache entry")
CMake가 각 라인을 처리 할 때 (예 : CMake가 다시 실행될 때) 캐시 된 변수가 캐시에 이미 정의되어있는 경우 변경되지 않습니다. 기본값을 덮어 FORCE
려면 FORCE
를 마지막 인수로 추가하십시오.
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
지역 변수
set(my_variable "the value is a string")
기본적으로 로컬 변수는 add_subdirectory
명령을 통해 추가 된 현재 디렉토리 및 모든 하위 디렉토리에서만 정의됩니다.
변수의 범위를 확장하려면 두 가지 가능성이 있습니다.
CACHE
it을 사용하면 전 세계에서 사용할 수 있습니다.상위 범위에서 사용할 수 있도록
PARENT_SCOPE
사용PARENT_SCOPE
. 상위 범위는 상위 디렉터리의CMakeLists.txt
파일이거나 현재 함수의 호출자입니다.기술적으로 상위 디렉토리는
add_subdirectory
명령을 통해 현재 파일을 포함하는CMakeLists.txt
파일입니다.
문자열 및 목록
CMake가리스트와 일반 문자열을 구별하는 방법을 아는 것이 중요합니다. 당신이 쓸 때 :
set(VAR "ab c")
값 "ab c"
있는 문자열 을 만듭니다. 그러나 따옴표없이이 줄을 쓸 때 :
set(VAR abc)
대신 "a"
, "b"
및 "c"
의 세 항목 목록 을 만듭니다.
비 목록 변수는 사실 (너무 단일 요소) 목록입니다.
목록은 list()
명령으로 조작 할 수 있습니다.이 명령은 list()
연결하고 검색하며 임의의 요소에 액세스하는 등의 작업 을 수행합니다 (list () 문서 ).
다소 혼란 스럽지만 목록 은 문자열 이기도 합니다 . 라인
set(VAR abc)
~에 해당합니다.
set(VAR "a;b;c")
따라서 목록을 연결하려면 set()
명령을 사용할 수도 있습니다.
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
변수 및 전역 변수 캐시
주로 "일반 변수"를 사용합니다 .
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
그러나 CMake는 또한 전역 캐싱 변수 ( CMakeCache.txt
에 CMakeCache.txt
)를 CMakeCache.txt
있습니다. 그리고 같은 이름의 일반 변수와 캐시 된 변수가 현재 범위에 존재하면 일반 변수는 캐시 된 변수를 숨 깁니다.
cmake_minimum_required(VERSION 2.4)
project(VariablesTest)
set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")
set(VAR "NORMAL")
message("VAR = ${VAR}")
set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")
최초 실행 결과
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
두 번째 실행의 출력
VAR = CACHED
VAR = NORMAL
VAR = CACHED
참고 : FORCE
옵션은 현재 범위에서 일반 변수를 설정 해제 / 제거합니다.
캐시 된 변수의 사용 사례
일반적으로 두 가지 유스 케이스가 있습니다 (전역 변수를 오용하지 마십시오).
코드의 값은 프로젝트 사용자가
cmakegui
,ccmake
또는cmake -D ...
옵션을 사용하여 수정할 수 있어야합니다.CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
명령 행
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
이것은 캐시에서이 값을 미리 설정하고 위의 행은이를 수정하지 않습니다.
CMake GUI
GUI에서 사용자는 먼저 구성 프로세스를 시작한 다음 캐시 된 값을 수정하고 빌드 환경 생성을 시작하면서 완료 할 수 있습니다.
또한 CMake는 캐시 검색 / 테스트 / 컴파일러 식별 결과를 처리합니다 (따라서 구성 / 생성 단계를 다시 실행할 때마다 다시 수행 할 필요가 없습니다)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
여기서
LIB_A_PATH
는 캐시 된 변수로 작성됩니다.
gake를 사용하기위한 CMake에 프로파일 링 플래그 추가하기
일련의 이벤트는 다음과 같이 작동합니다.
- -pg 옵션을 사용하여 코드 컴파일
- -pg 옵션으로 코드 링크하기
- 프로그램 실행
- 프로그램이 gmon.out 파일을 생성합니다.
- gprof 프로그램 실행
프로파일 링 플래그를 추가하려면, CMakeLists.txt에 추가해야합니다 :
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
컴파일 및 링크 할 플래그를 추가하고 프로그램을 실행 한 후에 사용해야합니다.
gprof ./my_exe
다음과 같은 오류가 발생할 경우 :
gmon.out: No such file or directory
이는 컴파일이 프로파일 링 정보를 올바르게 추가하지 못했음을 의미합니다.