在CMake中,有提供 configure_file() 指令來產生 Object-like Macros的功能,常用來標示該軟體的版本號,就像機器學習中常用的GPU加速庫 (cuDNN)一樣,在/usr/local/cuda/include/cudnn.h 中,定義了該庫的版本號。
$ sudo cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A2
定義:將文件複製到另一個位置並修改其內容。
這次複製version.h.in這個檔案,並在build資料夾中生成version.h,用於產生版本號的 # define
# CMakeLists.txt
configure_file(<input> <output>)
input : 輸入檔名,通常為 <filename>.h.in
output : 輸出檔名,預設輸出位置在 ${PROJECT_BINARY_DIR}
// <filename>.h.in
#define VAR ${VAR}
// 將CMakeLists.txt中名為VAR的變數替換${VAR}
$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day18
1. 編輯 CMakeLists.txt
configure_file(version.h.in version.h)
# 將version.h.in輸出成version.h
target_include_directories(main PUBLIC "${PROJECT_BINARY_DIR}")
# 將PROJECT_BINARY_DIR加入main的include路徑,使main可以include到 build/version.h
2. 編輯 version.h.in
#define cmake_totorial_VERSION_MAJOR ${cmake_totorial_VERSION_MAJOR}
#define cmake_totorial_VERSION_MINOR ${cmake_totorial_VERSION_MINOR}
#define cmake_totorial_VERSION_PATCH ${cmake_totorial_VERSION_PATCH}
3. 編輯 src/main.cpp
如果不輸入引數的話就印出版本號
// A simple program that computes the square root of a number
#include <iostream>
#include "mysqrt.h"
#include "version.h" // <------- 要記得引入生成的 build/version.h ⭐
int main(int argc, char* argv[])
{
if (argc < 2) {
// report version
std::cout << argv[0] << " Version " << cmake_totorial_VERSION_MAJOR << "."
<< cmake_totorial_VERSION_MINOR << "."
<< cmake_totorial_VERSION_PATCH << std::endl;
return 1;
}
// convert input to double
const double inputValue = std::stod(argv[1]);
const double outputValue = sqrt(inputValue);
std::cout << "The square root of " << inputValue << " is " << outputValue
<< std::endl;
return 0;
}
4. 編譯與安裝
$ cmake ..
$ make
$ sudo make install
5. 檢查生成的version.h
$ cat version.h
可以發現,version.h.in中的變數 ${VAR} 被替換成CMakeLists.txt中的變數了
${cmake_totorial_VERSION_MAJOR} ---> 1
${cmake_totorial_VERSION_MINOR} ---> 0
${cmake_totorial_VERSION_PATCH} ---> 0
kai@esoc:~/2023_iT_CMake/Day18/build$ cat version.h
#define cmake_totorial_VERSION_MAJOR 1
#define cmake_totorial_VERSION_MINOR 0
#define cmake_totorial_VERSION_PATCH 0
6. 執行主程式,看看印出的版本號
$ ./main
kai@esoc:~/2023_iT_CMake/Day18/build$ ./main
./main Version 1.0.0