使用CMake运行bash命令

25

我试图让CMake运行三个Bash命令或一个Bash脚本。然而,我似乎无法使其工作。

Bash命令如下:

    cd ${CMAKE_SOURCE_DIR}/dependencies/library
    make
    cd ${CMAKE_BINARY_DIR}

如果该目录中不存在库文件,我希望CMake能够在该目录中构建库文件。

以下是我尝试的CMake代码:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o")
   execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library)
   execute_process(COMMAND make)
   execute_process(COMMAND cd ${CMAKE_BINARY_DIR})
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o")

然而,它并没有构建任何东西。我做错了什么?

同样,在这里问一下:第三个命令,移动到二进制文件夹中,是否应该包括?

谢谢!


3
首先,为什么您不使用WORKING_DIRECTORY参数来代替那些cd命令呢?类似于execute_process(COMMAND make WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/dependencies/library)的方式。我猜测,execute_process()调用并不共享相同的环境变量。 此外,如果我是您,我会查看add_custom_target()add_custom_command()这两个函数,来完成这种任务。 - Kamiccolo
1
我不能评论@Kamiccolo所说的大部分内容,但我可以说我认为execute_process不共享状态的细节几乎肯定是准确的。第一个命令中的cd很可能只为该进程更改目录,而不会影响其他进程。 - Etan Reisner
2
如果您打算构建第三方库,最好使用ExternalProject模块。 - sakra
你有没有检查过:https://dev59.com/JZffa4cB1Zd3GeqP-Jdy? - malat
1个回答

35

execute_process() 命令在配置时执行。但您希望在构建时运行此命令,因此您需要使用add_custom_command()add_custom_target() 命令。

在这种特殊情况下,您想要生成一个输出文件,因此您应该选择add_custom_command()(两者基本相同,但command会产生一个或多个输出文件,而target则不会)。

此情形下的cmake代码片段应如下所示:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/dependencies/library
    COMMAND make
)

然后,您需要将输出文件作为另一个目标的依赖项添加,并且一切应该(希望如此)按预期工作。

您还可以在add_custom_command()调用中添加DEPENDS语句,以便在一些输入源发生更改时重新构建对象文件。


谢谢指出,我已经修复了。 - Phil Be

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接