【问题标题】:CMake run custom command before build?CMake在构建之前运行自定义命令?
【发布时间】:2016-10-18 03:22:55
【问题描述】:

我想在每次构建之前运行的二进制文件的示例源代码,每个 add_executable 一次:

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i=0; i<argc; ++i)
        printf("argv[%d] = %s\n", i, argv[i]);
    fclose(fopen("foo.hh", "a"));
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(foo_proj)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
set(SOURCE_FILES main.cpp)
# ---- this line changes ----
add_executable(foo_proj ${SOURCE_FILES})

尝试:

add_custom_target(create_foo_hh COMMAND /tmp/bin/create_foo_hh)
add_dependencies(${SOURCE_FILES} create_foo_hh)

错误:无法将目标级别的依赖项添加到不存在的目标“main.cpp”。 add_dependencies 适用于由 add_executable、a​​dd_library 或 add_custom_target 命令创建的顶级逻辑目标。如果要添加文件级依赖项,请参阅 add_custom_target 和 add_custom_command 命令的 DEPENDS 选项。

execute_process(COMMAND /tmp/bin/create_foo_hh main.cpp)

没有错误,但没有创建 foo.hh。

如何自动运行此命令?

【问题讨论】:

标签: c++ cmake command


【解决方案1】:

execute_process() 在配置时调用。

你可以使用add_custom_command():

add_custom_command(
  OUTPUT foo.hh
  COMMAND /tmp/bin/create_foo_h main.cpp
  DEPENDS ${SOURCE_FILES} /tmp/bin/create_foo_hh main.cpp
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(foo_proj ${SOURCE_FILES} foo.hh)

这样,foo.hhfoo_proj: 的依赖项,并且在构建 foo_proj 时将调用您的命令。它取决于${SOURCE_FILES}/tmp/bin/create_foo_hh main.cpp,以便在其中一个文件发生更改时再次生成它。

关于路径,add_custom_command() 配置为在当前构建目录中运行以在那里生成文件,include_directories() 用于将构建目录添加到包含目录。

【讨论】:

  • 错误:无法将目标级别的依赖项添加到不存在的目标“foo_proj”。 add_dependencies 适用于由 add_executable、a​​dd_library 或 add_custom_target 命令创建的顶级逻辑目标。如果要添加文件级依赖项,请参阅 add_custom_target 和 add_custom_command 命令的 DEPENDS 选项。
  • @AT 我的错,编辑了我的答案; foo.hh 必须在声明可执行文件时指定为源文件。
  • @AT 你能详细说明一下吗?
  • 抱歉,这不是要发布的,正在准备:gist.github.com/AlecTaylor/e416efbea8793da599513bf28e7d92d7 - 13 行 CMakeLists.txt 和 7 行 main.cpp。找不到符号bar
  • @AT 我无法编译您的示例,但我想您必须设置项目以包含生成的文件;我编辑了我的答案;另外,我不确定您的 echo 命令是否按原样正常运行。
【解决方案2】:

您可能不希望自定义目标依赖于您的源文件(因为它们本身不是目标,因此永远不会“运行”),而是依赖于您使用它们创建的目标:

target_add_dependencies(foo_proj create_foo_hh)

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多