在构建测试二进制文件之前,我想在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安装。
1条答案
按热度按时间niknxzdl1#
我可以使用add_custom_command(... PRE_BUILD...)来为该目标生成源代码?
不你不能。请参阅
PRE_BUILD
的文档,其中指出:在Visual Studio生成器上,在目标中执行任何其他规则之前运行。在其他生成器上,在
PRE_LINK
命令之前运行。也就是说,该命令不会在编译源代码之前运行,因为你需要它,因为你正在生成一个头,大概你想在这些源代码中
#include
。这同样适用于需要编译的非头文件。你可以做的是使用
add_custom_command
的另一个签名生成头文件/源文件:“生成文件”签名(而不是“构建事件”签名)。前当您这样做时,CMake将注意到输出文件被用作另一个目标的源文件,并生成一个buildsystem,该buildsystem确保在构建该目标之前生成输出文件,并且如果输出文件更改,则按顺序重新构建两者(例如:如果
DEPENDS
参数中的任何文件发生更改,它将生成一个buildsystem来更新输出文件)。其他方法可能包括(如果适用)使用
file(GENERATE ...)
或configure_file(...)
。另请参阅克雷格Scott(CMake维护者之一)关于here主题的帖子。