타겟 속성의 개념
CMake에서 타겟(target)은 빌드 시스템이 생성하는 기본적인 개체이다. 타겟은 보통 실행 파일, 라이브러리, 또는 유틸리티가 될 수 있다. CMake는 이러한 타겟에 대해 다양한 속성을 설정할 수 있는 기능을 제공한다. 이 속성들은 타겟의 컴파일, 링크, 설치 등에 관련된 세부 사항을 제어하는 데 사용된다. 이러한 속성을 효과적으로 설정함으로써 빌드 프로세스를 보다 세밀하게 관리할 수 있다.
타겟 속성 설정 방법
타겟 속성은 set_target_properties()
또는 set_property()
명령어를 사용하여 설정할 수 있다. 두 함수 모두 타겟의 속성을 지정하지만, set_target_properties()
는 여러 타겟의 속성을 동시에 설정할 수 있고, set_property()
는 특정 타겟의 속성에 대해 보다 세밀한 설정이 가능한다.
set_target_properties()
set_target_properties(<target1> [<target2> ...]
PROPERTIES <property1> <value1>
<property2> <value2>
...)
set_target_properties()
명령어는 지정된 타겟들에 대해 여러 속성을 한 번에 설정할 수 있다. 이 명령어는 주로 여러 타겟에 동일한 속성을 적용할 때 유용하다.
set_property()
set_property(TARGET <target> PROPERTY <property> <value>)
set_property()
명령어는 특정 타겟의 하나의 속성을 설정할 때 사용된다. 이 명령어는 개별 타겟에 대해 세밀한 조정을 할 수 있어, 보다 정교한 빌드 구성이 가능한다.
자주 사용하는 타겟 속성
ARCHIVE_OUTPUT_DIRECTORY
ARCHIVE_OUTPUT_DIRECTORY
속성은 정적 라이브러리가 생성될 디렉토리를 지정한다. 이 속성을 통해 빌드 출력물을 특정 위치로 쉽게 정리할 수 있다.
set_target_properties(my_static_lib PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
RUNTIME_OUTPUT_DIRECTORY
RUNTIME_OUTPUT_DIRECTORY
속성은 실행 파일이 생성될 디렉토리를 지정한다. 이 속성은 주로 윈도우 시스템에서 유용하게 사용된다.
set_target_properties(my_executable PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
LIBRARY_OUTPUT_DIRECTORY
LIBRARY_OUTPUT_DIRECTORY
속성은 공유 라이브러리 또는 모듈 라이브러리가 생성될 디렉토리를 지정한다. 이 속성을 사용하면 공유 라이브러리를 별도의 디렉토리에 모아서 관리할 수 있다.
set_target_properties(my_shared_lib PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
COMPILE_DEFINITIONS
COMPILE_DEFINITIONS
속성은 특정 타겟에 대해 컴파일러 정의를 추가할 때 사용된다. 이 속성을 통해 특정 타겟에 대한 전처리기 정의를 간단하게 추가할 수 있다.
set_target_properties(my_target PROPERTIES
COMPILE_DEFINITIONS "MY_DEFINE=1")
INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIES
속성은 타겟에 대해 포함 디렉토리를 설정할 때 사용된다. 이 속성을 통해 특정 타겟이 특정 헤더 파일 디렉토리를 포함할 수 있다.
set_target_properties(my_target PROPERTIES
INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include)
타겟 속성 조회 방법
타겟 속성은 get_target_property()
명령어를 사용하여 조회할 수 있다. 이 명령어는 특정 타겟의 특정 속성 값을 반환한다.
get_target_property(var_name my_target PROPERTY <property>)
조회된 속성 값은 var_name
변수에 저장되며, 이후 빌드 과정에서 이 변수를 사용할 수 있다.
타겟 속성의 우선순위
CMake에서 타겟 속성의 우선순위는 여러 요소에 의해 결정된다. set_target_properties()
와 set_property()
명령어로 설정된 속성은 명시적으로 설정된 값이므로 가장 높은 우선순위를 갖는다. 그러나 타겟 속성은 타겟의 링크 단계에서 상속될 수 있으며, 이 경우 우선순위는 타겟 간의 관계에 따라 달라질 수 있다. 따라서 타겟 속성의 설정 시점과 상속 관계를 잘 고려하여야 한다.
관련 자료: - CMake 공식 문서: https://cmake.org/documentation/ - Mastering CMake by Ken Martin, Bill Hoffman