【问题标题】:Use CMake add_custom_command to generate source for another target使用 CMake add_custom_command 为另一个目标生成源
【发布时间】:2012-07-20 11:35:08
【问题描述】:

我尝试了这个虚拟示例:

CMakeLists.txt

cmake_minimum_required( VERSION 2.8 )
project( testcmake )

add_custom_command(
  OUTPUT testcmake.h
  COMMAND xxd -i testcmake.txt testcmake.h
  DEPENDS testcmake.txt
)

add_executable( testcmake testcmake.c testcmake.h )

testcmake.c

#include <stdio.h>
#include "testcmake.h"

int main()
{
    int i;

    for ( i = 0 ; i < testcmake_txt_len ; i++ )
    {
        fputc( testcmake_txt[ i ] , stdout );
    }
}

testcmake.txt

foo
bar
baz

问题

它失败了:

[...]
xxd: testcmake.txt: No such file or directory
[...]

添加WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 使一切正常,但我不希望自定义命令的输出出现在我的源目录中,我希望所有中间文件都保留在 CMake 构建目录中,就像任何非自定义规则一样。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    在执行 xxd 之前,您需要将 testcmake.txt 复制到您的构建文件夹。您还需要将构建目录添加到包含中,以便 #include "testcmake.h" 工作:

    add_custom_command(
      OUTPUT testcmake.h
      COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/testcmake.txt testcmake.txt
      COMMAND xxd -i testcmake.txt testcmake.h
      DEPENDS testcmake.txt
    )
    
    include_directories(${CMAKE_CURRENT_BINARY_DIR})
    

    【讨论】:

      【解决方案2】:

      在 CMake 3.2 中,file 获得了一项新功能。引用发布公告:

      “file(GENERATE)”命令现在可以生成文件 用作构建系统目标的源文件。

      也许这更容易使用,因为您可以切换到 CMake 3.2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多