Install

 

CMake의 install 명령어는 배포할 바이너리나 헤더들을 특정 디렉토리에 모으기 위해 사용된다. 즉 설치(install)이라는 키워드가 가지는 의미는 "빌드 산출물을 잘  정리해서 원하는 디렉토리에 배치하는 것"이다.

 

기본적으로 다음과 같은 명령어를 따라서 configure 및 build를 수행하게 되면 빌드 디렉토리 안에 모든 결과물들이 존재하게 된다.

cmake -S . -B build
cmake --build build

 

isntall() 커맨드를 사용할 수 있도록 세팅하였다면, `cmake --instal build` 한 번만 실행파면 실행 파일이 `bin/`에, 라이브러리가 `lib/`에, 헤더가 `include/`에 정리되어 들어올 수 있도록 할 수 있다. 즉, 설치된 프로그램처럼 사용이 가능하다.

 

그리고 DESTINATION 옵션을 사용할 때, 절대 경로로 동작하지만 상대 경로를 권장한다. 상대 경로로 주어지면 기본적으로`CMAKE_INSTALL_PREFIX` 변수값을 기준으로 해석된다. 그리고 상대 경로를 사용하면 --prefix 같은 옵션을 사용할 수 있지만, 절대 경로에선 사용하지 못한다.

 

 

 

예제

1. 실행 파일 설치 예시

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(HelloInstall LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

add_executable(hello src/hello.cpp)

install (TARGETS hello
    RUNTIME DESTINATION bin
)

message(${CMAKE_INSTALL_PREFIX})

여기서 RUNTIME 옵션은 Executable과 DLL들을 의미한다. hello 타겟에 존재하는 exe 파일과 dll 파일을 지정한 디렉토리로 옮기게 된다.  리눅스 기준으로는 실행 파일만 복사하여 install 디렉토리에 넣게 된다.

 

 

./src/hello.cpp

#include <iostream>

int main()
{
    std::cout << "Hello, CMake Install!" << std::endl;
    return 0;
}

 

 

cmake 명령어

cmake -S . -B build
cmkae --build build
cmake --install build --prefix ./install

 

여기서 `--install build` 명령어는 복사할 대상이 들어있는 빌드 디렉토리를 지정하고, 규칙에 맞게 빌드 결과물을 복사하라는 뜻이다. 그리고 --prefix값은 기본적으론 `/usr/local`이지만 이 값을 `./install`로 지정한다.

 

 

결과:

`./install/bin/hello`

 

 

2. 실행 파일과 함께 라이브러리, 헤더 설치 예시

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(AppWithLib LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

add_library(mylib src/mylib.cpp)
target_include_directories(mylib PUBLIC include)

add_executable(myapp src/main.cpp)
target_link_libraries(myapp PRIVATE mylib)

install(TARGETS mylib myapp
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)
install(DIRECTORY include/ DESTINATION include)

 

 

src/main.cpp

#include <iostream>
#include "mylib.h"

int main()
{
    int x = 3;
    int y = 4;
    int result = add(x, y);

    std::cout << x << " + " << y << " = " << result << std::endl;
    return 0;
}

 

 

include/mylib.h

#ifndef MYLIB_H
#define MYLIB_H

int add(int a, int b);

#endif

 

 

src/mylib.cpp

#include "mylib.h"

int add(int a, int b)
{
    return a + b;
}

 

 

cmake 명령어

cmake -S . -B build
cmake --build build
cmake --install build --prefix ./install

 

 

 

 

참고 자료

https://blog.naver.com/lifeisforu/222724622641

https://cmake.org/cmake/help/latest/command/install.html