CMake 3.11 發行說明¶
自 CMake 3.10 以來所做的變更包括以下。
新功能¶
平台¶
Ninja
產生器現在支援 TI C/C++ 編譯器。
產生器¶
CodeBlocks
額外產生器學會檢查CMAKE_CODEBLOCKS_COMPILER_ID
變數,以取得自訂編譯器識別值並放入專案檔案中。Makefile 產生器和
Ninja
產生器學會為Fortran
語言加入編譯器啟動器工具以及編譯器(先前支援C
、CXX
和CUDA
)。請參閱CMAKE_<LANG>_COMPILER_LAUNCHER
變數和<LANG>_COMPILER_LAUNCHER
目標屬性以瞭解詳細資訊。Visual Studio 產生器學會支援目標範圍的
產生器 運算式
中的COMPILE_LANGUAGE
、COMPILE_DEFINITIONS
、INCLUDE_DIRECTORIES
、COMPILE_OPTIONS
和file(GENERATE)
。請參閱產生器運算式文件以瞭解注意事項。Xcode
產生器學會支援目標範圍的產生器 運算式
中的COMPILE_LANGUAGE
、COMPILE_DEFINITIONS
和INCLUDE_DIRECTORIES
。先前僅支援COMPILE_OPTIONS
和file(GENERATE)
。請參閱產生器運算式文件以瞭解注意事項。
命令¶
add_library()
和add_executable()
命令現在可以在沒有任何來源的情況下呼叫,而且只要稍後透過target_sources()
命令加入來源,就不會抱怨。file(DOWNLOAD)
和file(UPLOAD)
命令增加了NETRC
和NETRC_FILE
選項,以指定使用.netrc
檔案。target_compile_definitions()
命令學會在 匯入目標上設定INTERFACE_COMPILE_DEFINITIONS
屬性。target_compile_features()
命令學會在 匯入目標上設定INTERFACE_COMPILE_FEATURES
屬性。target_compile_options()
命令學會在 匯入目標上設定INTERFACE_COMPILE_OPTIONS
屬性。target_include_directories()
命令學會在 匯入目標上設定INTERFACE_INCLUDE_DIRECTORIES
屬性。target_sources()
命令學會在 匯入目標上設定INTERFACE_SOURCES
屬性。target_link_libraries()
命令學會在 匯入目標上設定INTERFACE_LINK_LIBRARIES
屬性。
變數¶
引入了
CMAKE_GENERATOR_INSTANCE
變數,用於保存所選產生器對應原生工具的實例 (如果有多個可用)。Visual Studio 15 2017
產生器會使用此變數來持久保存所選的 Visual Studio 實例。新增了
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
變數,以便在透過install()
和file(INSTALL)
安裝檔案期間,設定隱式建立的目錄的預設權限,例如在執行make install
時。新增了
CMAKE_JOB_POOLS
變數,用於指定JOB_POOLS
屬性使用的值。這樣在使用 Ninja 產生器時,就能透過命令列組態參數來控制建置平行化。新增了
CMAKE_NETRC
和CMAKE_NETRC_FILE
變數,用於指定file(DOWNLOAD)
和file(UPLOAD)
命令以及ExternalProject
模組使用.netrc
檔案。新增了
CMAKE_CUDA_SEPARABLE_COMPILATION
變數,用於在建立目標時初始化目標的CUDA_SEPARABLE_COMPILATION
屬性。
屬性¶
COMPILE_DEFINITIONS
原始碼檔案屬性學會支援產生器 運算式
。新增了
COMPILE_OPTIONS
原始碼檔案屬性,用於管理要傳遞給編譯器的選項清單。新增了
IMPORTED_GLOBAL
目標屬性,用於指示 匯入目標 是否為全域可見。對於使用add_library()
或add_executable()
的GLOBAL
選項建立的目標,此屬性會自動設為 true 值。此外,專案程式碼現在可以將此屬性設定為TRUE
,以提升本地匯入目標使其成為全域可見。新增了
INCLUDE_DIRECTORIES
原始碼檔案屬性,用於指定前置處理器包含檔案搜尋目錄的清單。新增了原始碼檔案屬性
VS_SHADER_DISABLE_OPTIMIZATIONS
和VS_SHADER_ENABLE_DEBUG
,以便使用 Visual Studio 產生器 來指定.hlsl
來源的更多詳細資料。
模組¶
CheckIncludeFiles
模組的CHECK_INCLUDE_FILES()
命令新增了LANGUAGE
選項,用於指定是要使用C
或CXX
編譯器來進行檢查。CMakePackageConfigHelpers
模組的write_basic_package_version_file()
命令針對COMPATIBILITY
引數新增了SameMinorVersion
模式。ExternalProject
模組學會了在註解、命令、工作目錄和副產品中替換<DOWNLOAD_DIR>
。ExternalProject
模組新增了NETRC
和NETRC_FILE
選項,用於指定使用.netrc
檔案。新增了
FetchContent
模組,支援使用ExternalProject_Add()
支援的任何下載/更新方法,在組態時填入內容。這樣就能在組態階段立即使用內容,例如使用add_subdirectory()
等。完善支援階層式專案結構,允許父專案覆寫子專案的內容詳細資料,並確保在整個專案樹狀結構中不會多次填入內容。FindBLAS
和FindLAPACK
模組學會支援 FLAMEblis
和libflame
。FindDoxygen
模組的doxygen_add_docs()
函數現在支援新的DOXYGEN_VERBATIM_VARS
清單變數。包含在該清單中的任何DOXYGEN_...
變數都會略過自動引號邏輯,在將其傳輸到輸出Doxyfile
時保持其內容不變。新增
FindIconv
模組以尋找 iconv 支援。GenerateExportHeader
模組的GENERATE_EXPORT_HEADER
命令新增了INCLUDE_GUARD_NAME
選項,以變更寫入產生的匯出標頭的 include guard 符號名稱。此外,它現在會在產生的匯出標頭 include guard 的結尾#endif
後面新增註解。UseJava
模組的add_jar
命令新增了GENERATE_NATIVE_HEADERS
選項,以便使用javac -h
為javac
1.8 或更高版本產生原生標頭檔。這取代了create_javah
,由於 JEP 313 移除了javah
工具,因此不再適用於 JDK 1.10 及更高版本。
Autogen¶
當使用
AUTOMOC
或AUTOUIC
時,CMake 現在會啟動多個平行moc
或uic
處理程序以縮短建置時間。可以設定新的CMAKE_AUTOGEN_PARALLEL
變數和AUTOGEN_PARALLEL
目標屬性,以指定要啟動的平行moc
或uic
處理程序數量。預設值是從主機上的 CPU 數量推導而來。
CTest¶
ctest_start()
命令不再設定CTEST_RUN_CURRENT_SCRIPT
,原因是如果從函式內部呼叫會發生範圍問題。相反地,它會在 CTest 中設定一個內部變數。但是,在全域範圍將CTEST_RUN_CURRENT_SCRIPT
設定為 0 仍然可以防止腳本在結尾重新執行。
CPack¶
cpack(1)
新增了--trace
和--trace-expand
選項。CPack IFW 產生器
新增了CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR
變數,用於控制在解除安裝時是否不應刪除目標目錄。CPack RPM 產生器
學會了強制對程式和共享程式庫啟用執行權限。請參閱CPACK_RPM_INSTALL_WITH_EXEC
變數。新增了一個
CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
變數,其在封裝期間(例如make package
)的作用與CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
變數在安裝期間(例如make install
)的作用相同。
其他¶
別名目標 現在可以將使用
GLOBAL
選項以add_library()
建立的 匯入目標 設定為別名。如果 介面程式庫 的自訂屬性以底線 (
_
) 或小寫 ASCII 字元開頭,現在可以設定這些屬性。最初的目的是僅允許適用於INTERFACE
程式庫的屬性,但這也阻礙了自訂屬性的使用。新增了
cmake(1)
--open <dir>
命令列選項,以開啟產生的 IDE 專案,例如 Visual Studio 解決方案或 Xcode 專案。
已棄用和移除的功能¶
針對原則
CMP0037
到CMP0054
(CMP0036
和以下版本已棄用)新增了明確的棄用診斷。cmake-policies(7)
手冊說明了所有原則的舊有行為都已棄用,專案應移植到新的行為。已移除
KDevelop3
產生器。
其他變更¶
原則
CMP0037
不再保留與選用功能相關聯的目標名稱,例如test
和package
,除非已啟用對應的功能。FindOpenGL
模組現在會優先使用可用的 GLVND 程式庫。請參閱原則CMP0072
。在
CMAKE_OSX_DEPLOYMENT_TARGET
變數中設定的最低部署目標過去僅適用於 macOS,無論選取的 SDK 為何。現在,它會根據CMAKE_OSX_SYSROOT
選取的目標平台正確設定。例如,如果 sysroot 變數指定 iOS SDK,則CMAKE_OSX_DEPLOYMENT_TARGET
中的值會被解譯為最低 iOS 版本。Xcode
產生器行為(每個project()
命令產生一個專案檔)現在可以使用CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
變數來控制。這對於加速大型專案的 CMake 產生步驟以及解決ZERO_CHECK
邏輯中的錯誤可能很有用。由於
CMakeCache.txt
格式不支援值中的換行符號,因此現在會將包含換行符號的值截斷,然後再寫入檔案。此外,會在快取檔案中寫入警告註解,並在主控台上向使用者顯示警告訊息。
更新¶
自 CMake 3.11.0 以來所做的變更包括以下內容。
3.11.1¶
在 CMake 3.11.0 中,
CheckIncludeFile
模組的check_include_file
巨集、CheckIncludeFileCXX
模組的check_include_file_cxx
巨集,以及CheckIncludeFiles
模組的check_include_files
巨集,被修改為會參考CMAKE_REQUIRED_LIBRARIES
變數。但因為這項改動會改變現有專案的檢查行為,所以已被還原。未來可能會透過相容性政策重新加入。
3.11.2¶
如同 3.11.0 之前的版本,現在呼叫
add_library()
來建立一個非全域可見的匯入目標的別名,會再次造成錯誤。這個診斷功能在 CMake 3.11.0 和 3.11.1 中被意外地移除了,因為修改允許全域可見的匯入目標被建立別名。FindQt4
模組的qt4_wrap_cpp
、qt4_wrap_ui
和qt4_add_resources
巨集現在會在它們產生的檔案上設定SKIP_AUTOMOC
和SKIP_AUTOUIC
。這些檔案不需要被 moc 或 uic 處理,為了符合政策CMP0071
,我們必須明確地聲明。
3.11.3¶
CMake 3.11.0 引入了在 Windows 上解析符號連結的功能,這個功能通常只在 UNIX 上執行。由於在
subst
磁碟機上出現問題,此功能已被還原。