我最初在 CMake 上问过这个问题邮件列表:How to configure target or command to preprocess C file?
我正在移植基于 GNU Autotools 的构建配置到 CMake,我必须处理 C 预处理以生成文件。
预处理器的输入是 SQL 文件与 C 预处理器 使用的指令,如 #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 邮件列表中。
最佳答案
利用 CMake' make myfile.i
功能,你可以这样做:
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。
关于sql - 如何配置 CMake 目标或命令来预处理 C 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383314/