在自定义命令中调用找到的可执行文件的正确方法?

Chr*_*zon 6 cmake

我可以说,我的计算机上有一个程序 C:/Tools/generate_v23_debug.exe

我有一个FindGenerate.cmake文件,它允许CMake找到可执行文件的确切路径.

所以在我的CMake代码中,我这样做:

find_program(Generate)
if (NOT Generate_FOUND)
    message(FATAL_ERROR "Generator not found!")
Run Code Online (Sandbox Code Playgroud)

所以CMake找到了可执行文件.现在我想在自定义命令语句中调用此程序.我应该使用COMMAND GeneratorCOMMAND ${GENERATOR_EXECUTABLE}?这两个都会做同样的事情吗?一个比另一个更受欢迎吗?name_EXECUTABLE是CMake将定义的变量(它不在FindGenerate.cmake文件中),还是特定于我正在查看的其他人的示例代码?会COMMAND Generator扩展到正确的道路吗?

add_custom_command(
    OUTPUT blahblah.txt
    COMMAND Generator inputfile1.log
    DEPENDS Generator
)
Run Code Online (Sandbox Code Playgroud)

Com*_*sMS 17

find_program将其结果存储到作为第一个参数给出的变量中.您可以通过插入一些调试输出来验证这一点:

find_program(GENERATOR Generate)
message(${GENERATOR})
Run Code Online (Sandbox Code Playgroud)

请注意,find_program没有设置超出任何其他变量.特别是,您提到Generate_FOUNDGENERATOR_EXECUTABLE在您的问题中,这些都没有被find_program调用隐含地引入.

程序中的第二个错误是使用了该DEPENDS选项add_custom_command.DEPENDS用于在构建时建模目标间依赖关系,而不是在CMakeLists中操纵控制流.例如,可以DEPEND在命令(blahblah.txt)的输出上添加其他自定义命令,但自定义命令不能DEPEND对先前的查找操作的结果.

一个工作示例可能如下所示:

find_program(GENERATOR Generate)
if(NOT GENERATOR)
    message(FATAL_ERROR "Generator not found!")
endif()

add_custom_command(
    OUTPUT blahblah.txt
    COMMAND ${GENERATOR} inputfile1.log
)
Run Code Online (Sandbox Code Playgroud)

PS:您问为什么代码示例在您的问题中没有正确格式化.您正确缩进了所有内容,但在普通文本和代码段落之间需要一个额外的换行符.我相应地编辑了你的问题.