【问题标题】:cmake add_custom_command and DEPENDS/TARGETcmake add_custom_command 和 DEPENDS/TARGET
【发布时间】:2015-05-03 22:16:28
【问题描述】:

我的顶级 CMakeLists.txt 中有这个:

add_subdirectory (src) # add_executable (${PROJECT_NAME} ${_SOURCES})
add_subdirectory (data)

在构建 ${PROJECT_NAME} 时,我想在数据子目录中创建一个文件。以下不起作用,返回目标“foo”不存在:

add_custom_command(
        OUTPUT "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.desktop"
        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
        COMMAND ${INTLTOOLMERGE} -d -u ../po ${PROJECT_NAME}.desktop.in "${PROJECT_NAME}.desktop"
        COMMENT "Creating desktop file"
        DEPENDS ${PROJECT_NAME}
    )

这也行不通。返回:目标名称“foo”在此上下文中是未知的

add_custom_command(
        TARGET ${PROJECT_NAME}
        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
        COMMAND ${INTLTOOLMERGE} -d -u ../po ${PROJECT_NAME}.desktop.in "${PROJECT_NAME}.desktop"
        COMMENT "Creating desktop file"
    )

但这按预期工作:

add_custom_command(
        OUTPUT "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.desktop"
        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
        COMMAND ${INTLTOOLMERGE} -d -u ../po ${PROJECT_NAME}.desktop.in "${PROJECT_NAME}.desktop"
        COMMENT "Creating desktop file"
    )
    add_custom_target (desktopfile DEPENDS "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.desktop")
    add_dependencies (${PROJECT_NAME} desktopfile)

问题:

1.- 当“foo”被构建没有使用目标时,我如何使用 add_custom_command 来运行命令?

2.- add_dependencies 怎么知道“foo”而纯 add_custom_command 不知道?

更新 #1:简单代码:

# /CMakeLists.txt
cmake_minimum_required (VERSION 3.0)
project ("foo")

add_subdirectory (src)
add_subdirectory (data)

# : EOF~

# src/CMakeLists.txt
add_executable (${PROJECT_NAME} main.c)

# : EOF:~

# data/CMakeLists.txt

add_custom_command (
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E sleep 5
    COMMENT "We're going to try to pause here for 5 seconds"
)

# EOF:~

# src/main.c
#include <stdio.h>

int main () {
    printf ("Hello world");
    return 0;
}

【问题讨论】:

    标签: cmake cmake-custom-command


    【解决方案1】:

    请使用 POST_BUILD 选项。

    来自 cmake 文档:

     add_custom_command(TARGET target
                         PRE_BUILD | PRE_LINK | POST_BUILD
                         COMMAND command1 [ARGS] [args1...]
                         [COMMAND command2 [ARGS] [args2...] ...]
                         [WORKING_DIRECTORY dir]
                         [COMMENT comment] [VERBATIM])
    

    这定义了一个与构建指定目标相关联的新命令。该命令何时发生取决于指定以下哪一项:

    PRE_BUILD - 在所有其他依赖项之前运行 PRE_LINK - 在其他依赖项之后运行 POST_BUILD - 在构建目标后运行

    请注意,PRE_BUILD 选项仅在 Visual Studio 7 或更高版本上受支持。对于所有其他生成器,PRE_BUILD 将被视为 PRE_LINK。

    【讨论】:

    • 我仍然收到错误“目标名称“foo”在此上下文中未知”
    • 能否请您发布您的示例代码,我可以在我的系统上复制和编译?这样调试会更容易。
    • 我看到了和你一样的问题。稍作搜索,在 cmake 邮件列表中找到了这个:cmake.org/pipermail/cmake/2014-August/058360.html。但是当我将您的 add_custom_command 移动到与 src 相同的目录时,它起作用了。
    • 谢谢,是的...看来我需要重新构建我的树项目,但可行 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多