我正在将基于GNU Autotools的构建配置移植到CMake,我必须处理C预处理以生成文件.
预处理器的输入是使用C预处理程序指令的sql文件,如#include“another.sql”等.
目前,Makefile使用以下规则生成纯sql文件作为输出:
myfile.sql: myfile.sql.in.c cpp -I../common $< | grep -v '^#' > $@
因此,myfile.sql意味着是构建过程的产品之一,类似于共享库或可执行文件.
我应该用什么CMake工具来达到同样的效果?
我不清楚我是否应该使用add_custom_command,add_custom_target或两者结合使用.
显然,我正在寻找一种可移植的解决方案,至少可以使用GNU GCC和Visual Studio工具集.我认为我必须定义特定于平台的自定义命令,一个用于cpp预处理器,一个用于cl.exe / P.
或者,CMake是否为C预处理器提供任何类型的抽象?
我扫描了档案,但我只发现了基于make功能的fortran文件或解决方案的预处理:make myfile.i
所以,这并不是我想要的.
更新:Added answer基于solution received from Petr Kmoch在CMake邮件列表上.
解决方法
add_library(sql_cpp_target EXCLUDE_FROM_ALL myfile.sql.in.c)
现在运行make myfile.sql.in.c.i将使用定义的CMAKE_C_FLAGS为您生成预处理源.可以更改预处理文件的输出名称和目录.
无论如何,你需要将这些make调用包装到add_custom_target(ALL …)中,以使CMake在构建期间运行它们.
在目标定义中使用CMAKE_MAKE_PROGRAM变量.
如果要从构建工具中抽象出来,可以调用cmake本身来为您构建目标.定义自定义目标时,请使用${CMAKE_COMMAND} –build ${CMAKE_BINARY_DIR} –target targetname.
或者,您可以只运行指定编译器的add_custom_command()来预处理文件并将它们放在适当的位置.但这似乎不太灵活,IMO.