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

时间:2013-12-14 00:01:23

标签: cmake

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

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

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

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

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

add_custom_command(
    OUTPUT blahblah.txt
    COMMAND Generator inputfile1.log
    DEPENDS Generator
)

1 个答案:

答案 0 :(得分:15)

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

find_program(GENERATOR Generate)
message(${GENERATOR})

请注意,find_program 设置除此之外的任何其他变量。特别是,您在问题中提到了Generate_FOUNDGENERATOR_EXECUTABLEfind_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
)

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