【问题标题】:Ninja Make system not accepting GENERATED commandNinja Make 系统不接受 GENERATED 命令
【发布时间】:2023-03-31 16:53:02
【问题描述】:

我有一组汇编文件,应该由特殊的编译器编译。在此之后,它应该被添加到我在CMAKE_C_COMPILER 中设置的编译器创建的库中。它在 Mingw Makefile 系统上运行良好,但与 Ninja Make 不兼容。

下面是cmakelists.txt中的代码

add_custom_target(
  special_asm
  COMMAND
    ${SPECIAL_ASM} ${src_file1}
    -I${INCLUDE_PATH} -o file1.o
  COMMAND
    ${SPECIAL_ASM} ${src_file2}
    -I${INCLUDE_PATH} -o file2.o
)
add_custom_target(special_asm_cmd COMMAND cmd.exe special_asm*.bat)
    
add_dependencies(special_asm_cmd special_asm)

add_library(
  mylib STATIC
  file1.o
  file2.o
  ${mylib_src})

add_dependencies(mylib  special_asm_cmd)

set_source_files_properties(
  file1.o
  file2.o
  PROPERTIES EXTERNAL_OBJECT true GENERATED true)

file1.o 和file2.o 是由不同的汇编程序生成的。我也为这些文件设置了属性。

问题 1: 自定义目标 special_asm 不直接生成目标文件。它正在生成一个批处理脚本。这就是为什么我创建了另一个名为 special_asm_cmd 的自定义目标来运行将生成目标文件的批处理脚本。 Mingw make 系统直接从 special_asm 生成目标文件,但 Ninja 没有这样做。

问题 2 我为特殊生成的目标文件设置了属性 GENERATED true。但是忍者给出了以下错误。但是Mingw Make能够解决依赖并且没有错误

ninja: error: '<path>/spt_init.o', needed by '<path>/libmylib.a', missing and no known rule to make it

【问题讨论】:

  • Makefile生成器不同,知道“库mylib应该在自定义目标special_asm之后构建”就足够了,忍者需要知道谁(哪个目标)准确生成文件 file1.o,这是mylib 所需要的。在 CMake 中,通过add_custom_commandOUTPUT 选项搜索文件的生产者。该命令的文档包含在add_library 中使用生成文件的examples
  • 它有效.. 谢谢@Tsyvarev

标签: cmake ninja cmake-language cmakelists-options


【解决方案1】:

在这里使用 GENERATED 毫无意义 - 当你告诉他你如何生成文件时,cmake 会知道它。

add_custom_command(
  # Put generated files in binary dir, where they belong
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/file1.o
  # Enumerate all dependencies.
  DEPENDS
      ${src_file1}
      ${INCLUDE_PATH}/header1.h ${INCLUDE_PATH}/header2.h etc..
  COMMAND
      ${SPECIAL_ASM} ${src_file1} -I${INCLUDE_PATH} 
      -o ${CMAKE_CURRENT_BINARY_DIR}/file1.o
)
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/file2.o
  DEPENDS
    ${src_file2}
    ${INCLUDE_PATH}/header1.h ${INCLUDE_PATH}/header2.h etc..
  COMMAND
    ${SPECIAL_ASM} ${src_file2}
    -I${INCLUDE_PATH}
    -o ${CMAKE_CURRENT_BINARY_DIR}/file2.o
)
add_custom_target(special_asm_cmd 
     # Enumerate the dependencies.
     DEPENDS 
         ${CMAKE_CURRENT_BINARY_DIR}/file2.o
         ${CMAKE_CURRENT_BINARY_DIR}/file1.o
     # Glob in add_custom target? Use glob with `file(GLOB ...`
     COMMAND cmd.exe special_asm*.bat
)

add_library(mylib STATIC
   ${CMAKE_CURRENT_BINARY_DIR}/file2.o
   ${CMAKE_CURRENT_BINARY_DIR}/file1.o
   ${mylib_src}
)

Cmake 是一个构建系统,专门设计用于了解什么来自什么。文件来自其他文件和命令。告诉 cmake 哪些文件来自哪些命令和哪些源文件 - cmake 将管理依赖关系并完成所有其他工作,例如并行化工作和适当的依赖关系跟踪。

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多