cmake:与添加\自定义\命令依赖项斗争
我试图将一个目录中的add_custom_命令生成的文件作为另一个目录中add_custom_命令的依赖项 在第一个目录(lib/core)中,我有一个build命令,如下所示:cmake:与添加\自定义\命令依赖项斗争,cmake,Cmake,我试图将一个目录中的add_custom_命令生成的文件作为另一个目录中add_custom_命令的依赖项 在第一个目录(lib/core)中,我有一个build命令,如下所示: add_custom_command( OUTPUT libcore.bc COMMAND tartln -filetype=bc -link-as-library -o libcore.bc ${STDLIB_BC_FILES} DEPENDS ${STDLIB_BC_FILES} tartl
add_custom_command(
OUTPUT libcore.bc
COMMAND tartln -filetype=bc -link-as-library -o libcore.bc ${STDLIB_BC_FILES}
DEPENDS ${STDLIB_BC_FILES} tartln
COMMENT "Linking libcore.bc")
source file -> .bc (via add_custom_command)
.bc -> .obj (via add_custom_command)
.obj -> .exe (via add_executable)
在第二个目录中,我有一个使用该命令输出的命令:
add_custom_command(OUTPUT ${OBJ_FILE}
COMMAND tartln -disable-fp-elim -filetype=obj -o ${OBJ_FILE} ${BC_FILE}
"${PROJECT_BINARY_DIR}/lib/core/libcore.bc"
MAIN_DEPENDENCY "${BC_FILE}"
DEPENDS "${PROJECT_BINARY_DIR}/lib/core/libcore.bc"
COMMENT "Linking Tart bitcode file ${BC_FILE}")
但是,当我尝试构建时,会出现以下错误:
make[3]: *** No rule to make target `lib/core/libcore.bc', needed by `test/stdlib/ReflectionTest.o'. Stop.
我看到的一件奇怪的事情是,错误消息中的路径是相对路径,而不是绝对路径,尽管我知道${PROJECT\u BINARY\u DIR}是一个完整、正确的路径。我不知道这是一个问题还是一个奇怪的品牌
我还尝试在lib/core目录中为libcore库创建顶级目标:
add_custom_target(libcore DEPENDS libcore.bc libcore.deps)
set_source_files_properties(${PROJECT_BINARY_DIR}/lib/core/libcore.bc PROPERTIES GENERATED TRUE)
然后在DEPENDS子句中使用它。奇怪的是,它在您第一次执行干净的构建时就可以工作,但在任何后续构建中都会出现错误。在任何情况下,我的理解是DEPENDS只适用于文件依赖项,所以这似乎不是正确的解决方案。(那么,如何拥有依赖于顶级目标的自定义命令?)
我也尝试过将绝对路径放在任何地方,但没有效果。cmake文档对DEPENDS参数做了如下说明: DEPENDS选项指定命令所依赖的文件。如果 任何依赖项都是同一系统中另一个自定义命令的输出 目录(CMakeLists.txt文件)CMake会自动将另一个 将自定义命令导入生成此命令的目标。如果 DEPENDS指定任何目标(由ADD_*命令创建)a 创建目标级依赖项以确保生成目标 在使用此自定义命令的任何目标之前 因此,我认为您必须使用add_custom_target定义一个目标,并依赖于此 add_custom_target的文档说明: 与DEPENDS参数一起列出的依赖项 可以引用使用创建的自定义命令的文件和输出 在同一目录(CMakeLists.txt文件)中添加_custom_command() 因此,您必须使用add_custom_命令和add_custom_target,如下所示:
add_custom_命令(OUTPUT libcore.bc…)#与您的问题一样
添加自定义目标(LibCoreBC依赖于libcore.bc)
add_custom_命令(OUT${OBJ_FILE}取决于LibCoreBC….)
我认为
add\u custom\u target
无法满足我的需求。根据cmake文档,由add_custom_target创建的自定义目标始终被认为是过时的,并且始终是构建的
问题是,我试图从一个add_custom_命令
获取输出,并将其输入到另一个add_custom_命令
的不同目录中。我只希望在原始源文件过期的情况下发生这种情况-如果我使用了add\u custom\u target
,则即使源文件没有更改,也会始终重建输出。考虑到这些源文件有数百个,这将使构建非常缓慢
下面是我试图做的:我有一个程序,在给定源文件的情况下生成一个.bc文件(LLVM位代码)。有很多这样的源文件,它们创建了很多.bc文件
第二个程序将所有的.bc文件转换为一个.obj(ELF对象)文件。因此,转换步骤如下所示:
add_custom_command(
OUTPUT libcore.bc
COMMAND tartln -filetype=bc -link-as-library -o libcore.bc ${STDLIB_BC_FILES}
DEPENDS ${STDLIB_BC_FILES} tartln
COMMENT "Linking libcore.bc")
source file -> .bc (via add_custom_command)
.bc -> .obj (via add_custom_command)
.obj -> .exe (via add_executable)
原始源代码文件位于不同的目录中,因为它们是类库-我不想把每个类库的所有代码都放在同一个目录中。这不是答案,而是对上面一个问题的澄清 根据cmake文档,由
add\u custom\u target
创建的自定义目标始终被认为是过时的,并且始终是构建的
在国际海事组织,cmake文件应改为:
由add_custom_target创建的自定义目标始终被认为是过时的,并且总是生成的,,但只有在请求时才生成
这意味着,如果您的所有目标都标记为
EXCLUDE\u FROM\u all
,并且您有创建新目标的add\u custom\u target
命令,并且您在没有指定目标的情况下从命令行键入make
,则使用add\u custom\u target
添加的目标是未构建的。但是,如果您在make
命令行中明确地解释了它们,那么它们就是构建的。另外,还有ALL
关键字,您可以指定给add\u custom\u target
以强制将这些关键字作为ALL规则的一部分进行构建,我认为这意味着在执行make
时不带参数。尝试将以下命令添加到第二个目录中:
add_custom_target(libcore DEPENDS libcore.bc libcore.deps)
set_source_files_properties(${PROJECT_BINARY_DIR}/lib/core/libcore.bc PROPERTIES GENERATED TRUE)
我用这个命令解决了我的问题。
相关链接:不幸的是,此解决方案不起作用。(我意识到在将近一年后回复可能是没有希望的。)据我所知,add_custom_命令的DEPENDS参数必须是文件级依赖项-尽管文档说在同一目录中的目标级依赖项可以工作,但事实上我在过去11个月里尝试了许多不同的排列,它们都不起作用。也就是说,如果我在同一个目录中定义自定义目标“foo”,然后说dependens“foo”,它将简单地报告“没有规则使目标“foo”…”@Talin,那么这似乎是一个bug,是否有关于此问题的报告?我同意。“总是被建造”这个词并不是字面上的真实。