본문 바로가기
💻 programming/clean code

[Modern CMake] target_link_library, link_library (임시)

by 연구원-A 2021. 4. 15.
반응형

modern CMake는 빌드 의존성 문제 및 빌드 속도 개선을 위해 CMake 3.0.0 버전부터 도입되었습니다.

modern CMake에서는 기존의 link_library 대신 target_link_library를 사용할 것을 권장하고 있습니다.

 

classic CMake의 문제는 무엇이었는지, 그리고 modern CMake에는 무엇이 변경되었는지 차례로 설명하겠습니다.

1. classic CMake 문제점

먼저 classic CMake의 문제점에 대해 알아보겠습니다. CMake 2.7.x 버전에는 link_libraries, include_directories 명령어를 이용하여 빌드 옵션을 지정하였습니다.

ADD_COMPILE_OPTIONS ( <옵션> <옵션> ... )
INCLUDE_DIRECTORIES ( <디렉토리> <디렉토리> ... )
LINK_LIBRARIES ( <라이브러리> <라이브러리> ... )

그런데 이러한 명령어는 빌드 전역에 지정된다는 문제가 있습니다. 다시 말하면 해당 명령을 호출한 이후에 생성되는 모든 타겟들을 빌드할 때 이전에 선언했던 옵션들이 모두 적용된다는 것입니다. 이렇게 빌드 전역에 옵션을 지정하는 경우 타겟 간 빌드 의존성 문제나 불필요한 참조가 중첩되는 문제가 발생할 수 있습니다.

 

예를 들면 상위 폴더의 CMakeLists.txt에 include_directory("/usr/local/boost/include") 명령어를 사용하면, boost 라이브러리를 사용하지 않는 하위 폴더의 모든 CMakeLists.txt에 boost 헤더파일이 참조될 수 있습니다.

 

아래 그림은 service와 의존관계가 없는 mod1을 빌드했을 때, include_directories 명령어를 이용하면 mod1의 빌드 옵션에 상위 폴더의 service/include 폴더가 참조되는 것을 보여주는 사례입니다.

2. modern CMake 도입

Modern CMake에서는 빌드 의존성 문제를 해결하기 위해 (실행 파일이나 라이브러리와 같은) 특정 타겟에 한정하여 빌드 옵션을 지정하는 명령어들을 만들었습니다. CppCon 2017에서 Modern CMake Pattern이라는 주제가 처음 소개 되었으며 CMake 3.0.0 버전부터는 Modern CMake에 필요한 명령어를 지원하고 있습니다.

TARGET_COMPILE_OPTIONS ( <Target_이름> PUBLIC <옵션> <옵션> ... )
TARGET_INCLUDE_DIRECTORIES ( <Target_이름> PUBLIC <디렉토리> <디렉토리> ... )
TARGET_LINK_LIBRARIES ( <Target_이름> <라이브러리> <라이브러리> ... )

link_library, include_directories 명령어 대신 target_link_libraries, target_include_directories 명령어를 이용하면 하위 폴더에 있더라도 (빌드 의존성이 없으면) include 및 library 위치를 참조하지 않습니다.

 

이외에도 PUBLIC, PRIVATE과 같은 키워드를 이용하여 빌드 의존 관계를 유연하게 적용할 수 있다는 장점이 있습니다.

 

반응형

'💻 programming > clean code' 카테고리의 다른 글

gitignore 파일 생성하기 (cmake, python, c++, c#)  (0) 2021.08.05
[c++] google c++ style guide  (0) 2020.12.15

댓글