CMake 3.3 發行說明¶
自 CMake 3.2 以來所做的變更包括以下內容。
新功能¶
產生器¶
Makefile 產生器現在會在包含磁碟上檔案的實際建置規則的 makefile 中加入
.DELETE_ON_ERROR
。這會告訴 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>
的權杖。當使用
LOG_*
選項以及在 CMake 初始快取選項中時,ExternalProject
模組 API 學會了支援generator expressions
。FindBoost
模組現在會針對 RELEASE 和 DEBUG 組態分別追蹤包含函式庫的目錄。FindCUDA
模組現在預設會使用靜態 CUDA 執行階段函式庫(如果有的話)。提供了一個新的CUDA_USE_STATIC_CUDA_RUNTIME
選項來控制此行為。FindMatlab
模組已完全重寫。它學會了關於版本和元件,並且以更精確和跨平台的方式找到 Matlab。該模組現在提供了用於建立 mex 擴充功能、文件和單元測試的 API。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 Generator
學會了支援 Qt Framework Installer 2.0 工具。CPack DEB Generator
學會了一個新的CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPS
變數,以指定每個元件使用dpkg-shlibdeps
。CPack DEB Generator
學會了一個新的CPACK_DEBIAN_<COMPONENT>_PACKAGE_DEPENDS
選項,以指定每個元件的相依性。CPack RPM Generator
學會了更乾淨地打包符號連結,並且現在支援使用最新的rpmbuild
版本的目錄符號連結。CPack RPM Generator
學會了一個新的CPACK_RPM_ADDITIONAL_MAN_DIRS
變數,以指定包含用於 brp-compress RPM 巨集的 man page 的目錄。CPack RPM Generator
學會了一個新的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 內測試框架和應用程式捆綁包。
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()
命令不再使用-i
選項告訴make
工具忽略錯誤。 之前,這只對 Makefile Generators 這麼做,但對其他產生器則否。請參閱政策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
。