簡體   English   中英

CMake add_custom_command 未運行

[英]CMake add_custom_command not being run

我正在嘗試使用add_custom_command在構建期間生成文件。 該命令似乎從未運行過,所以我制作了這個測試文件。

cmake_minimum_required( VERSION 2.6 )

add_custom_command(
  OUTPUT hello.txt
  COMMAND touch hello.txt
  DEPENDS hello.txt
)

我試着跑:

cmake .  
make

並且沒有生成 hello.txt。 我做錯了什么?

add_custom_target(run ALL ...解決方案適用於您只有一個正在構建的目標的簡單情況,但當您有多個頂級目標(例如應用程序和測試)時會崩潰。

當我試圖將一些測試數據文件打包到一個目標文件中時,我遇到了同樣的問題,這樣我的單元測試就不會依賴於任何外部。 我使用add_custom_command和一些額外的依賴魔法解決了它set_property

add_custom_command(
  OUTPUT testData.cpp
  COMMAND reswrap 
  ARGS    testData.src > testData.cpp
  DEPENDS testData.src 
)
set_property(SOURCE unit-tests.cpp APPEND PROPERTY OBJECT_DEPENDS testData.cpp)

add_executable(app main.cpp)
add_executable(tests unit-tests.cpp)

所以現在 testData.cpp 將在 unit-tests.cpp 編譯之前生成,並且任何時候 testData.src 更改。 如果您調用的命令真的很慢,您將獲得額外的好處,即當您僅構建應用程序目標時,您不必等待該命令(只有測試可執行文件需要)完成。

它沒有在上面顯示,但仔細應用${PROJECT_BINARY_DIR}, ${PROJECT_SOURCE_DIR} and include_directories()將保持你的源代碼樹沒有生成的文件。

添加以下內容:

add_custom_target(run ALL
    DEPENDS hello.txt)

如果您熟悉 makefile,這意味着:

all: run
run: hello.txt

兩個現有答案的問題是,它們要么使依賴項全局化( add_custom_target(name ALL ...) ),要么將其分配給特定的單個文件( set_property(...) ),如果你有很多需要它作為依賴項的文件。 相反,我們想要的是一個可以使另一個目標依賴的目標。

這樣做的方法是使用add_custom_command定義規則,然后add_custom_target根據該規則定義一個新目標。 然后,您可以通過add_dependencies將該目標添加為另一個目標的依賴項。

# this defines the build rule for some_file
add_custom_command(
  OUTPUT some_file
  COMMAND ...
)
# create a target that includes some_file, this gives us a name that we can use later
add_custom_target(
  some_target
  DEPENDS some_file
)
# then let's suppose we're creating a library
add_library(some_library some_other_file.c)
# we can add the target as a dependency, and it will affect only this library
add_dependencies(some_library some_target)

這種方法的優點:

  • some_target不是ALL的依賴項,這意味着您僅在特定目標需要時才構建它。 (而add_custom_target(name ALL ...)將無條件地為所有目標構建它。)
  • 因為some_target是整個庫的依賴項,所以它將在該庫中的所有文件之前構建。 這意味着如果庫中有很多文件,我們不必對每個文件都執行set_property
  • 如果我們將DEPENDS添加到add_custom_command ,那么它只會在其輸入發生變化時重建。 (將此與使用add_custom_target(name ALL ...)的方法進行比較,其中命令在每次構建時運行,無論是否需要。)

有關為什么以這種方式工作的更多信息,請參閱此博客文章: https ://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/

這個問題很老了,但即使我遵循建議的建議,它也不適合我(至少不是每次)。
我正在使用 Android Studio,我需要調用 cMake 來構建 C++ 庫。 它工作正常,直到我添加代碼來運行我的自定義腳本(事實上,此刻我嘗試運行“touch”,如上例所示)。
首先,

add_custom_command

根本不起作用。
我試過

execute_process (
        COMMAND touch hello.txt
)

它有效,但不是每次都有效!
我試圖清理項目,手動刪除創建的文件,同樣的事情。
試過 cMake 版本:
3.10.2
3.18.1
3.22.1
當它們工作時,它們會產生不同的結果,具體取決於 cMake 版本、一個文件或多個文件。 只要它們有效,這並不重要,但這就是問題所在。
有人可以闡明這個謎團嗎?

暫無
暫無

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

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