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 版本中移除。