Ninja Make 系统不接受 GENERATED 命令
Ninja Make system not accepting GENERATED command
我有一组汇编文件,需要用专门的编译器编译。在此之后,它应该被添加到由我在 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
在这里使用 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 将管理依赖关系并完成所有其他工作,例如并行化工作和适当的依赖关系跟踪。
我有一组汇编文件,需要用专门的编译器编译。在此之后,它应该被添加到由我在 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
在这里使用 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 将管理依赖关系并完成所有其他工作,例如并行化工作和适当的依赖关系跟踪。