반응형
소제목
이번에는 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
공대생지식창고 Github
반응형
'Programming Tools > CMake' 카테고리의 다른 글
[CMake] Git Submodules/external library(서브모듈, 외부 라이브러리)를 이용하기 (0) | 2021.09.06 |
---|---|
[CMake] Versioning the Source Code : CMakeLists를 통해 소스코드 버전명 만들기 (0) | 2021.09.06 |
[CMake] 여러 개의 파일로 빌드하기 (0) | 2021.09.02 |
[CMake] Makefile과 CMake (0) | 2021.08.31 |
[CMake] Makefile과 CMake 학습 자료 정리 (0) | 2021.08.26 |