CMake 3.3 版本發行說明¶
自 CMake 3.2 以來所做的變更包括以下內容。
新功能¶
產生器¶
Makefile 產生器 現在將
.DELETE_ON_ERROR
新增至包含磁碟上檔案實際建置規則的 makefile。這會告知 GNU make 在其配方修改輸出但失敗時移除規則輸出。Visual Studio 產生器 學習支援
.xaml
原始檔,並自動將它們與對應的.h
和.cpp
原始檔關聯。在 Windows 上新增了一個新的實驗性
Green Hills MULTI
產生器。Green Hills MULTI 是用於嵌入式即時系統的 IDE。
指令¶
add_dependencies()
指令學習允許將依賴項新增至 介面函式庫。新增至介面函式庫的依賴項會在其位置以傳遞方式追蹤,因為目標本身不會建置。execute_process()
指令學習支援為OUTPUT_FILE
和ERROR_FILE
指定相同檔案。file(GLOB)
和file(GLOB_RECURSE)
指令學習了一個新的LIST_DIRECTORIES <bool>
選項,用於指定 glob 結果是否應包含目錄。find_library()
、find_path()
和find_file()
指令現在會從PATH
環境變數衍生的安裝前綴中搜尋。if()
指令學習了一個新的IN_LIST
運算子,如果給定的元素包含在具名列表中,則評估為 true。install(EXPORT)
和export()
指令學習匯出填入INTERFACE_SOURCES
目標屬性的目標。install(TARGETS)
指令學習支援DESTINATION
值中的產生器表達式。
變數¶
現在可以偵測到某些 Fortran 編譯器的版本,並將其儲存在
CMAKE_Fortran_COMPILER_VERSION
變數中。Visual Studio 產生器 學習了一個新的
CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
選項,用於將INSTALL
目標放在解決方案 (.sln
) 檔案的預設建置中。
屬性¶
引入了
CROSSCOMPILING_EMULATOR
目標屬性和支援的CMAKE_CROSSCOMPILING_EMULATOR
變數,以允許目標平台二進位檔在交叉編譯期間在主機上執行。引入了
<LANG>_INCLUDE_WHAT_YOU_USE
目標屬性和支援的CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE
變數,以告知 Makefile 產生器 和Ninja
產生器與編譯器一起執行include-what-you-use
,用於C
和CXX
語言。<LANG>_VISIBILITY_PRESET
和VISIBILITY_INLINES_HIDDEN
目標屬性現在影響所有目標類型來源的編譯。請參閱政策CMP0063
。XCODE_ATTRIBUTE_<an-attribute>
目標屬性學習支援產生器表達式。
模組¶
引入了
CheckFortranCompilerFlag
模組,用於檢查Fortran
編譯器標誌,非常像CheckCCompilerFlag
模組已經為C
所做的那樣。ExternalData
模組學習了一個新的ExternalData_NO_SYMLINKS
選項,以停用符號連結的使用,改為使用副本來填入真實資料檔案。ExternalData
模組學習了DATA{}
參考資料中的新RECURSE:
選項,指定目錄。這允許比對關聯檔案的整個目錄樹。ExternalData
模組學習了一個新的 URL 範本佔位符%(algo:<key>)
,以允許通過配置新的ExternalData_URL_ALGO_<algo>_<key>
變數來自訂從演算法名稱到 URL 組件的對應。這允許在遠端 URL 中有更大的彈性。ExternalProject
模組學習在每個步驟的BYPRODUCTS
中替換像<BINARY_DIR>
這樣的符號。ExternalProject
模組 API 學習在使用LOG_*
選項和 CMake 初始快取選項時,支援產生器表達式
。FindBoost
模組現在分別針對 RELEASE 和 DEBUG 組態追蹤包含函式庫的目錄。FindCUDA
模組現在預設為使用靜態 CUDA 執行階段函式庫 (如果可用)。提供了一個新的CUDA_USE_STATIC_CUDA_RUNTIME
選項來控制此行為。FindMatlab
模組已完全重寫。它學習了版本和組件,並以更精確和跨平台的方式尋找 Matlab。該模組現在提供 API 來建立 mex 擴充功能、文件和單元測試。FindPackageHandleStandardArgs
模組find_package_handle_standard_args
函數現在始終填入<PackageName>_FOUND
和<UPPERCASE_NAME>_FOUND
變數 (後者用於向後相容性)。現在忽略FOUND_VAR
選項,除非強制執行其允許的值。InstallRequiredSystemLibraries
模組學習了一個新的CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT
選項,以指定安裝組件。
產生器表達式¶
引入了一個新的
COMPILE_LANGUAGE
產生器表達式,以允許根據每個原始檔的LANGUAGE
指定目標檔案的編譯選項。由於底層原生建置工具的限制,此功能在不同產生器中的支援程度有所不同。請參閱cmake-generator-expressions(7)
手冊以取得詳細資訊。
CTest¶
ctest(1)
工具學習了一個新的--repeat-until-fail <n>
選項,以協助尋找零星的測試失敗。CTestCoverageCollectGCOV
模組學習支援與ctest_coverage()
指令相同的CTEST_CUSTOM_COVERAGE_EXCLUDE
選項。
CPack¶
CPack IFW 產生器
學習支援 Qt Framework Installer 2.0 工具。CPack DEB 產生器
學習了一個新的CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPS
變數,以指定每個組件使用dpkg-shlibdeps
。CPack DEB 產生器
學習了一個新的CPACK_DEBIAN_<COMPONENT>_PACKAGE_DEPENDS
選項,以指定每個組件的依賴項。CPack RPM 產生器
學習更乾淨地封裝符號連結,現在支援具有最新rpmbuild
版本的目錄符號連結。CPack RPM 產生器
學習了一個新的CPACK_RPM_ADDITIONAL_MAN_DIRS
變數,以指定包含用於 brp-compress RPM 巨集的 man pages 的目錄。CPack RPM 產生器
學習了一個新的CPACK_RPM_<component>_PACKAGE_ARCHITECTURE
變數,以指定組件特定的套件架構。CPack WIX 產生器學習了新的
CPACK_START_MENU_SHORTCUTS
、CPACK_DESKTOP_SHORTCUTS
和CPACK_STARTUP_SHORTCUTS
安裝的檔案屬性,可用於分別在「開始」選單、「桌面」和「啟動」資料夾中安裝捷徑。
其他¶
編譯功能
功能現在可以識別 Windows 上 GNU 編譯器 (4.4 到 5.0 版) 支援的功能。cmake(1)
-E tar
指令學習了一個新的--format<format>
選項,以指定要寫入的封存格式。在 OS X 上,CMake 學習建立 XCTest 套件,以在 Xcode 內測試 Frameworks 和 App Bundles。
FindXCTest
模組提供便利函數來處理XCTEST
套件。
已棄用和移除的功能¶
在 OS X 上,
cmake-gui(1)
不再具有Install For Command Line Use
選單項目。相反地,有一個How to Install For Command Line Use
選單項目,顯示一個資訊對話方塊,說明如何使命令列工具可用。例如/Applications/CMake.app/Contents/bin/cmake-gui --install
ctest_build()
和build_command()
指令不再告知make
工具使用-i
選項忽略錯誤。先前,這是針對 Makefile 產生器 完成的,但其他產生器則否。請參閱政策CMP0061
。Visual Studio 10 2010
產生器不再檢查是否已開啟專案的 VS IDE 正在執行,或要求它們重新載入。最初是針對 VS 10 完成此操作,因為先前已針對 VS 7 到 9 完成此操作,以避免提示解決方案中的每個專案。由於 VS >= 10 允許一次重新載入整個解決方案,因此它們不需要 CMake 來協助它們。Visual Studio 7
產生器 (.NET 2002) 現在已棄用,將在未來版本的 CMake 中移除。Visual Studio 6
產生器現在已棄用,將在未來版本的 CMake 中移除。find_package()
指令不再考慮最近在cmake-gui(1)
中設定的專案建置樹。先前僅在 Windows 上完成此操作,現在永遠不會完成。NO_CMAKE_BUILDS_PATH
選項現在會被忽略 (如果給定),並且實際上始終處於開啟狀態。專案可以填入 使用者套件註冊表,以協助使用者依序建置多個相依專案。add_definitions()
指令不再導致填入DEFINITIONS
目錄屬性。請參閱政策CMP0059
。對於 Visual Studio 7、8 和 9 產生器,
$(OutDir)
佔位符的值不再評估為組態名稱。專案應改為使用$(ConfigurationName)
。使用
export()
的輸出搭配install(FILES)
指令已不再被允許。詳情請參閱政策CMP0062
。
其他變更¶
Ninja
產生器現在要求呼叫add_custom_command()
和add_custom_target()
指令時,必須使用BYPRODUCTS
選項來明確指定由自訂命令產生的任何檔案,這些檔案未被列為輸出(可能是因為它們的時間戳記允許比輸入舊)。詳情請參閱政策CMP0058
。Makefile 產生器 的建置時進度輸出已獲得改進。在平行建置期間,不再混雜進度和建置規則訊息。連結規則訊息現在包含進度,並以粗體綠色顯示,而不是粗體紅色(因為紅色通常與錯誤訊息相關聯)。
Visual Studio 7、8 和 9 的
CMAKE_CFG_INTDIR
變數值現在是$(ConfigurationName)
而不是$(OutDir)
。這不應對此變數的預期用例產生任何影響。在隱式連結器搜尋目錄中,使用完整路徑連結到程式庫檔案(例如
/usr/lib/libfoo.a
)時,不再要求連結器搜尋程式庫(例如-lfoo
),現在改為使用完整路徑連結。詳情請參閱政策CMP0060
。