cmake 我可以使用add_custom_command(... PRE_BUILD ...)来为该目标生成源代码?

uqjltbpv  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(143)

在构建测试二进制文件之前,我想在cmake中设置一个自定义命令来生成一些文件(.h),这些文件将在编译期间使用。
我的第一次尝试是将自定义命令添加到PRE_BUILD目标:

add_executable(mytest ${SRCS})

add_custom_command(
   TARGET mytest PRE_BUILD
   COMMAND <generate my_file.h>
   BYPRODUCTS my_file.h
)

target_sources(mytest PRIVATE my_file.h)

但是当我尝试构建mytest时,impl文件(my_file.cpp)报告说找不到my_file.h

[ 97%] Building CXX object CMakeFiles/my_test.cpp.o
/usr/redacted/project/my_test.cpp:4:10: fatal error: 'my_test.h' file not found
#include "my_test.h"
         ^~~~~~~~~~~
1 error generated.

因此,我尝试从${SRCS}中移动impl文件,并在添加生成的文件后显式添加它:

#same as above

target_sources(mytest PRIVATE my_file.h)
target_sources(mytest PRIVATE my_file.cpp)

但似乎也不管用。
我有cmake_minimum_required(VERSION 3.8)与3.25.1安装。

niknxzdl

niknxzdl1#

我可以使用add_custom_command(... PRE_BUILD...)来为该目标生成源代码?
不你不能。请参阅PRE_BUILD的文档,其中指出:
在Visual Studio生成器上,在目标中执行任何其他规则之前运行。在其他生成器上,在PRE_LINK命令之前运行。
也就是说,该命令不会在编译源代码之前运行,因为你需要它,因为你正在生成一个头,大概你想在这些源代码中#include。这同样适用于需要编译的非头文件。
你可以做的是使用add_custom_command的另一个签名生成头文件/源文件:“生成文件”签名(而不是“构建事件”签名)。前

add_executable(mytest ${SRCS})
add_custom_command(
   OUTPUT my_file.h
   COMMAND <generate my_file.h>
   # any other arguments as necessary, Ex. DEPENDS
   VERBATIM
)
target_sources(mytest PRIVATE my_file.h)

当您这样做时,CMake将注意到输出文件被用作另一个目标的源文件,并生成一个buildsystem,该buildsystem确保在构建该目标之前生成输出文件,并且如果输出文件更改,则按顺序重新构建两者(例如:如果DEPENDS参数中的任何文件发生更改,它将生成一个buildsystem来更新输出文件)。
其他方法可能包括(如果适用)使用file(GENERATE ...)configure_file(...)
另请参阅克雷格Scott(CMake维护者之一)关于here主题的帖子。

相关问题