簡體   English   中英

當外部項目發生變化時,如何自動重建對外部項目目標的依賴?

[英]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)

任何代碼生成目標都設置為依賴於代碼生成。 我第一次構建:

  1. codegenExecutable外部項目,創建了${CODEGEN_EXECUTABLE}可執行文件
  2. codegen目標的時間戳是可執行文件的時間戳設置
  3. 所有依賴於codegen的代碼生成任務都被重建了

沒有更改,后續構建執行以下操作:

  1. codegenExecutable外部項目已構建,但由於其源代碼均未更改,因此不會重新構建可執行文件,也不會更改其時間戳
  2. codegen目標的時間戳不會改變
  3. 不重建依賴於codegen的代碼生成任務

如果我觸碰任何codegen源和構建,則:

  1. codegenExecutable外部項目,創建了一個帶有更新時間戳的新${CODEGEN_EXECUTABLE}可執行文件
  2. codegen目標的時間戳是可執行文件的時間戳更新
  3. 依賴於代碼生成任務codegen重建

我相信,如果我從codegenCMakeLists.txt設置EXPORT ed 目標,那么我就不必對可執行路徑進行硬編碼。 未來的任務……

暫無
暫無

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

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