0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
cmake version: 3.10.2
系统版本:Ubuntu 18.04.4 LTS \n \l
最后更新:2021-11-15
0x01 configure_file指令说明
在一些情况下,我们需要在我们的项目中标注项目版本号、增加编译选项等信息,我们可以在项目程序中直接通过手动编写我们的项目信息然后编译打印,也可以通过CMakeLists.txt
文件的configure_file
指令,将这些信息设置为变量,再写入.h.in
文件并通过cmake编译生成.h
文件,再将该.h
文件包含进项目代码中,编译到可执行文件或库文件,从而实现项目信息打印等,这样的好处是可以只通过改CMakeLists.txt
文件就能变更项目信息。
例如在CMakeLists.txt
文件中定义了项目版本变量:
set(Version 1.0)
configure_file(src/build.h.in ${CMAKE_BINARY_DIR}/generated/build.h)
build.h.in
文件中:
#define Project_Version @Version@
通过cmake
编译后生成build.h
文件,变量名称替换成了变量值:
#define Project_Version 1
configure_file
configure_file
功能如下:
将<input>
文件里的内容全部复制到<output>
文件中,并根据输入规则,复制时将<input>
文件中变量,替换成@VAR@
或${VAR}
的变量值,若变量未被定义则替换为空字符串。
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
< input>
:输入文件,默认路径是在 CMAKE_CURRENT_SOURCE_DIR
路径下的寻找该文件;输入文件必须是文件而不是文件夹。通常情况下输入文件以.h.in
为后缀。
< output >
:输出的文件;默认路径为输出到CMAKE_CURRENT_BINARY_DIR
路径下,若输出路径中文件已存在则替换。通常情况下输出文件以.h
为后缀。
COPYONLY
:只复制文件并不进行任何变量替换,在这个选项若指定了NEWLINE_STYLE
选项时则无效。
ESCAPE_QUOTES
:躲过任何的反斜杠风格的转义(C风格)。
@ONLY
:堆变量替换进行限制,只对@VAR@
引用变量进行替换而不对${VAR}
进行替换。这在配置${VAR}
语法的脚本时是非常有用的。
NEWLINE_STYLE <style>
:指定输出文件中的新行格式。UNIX和LF的新行是\n,DOS和WIN32和CRLF的新行格式是\r\n。这个选项在指定了COPYONLY选项时无效。
0x02 程序实例
程序实例源代码github地址:
https://github.com/fyw4/CSDN-Blog-Code/tree/master/CMake/configure_file
文件目录结构如下:
CMakeLists.txt
文件内容:
cmake_minimum_required(VERSION 3.5)
project(TEST)
message(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
message(STATUS "PROJECT_BINARY_DIR " ${PROJECT_BINARY_DIR})
set(VERSION_MAJOR 1)
set(VERSION_MINOR 0)
set(PROJECT_NAME TEST)
configure_file (
"${PROJECT_SOURCE_DIR}/build.h.in"
"${PROJECT_BINARY_DIR}/build.h"
)
aux_source_directory(. DIR_SRCS)
add_executable(${PROJECT_NAME} ${DIR_SRCS})
build.h.in
文件内容:
#ifndef _BUILD_H_IN
#define _BUILD_H_IN
#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@
#define PROJECT_NAME "${PROJECT_NAME}"
#endif
主程序main.cpp:
#include "build.h"
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
cout << "version is " << VERSION_MAJOR << ", " << VERSION_MINOR << endl;
cout << "project name is " << PROJECT_NAME << endl;
return 0;
}
make.sh为:
#!/bin/sh
# 删除一些产生的文件
rm -rf CMakeFiles
rm Makefile
rm build.h
rm TEST
rm CMakeCache.txt
rm cmake_install.cmake
cmake ./
make
./TEST
运行结果:
以上。
参考文档:
1.https://cmake.org/cmake/help/v3.14/command/configure_file.html?highlight=cmakedefine
2.https://blog.csdn.net/qq_38410730/article/details/103741579
3.https://www.cnblogs.com/gaox97329498/p/10952732.html