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
目標屬性,以指示 匯入目標 是否為全域可見。對於使用GLOBAL
選項建立的目標,它會自動設定為 true 值,以用於add_library()
或add_executable()
。此外,專案程式碼現在可以透過將此屬性設定為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
選項,以變更寫入到產生匯出標頭的包含保護符號的名稱。此外,它現在會在產生的匯出標頭的包含保護上的結束#endif
之後新增註解。UseJava
模組add_jar
命令獲得GENERATE_NATIVE_HEADERS
選項,以針對javac
1.8 或以上版本使用javac -h
產生原生標頭檔。這取代了create_javah
,由於 JEP 313 移除了javah
工具,因此create_javah
不再適用於 JDK 1.10 和以上版本。
自動產生¶
當使用
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
)的作用相同。
其他¶
別名目標 現在可以為使用
add_library()
的GLOBAL
選項建立的 匯入目標 建立別名。介面函式庫 現在可以在其上設定自訂屬性,如果它們以底線 (
_
) 或小寫 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¶
CheckIncludeFile
模組check_include_file
巨集、CheckIncludeFileCXX
模組check_include_file_cxx
巨集和CheckIncludeFiles
模組check_include_files
巨集被教導要在 CMake 3.11.0 中遵循CMAKE_REQUIRED_LIBRARIES
變數。由於變更了現有專案的檢查行為,因此已還原此功能。未來可能會透過相容性政策恢復此功能。
3.11.2¶
呼叫
add_library()
以建立非全域可見的匯入目標的別名,現在再次導致錯誤,就像 3.11.0 之前的版本一樣。此診斷訊息在 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
磁碟機上的損壞,此功能已被還原。