Study: DeveloperTools(DevTool)/DevTool: CMake

[CMake] configure_file(): CMake λ³€μˆ˜κ°’μ„ μ†ŒμŠ€μ½”λ“œμ—μ„œ μ‚¬μš©!

DrawingProcess 2022. 7. 4. 15:46
λ°˜μ‘ν˜•
πŸ’‘ λ³Έ λ¬Έμ„œλŠ” 'CMake λ³€μˆ˜κ°’을 μ†ŒμŠ€μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” 방법'에 λŒ€ν•΄ 정리해놓은 κΈ€μž…λ‹ˆλ‹€.
configure_file을 톡해 CMake λ³€μˆ˜κ°’μ„ μ†ŒμŠ€μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ μ •λ¦¬ν•˜μ˜€μœΌλ‹ˆ μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

1. ν”„λ‘œμ νŠΈ ꡬ성

1.1 CMakeLists.txt 파일: configure_file μ‚¬μš©

CMakeLists.txtμ—μ„œ μ„€μ •ν•œ λ³€μˆ˜κ°’μ„ μ†ŒμŠ€νŒŒμΌμ—μ„œλ„ μ‚¬μš©ν•˜κΈ° μœ„ν•œ configure_file ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€!
μ°¨κ·Όμ°¨κ·Ό CMakeLists.txt을 μ™œ μ΄λ ‡κ²Œ μž‘μ„±ν–ˆλŠ”μ§€, μ†ŒμŠ€μ— λŒ€ν•΄ μ„€λͺ…ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. 

...
option(USING_NLOHMANNJSON "using nlohmann_json" ON)
option(USING_LEVELDB "using leveldb" ON)

# configure a header file to pass some of the CMake settings to the source code
configure_file(config.h.cmake ${PROJECT_BINARY_DIR}/include/config.h)

add_library(${PROJECT_NAME})
target_include_directories(${PROJECT_NAME}
  PUBLIC
    ${PROJECT_BINARY_DIR}/include
    ...
)
...

+ configure_file()

configure_file λͺ…λ Ήμ–΄λŠ” μ–΄λ– ν•œ νŒŒμΌμ„ λ‹€λ₯Έ μœ„μΉ˜μ— λ³΅μ‚¬ν•˜κ±°λ‚˜ CMake λ³€μˆ˜κ°’λ“€μ„ νŒŒμΌμ— μ“Έ 수 μžˆλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# configure a header file to pass some of the CMake settings
# to the source code
configure_file(config.h.cmake ${PROJECT_BINARY_DIR}/include/config.h)
  • 첫 번째 argumentλŠ” μ†ŒμŠ€κ°€ λ˜λŠ” 파일이며,
  • 두 번째 argumentλŠ” 결과물의 파일λͺ…μž…λ‹ˆλ‹€.
    (μ ˆλŒ€κ²½λ‘œκ°€ μ•„λ‹Œ 파일λͺ…λ§Œ μž…λ ₯ν•˜λ©΄, ν˜„μž¬ CMakeLists.txtκ°€ μ‘΄μž¬ν•˜λŠ” 경둜λ₯Ό κΈ°μ€€μœΌλ‘œ μƒλŒ€κ²½λ‘œλ‘œ μΈμ‹ν•˜κ²Œ λ©λ‹ˆλ‹€.)

1.2 config.h.cmake λ˜λŠ” config.h.in 파일 λ§Œλ“€κΈ°

생성할 ν—€λ”νŒŒμΌμ˜ 포맷이 λ˜λŠ” 파일인 config.h.cmakeμ΄λ‚˜ config.h.inλ₯Ό μ •μ˜ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. 참고둜, 두 νŒŒμΌμ€ ν™•μž₯자만 λ‹€λ₯Ό 뿐 λ™μΌν•œ μ†ŒμŠ€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€!

// the configured options and settings for Tutorial
#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@
  • define을 ν†΅ν•΄μ„œ Tutorial_VERSION_MAJOR와 Tutorial_VERSION_MINORλ₯Ό μ •μ˜ν•΄μ£ΌλŠ”λ° μ΄ κ°’은 CMakeμ—μ„œ μ •μ˜λœ λ²„μ „ λ³€μˆ˜λͺ…μœΌλ‘œ μ ‘κ·Όν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 
  • CMake λ³€μˆ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œ λ³€μˆ˜λͺ…μ˜ μ–‘ λμ„ '@'둜 κ°μ‹Έμ£Όλ©΄ λ˜λŠ”λ°, '@'둜 κ°μ‹Έμ£Όκ²Œ λ˜λ©΄ configure_file을 ν†΅ν•΄μ„œ νŒŒμΌμ΄ copy될 λ•Œ, ν•΄λ‹Ή λ³€μˆ˜μ˜ κ°’μœΌλ‘œ λŒ€μ²΄λ˜κ²Œ λ©λ‹ˆλ‹€.
    • λ”°λΌμ„œ, CMake λ‚΄μ—μ„œ optionμ΄λ‚˜ set으둜 λ³€μˆ˜λ₯Ό μ •μ˜ν•œ 후에 configure_file λͺ…λ Ήμ–΄λ₯Ό 톡해 μ„€μ • νŒŒμΌμ„ 생성해야 μƒμ„±λœ νŒŒμΌμ— λ°˜μ˜λ©λ‹ˆλ‹€!
    • option(USING_NLOHMANNJSON "using nlohmann_json" ON)
      option(USING_LEVELDB "using leveldb" ON)
      configure_file("config.h.cmake" ${PROJECT_BINARY_DIR}/include/piclUtilCfg.h)

2. ν”„λ‘œμ νŠΈ λΉŒλ“œ

cmake ..으둜 λΉŒλ“œνŒŒμΌμ„ μƒμ„±ν•˜λ©΄, ${PROJECT_BINARY_DIR}인 build 폴더 λ‚΄ include/piclUtilCfg.h파일이 생긴 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μƒμ„±λœ ν—€λ”νŒŒμΌ μ‚¬μš©ν•˜κΈ°

μ΄λ ‡κ²Œ μƒμ„±λœ ν—€λ”νŒŒμΌμ„ μš°λ¦¬κ°€ 생성할 μ‹€ν–‰νŒŒμΌ(즉, μ†ŒμŠ€μ½”λ“œ)μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄, 

  • add_library λͺ…λ Ήμ–΄λ₯Ό 톡해 라이브러리λ₯Ό λ§Œλ“€κ³ ,
  • target_include_directories λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•΄μ„œ include μ‹œμΌœμ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.
add_library(${PROJECT_NAME})
target_include_directories(${PROJECT_NAME}
  PUBLIC
    ${PROJECT_BINARY_DIR}/include
    ...
)

μ°Έκ³ 

λ°˜μ‘ν˜•