상세 컨텐츠

본문 제목

[CMAKE] include_directories() / install()

cmake

by 빨간눈동자 2021. 11. 2. 23: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})

# 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 에서 언급한 파일들이 잘 포함되어 있다. 

 

 

반응형

관련글 더보기