簡體   English   中英

使用CMake add_custom_command為另一個目標生成源

[英]Use CMake add_custom_command to generate source for another target

我嘗試了這個虛擬的例子:

的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構建目錄中,就像任何非自定義規則一樣。

在執行xxd之前,需要將testcmake.txt復制到build文件夾。 您還需要將您的構建目錄添加到包含,以便#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})

使用CMake 3.2, file獲得了一項新功能。 引用發布公告:

“file(GENERATE)”命令現在可以生成用作構建系統目標的源文件的文件。

也許這更容易使用,因為你可以切換到CMake 3.2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM