cmake의 export는 패키지를 할 때, 다른 cmake 프로젝트에서 손쉽게 패키지화 된 라이브러리를 사용하기 위함이다.
cmake export를 사용해보자
준비
아래와 같이 프로젝트를 구성해보았다.
mylib/
├── CMakeLists.txt
├── library.h
├── library.cpp
└── MyLibConfig.cmake.in
mylib/CmakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MyLib VERSION 1.0.0)
add_library(mylib SHARED library.cpp)
target_include_directories(mylib
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
# 설치 설정, install의 대상은 CMake 타겟
install(TARGETS mylib
EXPORT MyLibTargets # 타겟 정보를 따로 export할 것도 명시
LIBRARY DESTINATION lib # 공유 라이브러리 (.so, .dylib) 파일은 lib 디렉토리로
ARCHIVE DESTINATION lib # 정적 라이브러리 (.a) 파일도 lib 디렉토리로
INCLUDES DESTINATION include # 타겟의 include 경로는 나중에 include 폴더를 기준으로 한다
) # "mylib" 타겟 자체를 설치, 빌드 결과물 (.so, .a)을 설치
# 헤더 파일 설치, 단순한 파일이 install 대상
install(FILES library.h DESTINATION include)
# 타겟의 메타정보(구성 정보)를 cmake용 스크립트로 저장
# 타겟을 다른 프로젝트가 find_package(MyLib)로 쉽게 찾게하기 위해
install(EXPORT MyLibTargets
FILE MyLibTargets.cmake
NAMESPACE MyLib:: # 설치할 때 타겟 이름에 붙일 namespace (ex: MyLib::mylib)
DESTINATION share/MyLib/cmake
)
# Config.cmake 파일 생성
include(CMakePackageConfigHelpers)
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/MyLibConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
INSTALL_DESTINATION share/MyLib/cmake
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
DESTINATION share/MyLib/cmake
)
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>와 $<INSTALL_INTERFACE:include> CMake의 generator expressions으로 target_include_directories()에서 빌드할 때는 BUILD_INTERFACE의 정의를 사용하고 cmake --build 중에는 INSTALL_INTERFACE를 사용한다는 의미
이렇게 빌드할 때와 설치 할때의 상황을 분리하기 위한 의도이다.
자주 사용하는 generator expressions
$<CONFIG:Debug> | Debug 구성(build type)일 때 true |
$<BOOL:...> | 값이 참이면 1, 거짓이면 0 반환 |
$<BUILD_INTERFACE:...> | 빌드할 때만 적용 |
$<INSTALL_INTERFACE:...> | 설치 후 사용할 때만 적용 |
$<TARGET_PROPERTY:tgt,prop> | 타겟(tgt)의 속성(prop)을 읽음 |
$<AND:cond1,cond2,...> | 여러 조건을 모두 만족하는 경우 true |
$<OR:cond1,cond2,...> | 여러 조건 중 하나라도 만족하면 true |
$<NOT:cond> | 조건 반전 |
MyLibConfig.cmake.in
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")
빌드 & install
아래 스크립트를 실행하면 패키지화된 결과가 나온다.
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../install
cmake --build .
cmake --install .
cmake --install 커맨드를 수행하면 아래와 같이 결과물이 설치된다.
.
├── include
│ └── library.h
├── lib
│ └── libmylib.so
└── share
└── MyLib
└── cmake
├── MyLibConfig.cmake
├── MyLibTargets.cmake
└── MyLibTargets-noconfig.cmake
├── CMakeLists.txt
└── main.cpp
위와 같이 다른 외부 프로젝트를 생성하고 CmakeLists.txt에 아래와 같이 패키지화된 MyLib를 사용할 수 있다.
cmake_minimum_required(VERSION 3.31)
project(other)
set(CMAKE_CXX_STANDARD 17)
find_package(MyLib REQUIRED PATHS /home/bont/Desktop/log)
add_executable(other main.cpp)
target_link_libraries(other PRIVATE MyLib::mylib)
'프로그래밍 언어 > Cmake' 카테고리의 다른 글
RUNPATH를 통해 다른 환경에서 LD_LIBRARY_PATH 무시하고 실행 (0) | 2025.04.25 |
---|---|
Conan 패키지 매니저: 시작하기 (0) | 2023.09.21 |
cmake (0) | 2023.04.05 |
Makefile (0) | 2020.05.25 |
GCC (0) | 2020.05.12 |