# 파일 : 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})
# add the install targets
install (TARGETS Tutorial DESTINATION ${PROJECT_SOURCE_DIR}/bin)
install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION ${PROJECT_SOURCE_DIR}/include)
include_directories( 디렉토리 ) : 선언 이후에 빌드되는 target에 해당 경로를 include하여 빌드하도록 함.
install() : 지정한 파일을 특정 경로로 복사하는 역할을 수행
ex. install(TARGETS Tutorial DESTINATION ${PROJECT_SOURCE_DIR}/bin)
-> target(Tutorial)을 특정 경로(${PROJECT_SOURCE_DIR}/bin)에 복사한다.
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h DESTINATION ${PROJECT_SOURCE_DIR}/include)
-> file (TutorialConfig.h) 을 특정 경로(${PROJECT_SOURCE_DIR}/include)에 복사한다
// 파일 : 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;
}
~
# 파일 : MathFunctions/CMakeLists.txt
add_library(MathFunctions mysqrt.cxx)
install (TARGETS MathFunctions DESTINATION ${PROJECT_SOURCE_DIR}/bin)
install (FILES MathFunctions.h DESTINATION ${PROJECT_SOURCE_DIR}/include)
install() : 지정한 파일을 특정 경로로 복사하는 역할을 수행
ex. install (TARGETS MathFunctions DESTINATION ${PROJECT_SOURCE_DIR}/bin)
-> target(MathFunctions)을 특정 경로(${PROJECT_SOURCE_DIR}/bin)에 복사한다.
install (FILES MathFunctions.h DESTINATION ${PROJECT_SOURCE_DIR}/include)
-> file (MathFunctions.h) 을 특정 경로(${PROJECT_SOURCE_DIR}/include)에 복사한다
// 파일 : MathFunctions/MathFunctions.h
double mysqrt(double x);
// 파일 : MathFunctions/mysqrt.txt
#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;
}
cmake를 통해 빌드 및 실행을 해보자.
-D 옵션 없이 "cmake . -B build" 로 cmake를 실행하였지만, USE_MYMATH define이 선언되었다. 이유는 option() 시, 마지막 인자를 ON으로 넘겼기 때문이다.
make install 명령을 통해 CMakeLists.txt 에 선언한 install() 함수를 실행해보자.
아래와 같이 bin 디렉토리와 include 디렉토리가 생성되었으며, install 에서 언급한 파일들이 잘 포함되어 있다.
[CMAKE] file() (0) | 2021.11.03 |
---|---|
[CMAKE] add_custom_command() (0) | 2021.11.03 |
[CMAKE] option() / add_subdirectory() / target_link_libraries() / add_library() (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 |