Programming Tools/CMake

[CMake] Library Options : 라이브러리에 옵션을 추가하기

LiDARian 2021. 9. 7. 13:00
반응형

 

소제목

 

이번에는 CMake에서 각각의 라이브러리에 옵션을 달아 줄 것이다.

 

우리가 추가해줬던 adder.h를 쓰냐, 안쓰냐에 따라서 (이것이 옵션이 된다.) 출력되는 결과물이 달라지게 하는 것이 목표다.

 

CMakeLists.txt를 다음과 같이 수정한다.

cmake_minimum_required(VERSION 3.21.1)

# 프로젝트명 : 실행파일 이름이 된다. 버전도 여기에 적을 수 있다.
project(OLAS VERSION 1.0)

# adder use logic
# 라이브러리에 option을 준다.
# OFF로 바꾸면 subdirectory를 빌드에서 추가하지 않게 되는 코드로 사용하고자 한다. 더 아래의 코드와 함께 사용해서 말이다.
option(USE_ADDER "A simple library for adding 2 floats." ON)

if(USE_ADDER)
    # 빌드할 라이브러리 지정. 하위폴더를 지정
    add_subdirectory(Adder)

    # 헤더파일을 추가하는 곳을 지정. #include "Adder/adder.h"라고 안적을 수 있다.
    target_include_directories(${PROJECT_NAME} 
        PUBLIC Adder
    )

    # 링크할 라이브러리를 찾는곳. 디렉토리를 빌드하기 위해 경로를 지정한다. 이때 경로는 build된 파일이 있는 경로. 즉, out/build 기준이다.
    target_link_directories(${PROJECT_NAME}
        PRIVATE Adder
    )
endif()

# 헤더 파일에도 이 버전에 대해서 인지시킨다.
# Input/Output 순서로 적는다.
configure_file(OLASConfig.h.in OLASConfig.h)

# 빌드해서 나올 것들. 프로젝트명을 실행파일 이름으로 한다. 빌드 대상은 main.cpp
add_executable(${PROJECT_NAME} main.cpp)

# 헤더파일을 input에서 output으로 만드는 데 필요한 경로를 입력한다.
# version number를 기록하는데 필요하다고 한다.
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})


# Download all the Submodules
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
    option(GIT_SUBMODULE "Check submodules during build" ON)
    if(GIT_SUBMODULE)
        message(STATUS "Submodule update")
        execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
                        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                        RESULT_VARIABLE GIT_SUBMOD_RESULT)
        if(NOT GIT_SUBMOD_RESULT EQUAL "0")
            message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}. please check...")
        endif()
    endif()
endif()

# Check all the Submodules
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/external/glfw/CMakeLists.txt")
    message(FATAL_ERROR "git submodules was not downloaded! GIT_SUBMODULE was turned off or failed. Please...")
endif()


add_subdirectory(external/glfw)

# 헤더파일을 추가하는 곳을 지정. #include "Adder/adder.h"라고 안적을 수 있다.
target_include_directories(${PROJECT_NAME} 
    PUBLIC external/glfw/include
)

# 링크할 라이브러리를 찾는곳. 디렉토리를 빌드하기 위해 경로를 지정한다. 이때 경로는 build된 파일이 있는 경로. 즉, out/build 기준이다.
target_link_directories(${PROJECT_NAME}
    PRIVATE external/glfw/src
)

# exe파일에 링크할 라이브러리
target_link_libraries(${PROJECT_NAME} adder glfw)

 

OLASConfig.h.in를 아래와 같이 수정한다.

 

cmakedefine을 통해서 매크로 상수를 하나 선언한다.

#define OLAS_VERSION_MAJOR @OLAS_VERSION_MAJOR@
#define OLAS_VERSION_MINOR @OLAS_VERSION_MINOR@

#cmakedefine USE_ADDER

 

혹은 list 명령을 사용해서 다음과 같이 쓸 수도 있다.

 

cmake_minimum_required(VERSION 3.21.1)

# 프로젝트명 : 실행파일 이름이 된다. 버전도 여기에 적을 수 있다.
project(OLAS VERSION 1.0)

# adder use logic
# 라이브러리에 option을 준다.
# OFF로 바꾸면 subdirectory를 빌드에서 추가하지 않게 되는 코드로 사용하고자 한다. 더 아래의 코드와 함께 사용해서 말이다.
option(USE_ADDER "A simple library for adding 2 floats." ON)

if(USE_ADDER)
    # 빌드할 라이브러리 지정. 하위폴더를 지정
    add_subdirectory(Adder)

    list(APPEND EXTRA_LIBS Adder)
    list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/Adder")
endif()

# 헤더 파일에도 이 버전에 대해서 인지시킨다.
# Input/Output 순서로 적는다.
configure_file(OLASConfig.h.in OLASConfig.h)

# 빌드해서 나올 것들. 프로젝트명을 실행파일 이름으로 한다. 빌드 대상은 main.cpp
add_executable(${PROJECT_NAME} main.cpp)

# 헤더파일을 input에서 output으로 만드는 데 필요한 경로를 입력한다.
# version number를 기록하는데 필요하다고 한다.
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})


# Download all the Submodules
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
    option(GIT_SUBMODULE "Check submodules during build" ON)
    if(GIT_SUBMODULE)
        message(STATUS "Submodule update")
        execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
                        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                        RESULT_VARIABLE GIT_SUBMOD_RESULT)
        if(NOT GIT_SUBMOD_RESULT EQUAL "0")
            message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}. please check...")
        endif()
    endif()
endif()

# Check all the Submodules
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/external/glfw/CMakeLists.txt")
    message(FATAL_ERROR "git submodules was not downloaded! GIT_SUBMODULE was turned off or failed. Please...")
endif()


add_subdirectory(external/glfw)

# 헤더파일을 추가하는 곳을 지정. #include "Adder/adder.h"라고 안적을 수 있다.
target_include_directories(${PROJECT_NAME} 
    PUBLIC external/glfw/include
    ${EXTRA_INCLUDES}
)

# 링크할 라이브러리를 찾는곳. 디렉토리를 빌드하기 위해 경로를 지정한다. 이때 경로는 build된 파일이 있는 경로. 즉, out/build 기준이다.
target_link_directories(${PROJECT_NAME}
    PRIVATE external/glfw/src
    ${EXTRA_LIBS}
)

# exe파일에 링크할 라이브러리
target_link_libraries(${PROJECT_NAME} adder glfw)

 

이 코드를 추가하고 나서는 컴파일 에러가 발생하게 되니 main.cpp에서 #include <adder.h>를 제거하자.

 

그리고 adder가 추가되느냐 마냐에 따라 main.cpp에서 사용되는 함수가 달라지기에 아래와 같이 수정한다.

 

#include <iostream>
// #include <adder.h>
#include <GLFW/glfw3.h>
#include <OLASConfig.h>

using namespace std;


int main(int argc, char * argv[]){
   cout << "Hello" << '\n';

   #ifdef USE_ADDER
      cout << add(72.1, 73.8) << '\n';
   #else
      cout << "adder.h is not included..." << '\n';
   #endif
   cout << argv[0] << "-Version" << OLAS_VERSION_MAJOR << "." << OLAS_VERSION_MINOR << '\n';

   // GLFWwindow *window;

   //  if( !glfwInit() )
   //  {
   //      fprintf( stderr, "Failed to initialize GLFW\n" );
   //      exit( EXIT_FAILURE );
   //  }

   // window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
   //  if (!window)
   //  {
   //      fprintf( stderr, "Failed to open GLFW window\n" );
   //      glfwTerminate();
   //      exit( EXIT_FAILURE );
   //  }

   //      // Main loop
   //  while( !glfwWindowShouldClose(window) )
   //  {
   //      // Swap buffers
   //      glfwSwapBuffers(window);
   //      glfwPollEvents();
   //  }

   //  // Terminate GLFW
   //  glfwTerminate();

   return 0;
}

 

차례로 다음 명령을 수행하면 다음과 같이 터미널에 나온다.

 

./configure.sh
./build.sh
./run.sh

 

결과창은 다음과 같다.

 

Hello
adder.h is included...145.9
./OLAS-Version1.0

 


 

 


 

adder.h를 안쓰려면 다음과 같이 명령을 실행하면 되겠다. 혹은 configure.sh를 다음과 같이 수정하자.

 

#! /bin/sh

cmake -DGLFW_BUILD_DOCS=OFF -DUSE_ADDER=OFF -S . -B out/build

 

위의 CMakeLists.txt는 그대로 쓰면 에러가 나므로 다음과 같이 수정해보자.

 

cmake_minimum_required(VERSION 3.21.1)

# 프로젝트명 : 실행파일 이름이 된다. 버전도 여기에 적을 수 있다.
project(OLAS VERSION 1.0)

# adder use logic
# 라이브러리에 option을 준다.
# OFF로 바꾸면 subdirectory를 빌드에서 추가하지 않게 되는 코드로 사용하고자 한다. 더 아래의 코드와 함께 사용해서 말이다.
option(USE_ADDER "A simple library for adding 2 floats." ON)

if(USE_ADDER)
    # 빌드할 라이브러리 지정. 하위폴더를 지정
    add_subdirectory(Adder)

    list(APPEND EXTRA_LIB_DIRS "Adder")
    list(APPEND EXTRA_INCLUDES_DIRS "Adder")
    list(APPEND EXTRA_LINKS adder)
endif()

# 헤더 파일에도 이 버전에 대해서 인지시킨다.
# Input/Output 순서로 적는다.
configure_file(OLASConfig.h.in OLASConfig.h)

# 빌드해서 나올 것들. 프로젝트명을 실행파일 이름으로 한다. 빌드 대상은 main.cpp
add_executable(${PROJECT_NAME} main.cpp)

# 헤더파일을 input에서 output으로 만드는 데 필요한 경로를 입력한다.
# version number를 기록하는데 필요하다고 한다.
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})


# Download all the Submodules
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
    option(GIT_SUBMODULE "Check submodules during build" ON)
    if(GIT_SUBMODULE)
        message(STATUS "Submodule update")
        execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
                        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                        RESULT_VARIABLE GIT_SUBMOD_RESULT)
        if(NOT GIT_SUBMOD_RESULT EQUAL "0")
            message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}. please check...")
        endif()
    endif()
endif()

# Check all the Submodules
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/external/glfw/CMakeLists.txt")
    message(FATAL_ERROR "git submodules was not downloaded! GIT_SUBMODULE was turned off or failed. Please...")
endif()


add_subdirectory(external/glfw)

# 헤더파일을 추가하는 곳을 지정. #include "Adder/adder.h"라고 안적을 수 있다.
target_include_directories(${PROJECT_NAME} 
    PUBLIC external/glfw/include
    ${EXTRA_INCLUDES_DIRS}
)

# 링크할 라이브러리를 찾는곳. 디렉토리를 빌드하기 위해 경로를 지정한다. 이때 경로는 build된 파일이 있는 경로. 즉, out/build 기준이다.
target_link_directories(${PROJECT_NAME}
    PRIVATE external/glfw/src
    ${EXTRA_LIB_DIRS}
)

# exe파일에 링크할 라이브러리
target_link_libraries(${PROJECT_NAME} ${EXTRA_LINKS} glfw)

 

다음 명령을 실행한다.

 

./configure.sh
./build.sh
./run.sh

 

결과창은 다음과 같다.

 

Hello
adder.h is not included...145.9
./OLAS-Version1.0

 

configure.sh 파일에서 -DUSE_ADDER=OFF를 ON으로 바꿔도 정상적으로 컴파일 되는 것을 알 수 있다.

 

#! /bin/sh

cmake -DGLFW_BUILD_DOCS=OFF -DUSE_ADDER=ON -S . -B out/build

 


 

 


공대생지식창고 오픈카톡방

https://open.kakao.com/o/swnAyLyc

 

공대생지식창고님의 오픈프로필

공대생에게 도움이 될만한 글을 씁니다. www.knowledgeforenginners.tistory.com

open.kakao.com

 

공대생지식창고 Github

engineerJPark (github.com)

 

engineerJPark - Overview

engineerJPark has 2 repositories available. Follow their code on GitHub.

github.com

 

 

반응형