상세 컨텐츠

본문 제목

[CMAKE] option() / add_subdirectory() / target_link_libraries() / add_library()

cmake

by 빨간눈동자 2021. 11. 2. 20:00

본문

반응형

이번 예제의 구조는 아래와 같다. 

 

 

# 파일 : 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()" 문구를 확인할 수 있다. 

반응형

관련글 더보기