隨着documentation of add_custom_target()
說,自定義目標是一直被認爲過時了,這意味着他們將與make
每次調用,其中包括他們重新建立。
你想,而不是什麼是自定義命令產生.war
文件:
add_custom_command(
OUTPUT "${JAVA_PROJECT_TARGET_DIR}/java_project.war"
COMMAND ${MAVEN_EXECUTABLE} package
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)
這告訴CMake的,當有人請求它是如何產生命名"${JAVA_PROJECT_TARGET_DIR}/java_project.war"
文件。對於文件,CMake可以生成依賴性檢查,所以它不會不必要地重新構建。請注意,您可能還需要在該add_custom_command()
中包含一些DEPENDS
,否則它將會從不重建一旦建成(1)。
然後,您還需要一件事:自定義命令的驅動程序。這將取決於命令的OUTPUT
,並且實際上會導致它被構建。所以,你要添加自定義目標:
add_custom_target(
JavaProject ALL
DEPENDS "${JAVA_PROJECT_TARGET_DIR}/java_project.war"
)
之後,順序將是如下:
期間make
,JavaProject
將被視爲過時的(因爲它是一個自定義的目標)和將建成。這意味着它的依賴性將被檢查爲最新版本,並且如果它們不是最新的,則重新構建。這就是自定義命令的用途。在那之後,定製目標本身會運行它的COMMAND
,但它沒有任何東西,所以沒有其他事情發生。
在後續的make
調用中,JavaProject
將再次被視爲過期,因此將被構建。它的依賴被再次檢查,但這一次,它們是最新的(因爲.war
已經存在)。因此它不會再被構建。自定義目標仍然沒有COMMAND
,所以沒有進一步的發生。
這個「作爲自定義命令驅動程序的自定義目標」方法是非常習慣的CMake代碼片段,您會在許多項目中看到它產生不參與進一步構建步驟(如文檔)的其他文件。
(1)如果依賴性列表是非常大的,你想把它移到一個單獨的文件,包括。事情是這樣的:
在CMakeLists.txt
:
include(files.cmake)
add_custom_command(
OUTPUT "${JAVA_PROJECT_TARGET_DIR}/java_project.war"
COMMAND ${MAVEN_EXECUTABLE} package
DEPENDS ${MyFiles}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)
在files.cmake
:
set(MyFiles
a/file1.java
a/file2.java
a/b/file1.java
a/c/file1.java
# ... list all files as necessary
)
這使CMakeList本身的可讀性,同時讓您顯式依賴於你所需要的。
你讀過的['add_custom_target()'](https://cmake.org/cmake/help/latest/command/add_custom_target.html),特別是明確強調的文檔「是*總是被認爲過時*「位? – Angew
啊,是的,感謝您的信息,所以我需要更改爲add_custom_command() –
...然後添加一個驅動程序。看到我的答案。 – Angew