Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cmake:与添加\自定义\命令依赖项斗争_Cmake - Fatal编程技术网

cmake:与添加\自定义\命令依赖项斗争

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_命令生成的文件作为另一个目录中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} 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,如下所示:

  • 在生成bc文件的第一个目录中

    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,是否有关于此问题的报告?我同意。“总是被建造”这个词并不是字面上的真实。