CMake - 설치

mohadang·2022년 8월 13일
0

CMake

목록 보기
23/24
post-thumbnail

CMAKE_INSTALL_PREFIX

  • 설치 경로를 설정할 수 있는 변수
cmake_minimum_required(VERSION 2.8)
project(foo)

add_library(foo foo.cpp)

install(TARGETS foo DESTINATION lib)
# 빌드 및 설치

[install-examples]> cmake -H simple -B _builds -DCMAKE_INSTALL_PREFIX=_install/config-A
[install-examples]> cmake --build _builds --target install
Scanning dependencies of target foo
[ 50%] Building CXX object CMakeFiles/foo.dir/foo.cpp.o
[100%] Linking CXX static library libfoo.a
[100%] Built target foo
Install the project...
-- Install configuration: ""
-- Installing: /.../install-examples/_install/config-A/lib/libfoo.a   # 설치 경로


[install-examples]> cmake -H simple -B _builds -DCMAKE_INSTALL_PREFIX=_install/config-B
[install-examples]> cmake --build _builds --target install
[100%] Built target foo
Install the project...
-- Install configuration: ""
-- Installing: /.../install-examples/_install/config-B/lib/libfoo.a   # 설치 경로
  • 주의
    • CMAKE_INSTALL_PREFIX 변수는 사용자가 변경할 수 있도록 디자인 되었다.
    • 코드에서 강제로 변경 시키는 것은 권고되지 않는다.
# 코드에서 CMAKE_INSTALL_PREFIX 변경

cmake_minimum_required(VERSION 2.8)
project(foo)

# 나쁜 코드
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/3rdParty/root")

add_library(foo foo.cpp)

install(TARGETS foo DESTINATION lib)
# 사용자가 "`pwd`/_install" 에 설치하려고 함

[install-examples]> rm -rf _builds
[install-examples]> cmake -Hmodify-bad -B_builds -DCMAKE_INSTALL_PREFIX="`pwd`/_install"
[install-examples]> cmake --build _builds --target install
-- Install configuration: ""
-- Installing: /.../install-examples/_builds/3rdParty/root/lib/libfoo.a

# 라이브러리가 예상치 못한 3rdParty/root에 설치 되었다 원래는 "`pwd`/_install"에 설치 되어야 하는데
# make의 DESTDIR로 설치 경로 변경할 수 있다.

[install-examples]> rm -rf _builds
[install-examples]> cmake -Hsimple -B_builds -DCMAKE_INSTALL_PREFIX=""
[install-examples]> make -C _builds DESTDIR="`pwd`/_install/config-A" install
[install-examples]> make -C _builds DESTDIR="`pwd`/_install/config-B" install

추가적인 파일 인스톨하기

  • configure 과정에서 파일을 인스톨 할 수 있다.
# 빌드 시스템 생성시 README 파일을 빌드 시스템에 포함

cmake_minimum_required(VERSION 2.8)
project(foo)

add_library(foo foo.cpp)

install(TARGETS foo DESTINATION lib)

# BAD CODE!
file(
    COPY
    "${CMAKE_CURRENT_LIST_DIR}/README"
    DESTINATION
    "${CMAKE_INSTALL_PREFIX}/share/foo"   # configure 과정에 포함됨
)

include(CPack)  

# CMAKE_INSTALL_PREFIX 사용되면 잘못된 것이다.
# 사용자는 프로젝트를 설치하고 싶지 않을 수 있다
# 그런데 configure시 루트에 파일을 복사하는 것은 의도하지 않은 일이 된다.
# 위 방법 대신 install 명령을 사용해야 한다.
  • install 과정에서 파일 인스톨
cmake_minimum_required(VERSION 2.8)
project(foo)

add_library(foo foo.cpp)

install(TARGETS foo DESTINATION lib)
install(FILES README DESTINATION share/foo)    # install 과정에서 파일 설치

include(CPack)
# 인스톨

[install-examples]> cmake -H right-usage -B _builds -DCMAKE_INSTALL_PREFIX="`pwd`/_install"
[install-examples]> cmake --build _builds --target install
Scanning dependencies of target foo
[ 50%] Building CXX object CMakeFiles/foo.dir/foo.cpp.o
[100%] Linking CXX static library libfoo.a
[100%] Built target foo
Install the project...
-- Install configuration: ""
-- Installing: /.../install-examples/_install/lib/libfoo.a
-- Installing: /.../install-examples/_install/share/foo/README    # 여기에 인스톨됨

install 과정에서 스크립트 실행하기

cmake_minimum_required(VERSION 2.8)
project(foo)

set(script "${CMAKE_CURRENT_BINARY_DIR}/script.cmake")
configure_file(script.cmake.in "${script}" @ONLY)   # script

install(SCRIPT "${script}")     # install 과정에 스크립트 실행

include(CPack)
# script.cmake.in

cmake_minimum_required(VERSION 2.8)

set(correct "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}")     # 환경변수 DESTDIR 사용

message("Incorrect value: '@CMAKE_INSTALL_PREFIX@'")    # make로 인스톨 할 경우 X
message("Correct value: '${correct}'")

file(WRITE "${correct}/share/foo/info" "Some info")    # 인스톨 과정중 파일 생성
# make를 이용한 설치

[install-examples]> cmake -Hconfigure -B_builds -DCMAKE_INSTALL_PREFIX=""
[install-examples]> make DESTDIR="`pwd`/_install/config-A" -C _builds install
make: Entering directory '/.../install-examples/_builds'
Install the project...
-- Install configuration: ""
Incorrect value: ''
Correct value: '/.../install-examples/_install/config-A'    # 인스톨 과정중 스크립트 실행
make: Leaving directory '/.../install-examples/_builds'

[install-examples]> find _install/config-A -type f
_install/config-A/share/foo/info  
# cmake를 이용한 설치

[install-examples]> cmake -H configure -B_builds -DCMAKE_INSTALL_PREFIX="`pwd`/_install"
[install-examples]> cmake --build _builds --target install
Install the project...
-- Install configuration: ""
Incorrect value: '/.../install-examples/_install'    # 인스톨 과정중 스크립트 실행
Correct value: '/.../install-examples/_install'

[install-examples]> find _install -type f
_install/share/foo/info  
profile
mohadang

0개의 댓글