CMake는 프로젝트를 빌드하기 위해 사용되는 강력한 도구이다. 타겟(Target)은 CMake에서 중요한 개념으로, 빌드할 수 있는 실행 파일, 라이브러리 또는 커스텀 명령어 등을 의미한다. 타겟을 생성하고 관리하는 방법은 CMakeLists.txt 파일에서 중요한 부분을 차지한다.
타겟의 기본 개념
CMake에서 타겟은 프로젝트 빌드의 핵심 요소이다. 타겟은 실행 파일, 정적 라이브러리, 동적 라이브러리 등 다양한 형태로 존재할 수 있다. 각 타겟은 독립적으로 빌드되며, 소스 파일 및 의존성을 포함한다.
타겟 생성 명령어
타겟을 생성하기 위해 CMake는 add_executable()
과 add_library()
같은 명령어를 제공한다.
- add_executable(target_name source1 source2 ...): 실행 파일 타겟을 생성한다.
target_name
은 타겟의 이름이며, 뒤따르는 소스 파일 리스트는 이 타겟에 포함될 파일들이다.
cmake
add_executable(MyApp main.cpp utils.cpp)
이 명령어는 MyApp
이라는 이름의 실행 파일을 생성한다.
- add_library(target_name [STATIC | SHARED | MODULE] source1 source2 ...): 라이브러리 타겟을 생성한다. 라이브러리는 정적(
STATIC
), 동적(SHARED
), 모듈(MODULE
)로 구분된다.
cmake
add_library(MyLib STATIC lib.cpp)
위의 예에서는 MyLib
이라는 이름의 정적 라이브러리를 생성한다.
타겟 속성 설정
타겟이 생성된 후, 타겟에 여러 가지 속성을 설정할 수 있다. 이는 타겟의 동작을 제어하거나, 추가적인 설정을 적용하는 데 사용된다.
- target_include_directories(target_name PUBLIC|PRIVATE|INTERFACE dirs...): 타겟의 포함 디렉토리를 설정한다.
PUBLIC
,PRIVATE
,INTERFACE
키워드는 이 포함 디렉토리가 타겟 자신과 타겟을 의존하는 타겟에 어떻게 적용될지를 결정한다.
cmake
target_include_directories(MyApp PRIVATE include/)
위의 예에서는 MyApp
타겟에 대해 include/
디렉토리를 포함 경로로 추가한다.
- target_link_libraries(target_name PUBLIC|PRIVATE|INTERFACE libraries...): 타겟에 연결할 라이브러리를 지정한다. 이 명령어는 타겟이 다른 라이브러리와의 의존성을 가지도록 설정한다.
cmake
target_link_libraries(MyApp PRIVATE MyLib)
이 명령어는 MyApp
타겟이 MyLib
라이브러리를 링크하도록 설정한다.
타겟 속성의 접근과 수정
CMake에서는 타겟의 다양한 속성을 확인하고 수정할 수 있는 명령어들을 제공한다.
- set_target_properties(target_name PROPERTIES prop1 value1 prop2 value2 ...): 타겟의 속성을 설정한다.
cmake
set_target_properties(MyApp PROPERTIES CXX_STANDARD 17)
위의 예에서는 MyApp
타겟이 C++17 표준을 사용하도록 설정한다.
- get_target_property(var target_name property): 타겟의 속성을 가져와서 변수에 저장한다.
cmake
get_target_property(OutputName MyApp OUTPUT_NAME)
이 명령어는 MyApp
타겟의 OUTPUT_NAME
속성을 OutputName
변수에 저장한다.
의존성 관리
타겟 간의 의존성을 관리하는 것은 매우 중요하다. CMake는 이를 자동화할 수 있는 여러 도구를 제공한다.
- add_dependencies(target_name depend_target1 depend_target2 ...): 타겟 간의 빌드 순서를 설정한다. 특정 타겟이 다른 타겟들에 의존해야 하는 경우 사용한다.
cmake
add_dependencies(MyApp MyLib)
위의 예에서는 MyApp
타겟이 MyLib
타겟에 의존성을 가지며, MyLib
이 먼저 빌드되어야 함을 의미한다.
타겟 설치
타겟을 생성한 후, CMake를 통해 설치할 수도 있다.
- install(TARGETS target_name DESTINATION
) : 타겟을 지정된 디렉토리에 설치한다.
cmake
install(TARGETS MyApp DESTINATION bin)
이 명령어는 MyApp
실행 파일을 bin
디렉토리에 설치한다.
관련 자료: