[英]How can I have the dependencies on an external project target be automatically rebuilt when the external project changes?
我正在使用頂級CMakeLists.txt
文件生成Makefile
的交叉編譯項目。 一些交叉編譯的源代碼是由基於主機的代碼生成工具生成的; 由於該工具需要不同的工具鏈,頂級CMakeLists.txt
使用ExternalProject_Add()
調用代碼生成器子目錄的CMakeLists.txt
,並將BUILD_ALWAYS
設置為TRUE
。 代碼生成目標取決於代碼生成器目標,因此在初始構建時構建代碼生成器,然后生成代碼,然后將整個shebang編譯成最終結果。
如果我更改代碼生成器的源代碼,那么代碼生成器可執行文件將在下一次make
正確重建。 問題:依賴代碼生成目標不會被重建。 ExternalProject_Add()
目標似乎無法指示何時/是否應該重建目標的任何依賴項。
例如,如果代碼生成器目標是使用Add_Custom_Command()
配置的,那么我將使用OUTPUT
關鍵字來指定生成的可執行文件,並且可以將任何依賴目標配置為在代碼生成器可執行文件的時間戳更新時自動重建。
(為清晰起見編輯:在為Add_Custom_Command()
指定一個OUTPUT
文件后,我將使用Add_Custom_Target()
創建一個方便的目標,其DEPENDS
關鍵字引用了Add_Custom_Command()
的OUTPUT
文件。然后我讓代碼生成目標取決於在這個便利目標上。但是,AFAIK,這對我不起作用。)
有沒有辦法配置基於ExternalProject_Add()
的目標,以便在主目標的輸出更改時自動重建依賴目標?
我需要根據代碼生成器可執行文件IMPORT
目標。 在我的頂級CMakeLists.txt
:
# Run next-gen code generation
# Use ExternalProject_Add() because we are building this for the host
# We DO NOT want cross-compile toolchain applied here
set(CODEGEN_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/codegen/_build/codegen)
ExternalProject_Add(codegenExecutable
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/codegen
# The two "--unset" options tell it to use the host defaults rather than the configured ones.
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env --unset=CC --unset=CXX ${CMAKE_COMMAND} -H. -B_build
INSTALL_COMMAND ""
BUILD_IN_SOURCE TRUE
EXCLUDE_FROM_ALL TRUE
BUILD_ALWAYS TRUE
)
# Imported target, so that any change in the code generator will result in rerunning the
# code generation.
add_executable(codegen IMPORTED)
set_property(
TARGET codegen
PROPERTY
IMPORTED_LOCATION "${CODEGEN_EXECUTABLE}"
)
add_dependencies(codegen codegenExecutable)
任何代碼生成目標都設置為依賴於代碼生成。 我第一次構建:
codegenExecutable
外部項目,創建了${CODEGEN_EXECUTABLE}
可執行文件codegen
目標的時間戳是可執行文件的時間戳設置codegen
的代碼生成任務都被重建了沒有更改,后續構建執行以下操作:
codegenExecutable
外部項目已構建,但由於其源代碼均未更改,因此不會重新構建可執行文件,也不會更改其時間戳codegen
目標的時間戳不會改變codegen
的代碼生成任務如果我觸碰任何codegen
源和構建,則:
codegenExecutable
外部項目,創建了一個帶有更新時間戳的新${CODEGEN_EXECUTABLE}
可執行文件codegen
目標的時間戳是可執行文件的時間戳更新codegen
被重建我相信,如果我從codegen
的CMakeLists.txt
設置EXPORT
ed 目標,那么我就不必對可執行路徑進行硬編碼。 未來的任務……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.