CMP0154

在版本 3.28 中新增。

在使用檔案集合的目標中,產生檔案預設為私有的。

CMake 3.27 及更早版本假設,作為 add_custom_command()add_custom_target() 的輸出或副產品而產生的任何檔案,都可能是要給相依項的原始檔包含的公開標頭檔。這需要 Ninja 產生器 加入保守的僅順序相依性,以防止目標的原始檔在目標相依項的自訂命令完成之前就編譯,即使這些自訂命令只產生它們自己目標私有的原始碼。

檔案集合,由 CMake 3.23 引入,提供了一種表達產生標頭檔可見性的方式。CMake 3.28 及以上版本傾向於假設,在使用檔案集合的目標中,產生檔案預設為它們自己目標私有的。產生的公開標頭必須指定為 PUBLIC (或 INTERFACE) FILE_SET 的成員,通常類型為 HEADERS。有了這些資訊,Ninja 產生器 可以省略上述保守的相依性,並產生更有效率的建置圖。

此外,如果自訂命令的輸出是類型為 CXX_MODULES 的檔案集合的成員,則在編譯同一目標中的其他原始碼之前,也將不需要它存在。由於這些檔案不應在編譯時直接包含,因此可能不需要它們隱含地存在於其他編譯規則中。

此策略為在目標中使用檔案集合但尚未更新的產生標頭檔的專案提供相容性。此類專案應更新為在檔案集合中表達產生的公開標頭。例如

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
  ...
)
target_sources(foo
  PUBLIC FILE_SET HEADERS
    BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
    FILES     ${CMAKE_CURRENT_BINARY_DIR}/foo.h
)

此策略的 OLD 行為是假設產生檔案是公開的,即使在使用檔案集合的目標中,並且讓 Ninja 產生器 產生保守的建置圖。此策略的 NEW 行為是假設在使用檔案集合的目標中產生檔案是私有的,並且讓 Ninja 產生器 產生更有效率的建置圖。

此策略在 CMake 版本 3.28 中引入。它可以由 cmake_policy()cmake_minimum_required() 設定。如果未設定,CMake 不會發出警告,並使用 OLD 行為。

注意

策略的 OLD 行為依定義已棄用,並可能在未來版本的 CMake 中移除。