이번 예제의 구조는 아래와 같다.
# 파일 : CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
# The version number.
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
# should we use our own math functions
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
include_directories ("${PROJECT_BINARY_DIR}")
# add the MathFunctions library?
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif ()
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial ${EXTRA_LIBS})
option() : 빌드 시, 전처리 명령을 통해 build configuration을 변경할 수 있다. ( ex. USE_MYMATH 선언하고 빌드 )
빌드 시,
add_subdirectory( 디렉토리 ) : 해당 디렉토리를 빌드에 포함한다.
target_link_libraries(target library) : target을 빌드할 때 library를 포함하도록 한다.
// 파일 : TutorialConfig.h.in
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
#cmakedefine USE_MYMATH
// 파일 : tutorial.cxx
// A simple program that computes the square root of a number
#include "TutorialConfig.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef USE_MYMATH
# include "MathFunctions.h"
#endif
int main(int argc, char* argv[])
{
if (argc < 2) {
fprintf(stdout, "%s Version %d.%d\n", argv[0], Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout, "Usage: %s number\n", argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = 0;
if (inputValue >= 0) {
#ifdef USE_MYMATH
outputValue = mysqrt(inputValue);
#else
outputValue = sqrt(inputValue);
#endif
}
fprintf(stdout, "The square root of %g is %g\n", inputValue, outputValue);
return 0;
}
# 파일 : MathFuctions/CMakeLists.txt
add_library(MathFunctions mysqrt.cxx)
add_library(target files) : files를 사용하여 target library를 생성한다.
mysqrt.cxx file을 사용하여 MathFunctions library를 생성한다.
// 파일 : MathFunctions/MathFunctions.h
double mysqrt(double x);
// 파일 : MathFunctions/mysqrt.cxx
#include "MathFunctions.h"
#include <stdio.h>
// a hack square root calculation using simple operations
double mysqrt(double x)
{
if (x <= 0) {
return 0;
}
double result;
double delta;
result = x;
// do ten iterations
int i;
for (i = 0; i < 10; ++i) {
if (result <= 0) {
result = 0.1;
}
delta = x - (result * result);
result = result + 0.5 * delta / result;
fprintf(stdout, "Computing sqrt of %g to be %g\n", x, result);
}
return result;
}
CMakeLists.txt에 option()을 사용하면 아래와 같이 빌드 타임에 define할 수 있다.
cmake . -B build -DUSE_MYMATH=on
define이 잘 먹었는지 눈으로 확인하기 위해서 tutorial.cxx 파일에 아래와 같이 변경하여 실행해보자.
ifdef USE_MYMATH
printf("use myqsrt()\n"); <------------ 추가
outputValue = mysqrt(inputValue);
else
printf("use sqrt()\n"); <------------ 추가
outputValue = sqrt(inputValue);
#endif
맨 위에 "use mysqrt()" 문구를 확인할 수 있다. ( 오타... ^^)
이번엔 아래 명령으로 빌드해보자.
cmake . -B build -DUSE_MYMATH=off
"use sqrt()" 문구를 확인할 수 있다.
[CMAKE] file() (0) | 2021.11.03 |
---|---|
[CMAKE] add_custom_command() (0) | 2021.11.03 |
[CMAKE] include_directories() / install() (0) | 2021.11.02 |
[CMAKE] set() / configure_file() / include_directories() (0) | 2021.11.02 |
[CMAKE] cmake_minimum_required() / project() / add_executable() (0) | 2021.10.25 |