xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護項目構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手很是友好,短期內就能快速入門,可以讓用戶把更多的精力集中在實際的項目開發上。html
在這個新版本中,咱們對 Intel 系列的 C++ 和 Fortran 編譯器作了全平臺支持,而且改進了上個版本新加的 Wasm 工具鏈支持,同時對 Qt SDK for Wasm 也進行了支持。linux
另外,咱們還將 luajit 升級到最新的 v2.1 版本,在跨平臺方面,xmake 也作了很大的完善,增長了 mips64 架構的運行支持。android
這個版本上,咱們對 Intel 系列的 C++ 編譯器作了全平臺支持,包括 windows上的 icl 以及 linux/macOS 下的 icc/icpc。c++
要想啓用 Intel C++ 編譯器,咱們只須要在安裝了的 Intel 編譯器的系統上,經過 --toolchain=icc
參數切換到對應的工具鏈便可。git
$ xmake f --toolchain=icc $ xmake
以前的版本,xmake 僅僅支持 gfortran 編譯器,而這個版本,咱們也支持了 Intel Fortran 編譯器,也就是 ifort,咱們也只須要切換到對應的 ifort 工具鏈便可使用。github
$ xmake f --toolchain=ifort $ xmake
上個版本,咱們新增了 --toolchain=emcc
工具鏈來支持 wasm 程序的編譯,可是僅僅指定工具鏈,並不能很好的調整目標程序的擴展名,例如對 *.js
和 *.wasm
的文件生成。windows
而新版本,咱們繼續新增了 xmake f -p wasm
平臺,內置啓用 emcc 工具鏈,而且再次基礎上對周邊的配置作了更好的完善。xcode
只要切換到 wasm 平臺,xmake 會默認生成 *.js
以及對應 *.wasm
等目標文件,還會額外生成能夠加載 js 來運行 wasm 程序的 *.html
頁面。bash
另外,咱們還對 Qt SDK for Wasm 也作了支持,好比咱們建立一個 Qt QuickApp 工程。架構
$ xmake create -t qt.quickapp_static quickapp
這裏,咱們注意到,咱們建立的是須要靜態link的Qt工程,由於 wasm 版本的 Qt 庫,咱們須要強制靜態連接到程序才能正常使用。
生成的工程文件 xmake.lua 內容大概以下:
add_rules("mode.debug", "mode.release") includes("qt_add_static_plugins.lua") target("demo") add_rules("qt.quickapp_static") add_headerfiles("src/*.h") add_files("src/*.cpp") add_files("src/qml.qrc") add_frameworks("QtQuickControls2", "QtQuickTemplates2") qt_add_static_plugins("QtQuick2Plugin", {linkdirs = "qml/QtQuick.2", links = "qtquick2plugin"}) qt_add_static_plugins("QtQuick2WindowPlugin", {linkdirs = "qml/QtQuick/Window.2", links = "windowplugin"}) qt_add_static_plugins("QtQuickControls2Plugin", {linkdirs = "qml/QtQuick/Controls.2", links = "qtquickcontrols2plugin"}) qt_add_static_plugins("QtQuickTemplates2Plugin", {linkdirs = "qml/QtQuick/Templates.2", links = "qtquicktemplates2plugin"})
上面的配置中,咱們除了啓用 qt.quickapp_static
編譯規則,還經過 qt_add_static_plugins
配置了一些必須的 Qt 插件。
接下來,咱們只須要切換到 wasm 平臺,並確保 Qt SDK 已設置,便可完成編譯。
$ xmake f -p wasm [--qt=~/Qt] $ xmake
完成編譯後,xmake 會在 build 目錄下生成 demo.html 以及對應的 demo.js/demo.wasm 程序,咱們打開 demo.html 頁面便可運行咱們編譯的 Qt 程序,顯示效果以下圖:
關於 Qt/Wasm 更加詳細的說明,見:Issue #956
咱們新增了一個 set_fpmodels()
設置接口,用於設置浮點的編譯模式,對數學計算相關優化的編譯抽象設置,提供:fast, strict, except, precise 等幾種經常使用的級別,有些可同時設置,有些是有衝突的,最後設置的生效。
關於這些級別的說明,能夠參考下微軟的文檔:Specify floating-point behavior
固然,對應gcc/icc等其餘編譯器,xmake 會映射到不一樣的編譯flags。
set_fpmodels("fast") set_fpmodels("strict") set_fpmodels("fast", "except") set_fpmodels("precise") -- default
關於這塊詳情見:Issue #981
爲了更加抽象簡單的啓用 openmp 特性,咱們能夠經過新增的 c.openmp
和 c++.openmp
這兩個規則來設置,另外 linux、macOS 上咱們須要額外的 libomp 庫才行,所以能夠經過 add_requires("libomp")
來快速引用和集成。
add_requires("libomp", {optional = true}) target("loop") set_kind("binary") add_files("src/*.cpp") add_rules("c++.openmp") add_packages("libomp")
若是是c代碼,須要啓用 add_rules("c.openmp")
,若是是 c/c++ 混合編譯,那麼這兩個規則都要設置。
新版本中,xmake 對 set_languages
也作了改進,增長了新的 c11/c17 設置項,同時對最新版本 msvc 提供的 /std:c11
和 /std:c17
也作了適配和支持。
咱們只須要簡單的設置:
set_languages("c17")
便可啓用 c17 標準來編譯,即便低版本 msvc 等編譯器不支持,xmake 也會自動忽略設置。
關於這塊的改進,涉及幾個方面,首先是 Windows 下 Mingw SDK 根目錄的自動探測的改進,大部分狀況下,咱們都不須要額外配置 --mingw=
參數顯式指定路徑,也可以自動檢測到了。
關於這塊詳情,見:Issue #977
另外,除了 Msys2/Mingw 還有 macOS,linux/Mingw,咱們在新版本中還額外支持了 llvm-mingw 這個 SDK,使得咱們可使用 mingw 來編譯 arm/arm64 架構的程序。
$ xmake f -p mingw -a arm64 $ xmake
另外,在遠程依賴包的自動編譯集成上,如今帶有 cmakelists 的第三方庫,即便是 mingw 平臺,xmake 也能自動編譯集成進來直接使用,很是的快速方便。
而最近 xmake-repo 官方 C/C++ 包倉庫中,咱們也新增收入了很多支持 mingw 平臺的新庫,可直接使用。
咱們新增了對 mips64 架構的 linux 系統運行支持,另外改進了 arm/arm64 下 xmake 的運行穩定性,經過合入最新的 luajit v2.1 ,解決了不少 luajit 遺留的問題,好比 arm64 下 lightuserdata 的 bad pointer 等問題。
xmake 還對最新的 Xcode-beta 進行了適配,新增了 macOs for arm64 的目標程序編譯支持,只須要切到 arm64 架構編譯便可。
$ xmake f -a arm64 [--xcode=Applications/Xcode-beta.app/] $ xmake
固然,前提是在 macOS 下運行,而且使用最新支持 Developer Transition Kit (DTK) 的 Xcode-beta 版本才行。
在 xmake 的官方 C/C++ 倉庫 xmake-repo 中,咱們最近新增了幾十個經常使用的 C/C++ 庫,而且還對 libx11 系列的庫都所有進行了收錄。
雖然,倉庫的包維護工做量巨大,可是目前的發展趨勢也日趨活躍,咱們收到了愈來愈多的用戶對倉庫包的貢獻和改進維護。
而且,如今咱們的官方倉庫已經能夠快速集成:linux, macOS, windows, mingw, bsd, msys, iphoneos, android 等八大經常使用平臺的庫,實現真正的跨平臺 C/C++ 遠程依賴庫集成和使用支持。
目前咱們收錄的一些包列表和支持平臺,能夠從這裏查看:PKGLIST.md
咱們一直在努力解決 C/C++ 庫生態的雜亂、集成使用繁瑣等問題,提供快速一致的自動集成和編譯方案,xmake 不只支持 vcpkg/conan/clib/homebrew 等第三方官方倉庫包的集成,而且也在努力完善自建的官方倉庫,實現更好的集成體驗。
例如:
add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8") add_requires("conan::openssl/1.1.1g", {alias = "openssl", optional = true, debug = true}) target("test") set_kind("binary") add_files("src/*.c") add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl")
帶有 vcpkg::
,brew::
和 conan::
等命名空間的包,會自動切換到對應的第三方包倉庫去下載集成,而默認的 tbox >1.6.1
等庫,則會默認使用 xmake-repo 官方倉庫中提供的包。
使用和集成方式徹底一致,xmake 會自動下載、編譯、集成和連接。
關於遠程包的依賴集成的更多詳細說明,咱們能夠看下相關的文檔說明:遠程依賴庫集成和使用
同時,咱們也歡迎更多的人蔘與進來,幫忙一塊兒改善 C/C++ 的庫生態的建設,提供簡潔一致的庫使用體驗,我相信 C/C++ 包管理和庫生態並不比 Rust/Go 差。
在新版本中,咱們將 xmake 提交了 Ubuntu PPA 源,所以除了現有的腳本安裝方式外,咱們也能夠經過 apt 去快速安裝 xmake。
sudo add-apt-repository ppa:xmake-io/xmake sudo apt update sudo apt install xmake
同時,咱們也將包提交到了 Copr 包管理倉庫,使得咱們也能夠在 Fedora, RHEL,OpenSUSE,CentOS 等發行版中,經過 dnf 來快速安裝 xmake。
sudo dnf copr enable waruqi/xmake sudo dnf install xmake
近期,咱們也上線了官方的 xmake 入門課程,Xmake 帶你輕鬆構建 C/C++ 項目 以邊學邊作實驗的方式快速學習 xmake 的使用。
depend.on_changed()
去簡化依賴文件的處理set_fpmodels()
去抽象化設置math/float-point編譯優化模式c11
/c17
支持add_rules("c++.openmp")
add_requires("zlib~xxx")
模式使得可以支持同時安裝帶有多種配置的同一個包,做爲獨立包存在