這個版本重點對其他語言的支援做了一些改進,比如新增了fortran的編譯支援,zig語言的實驗性支援,另外對golang/dlang增加了第三方依賴包支援以及交叉編譯支援。
雖然,xmake重點關注c/c++的構建支援,但是其他語言的支援xmake也會不定期做一些改進,其主要目的並不是替代它們官方自身的構建系統,僅僅只是為了支援與c/c++的混合編譯,更好的為c/c++專案服務, 畢竟有些c/c++專案中,還是會偶爾呼叫其他語言的程式碼介面,比如與cuda, dlang, objc,swift, asm等語言的混合呼叫,所以xmake還是會對他們做一些基礎性的編譯支援。
另外,關於c/c++方面,我們也對vs預覽版中新的/sourceDependencies xxx.json
輸出的標頭檔案依賴格式也做了支援(這對於多語言下,標頭檔案依賴檢測會更加的可靠穩定)。
這個版本開始,我們已經完全支援使用gfortran編譯器來編譯fortran專案,我們可以透過下面的命令,快速建立一個基於fortran的空工程:
$ xmake create -l fortran -t console test
它的xmake.lua內容如下:
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.f90")
更多程式碼例子可以到這裡檢視:Fortran Examples
注:目前這個語言xmake還在試驗性支援階段,還很不完善,比如:windows上不支援,linux/macOS下動態庫編譯還不支援,請自行評估使用。
我們可以透過下面的配置方式,嘗試性體驗下,至少linux/macOS下console和static library程式還是可以跑的。
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.zig")
至於為啥windows不支援呢,詳情見我之前提給zig的issues,#5825
而動態庫不支援,也是因為我躺了一些坑(zig生成的動態庫會自動追加.0.0.0
),詳情見:issue 5827
另外還躺了下其他坑,個人感覺坑有點多,所以我暫時還是試驗階段,等過段時間再看看。
更多例子見:Zig Examples
新版本xmake對go構建支援繼續做了一些改進,比如對go的交叉編譯也進行了支援,例如我們可以在macOS和linux上編譯windows程式:
$ xmake f -p windows -a x86
另外,新版本對go的第三方依賴包管理也進行了初步支援:
add_rules("mode.debug", "mode.release")
add_requires("go::github.com/sirupsen/logrus", {alias = "logrus"})
add_requires("go::golang.org/x/sys/internal/unsafeheader", {alias = "unsafeheader"})
if is_plat("windows") then
add_requires("go::golang.org/x/sys/windows", {alias = "syshost"})
else
add_requires("go::golang.org/x/sys/unix", {alias = "syshost"})
end
target("test")
set_kind("binary")
add_files("src/*.go")
add_packages("logrus", "syshost", "unsafeheader")
不過還有一些不完善的地方,比如目前必須手動配置所有級聯依賴包,會稍微繁瑣些,後續有待改進。
更多例子見:Go Examples
xmake對dlang的dub包管理也進行了支援,可以快速整合dlang的第三方依賴包:
add_rules("mode.debug", "mode.release")
add_requires("dub::log 0.4.3", {alias = "log"})
add_requires("dub::dateparser", {alias = "dateparser"})
add_requires("dub::emsi_containers", {alias = "emsi_containers"})
add_requires("dub::stdx-allocator", {alias = "stdx-allocator"})
add_requires("dub::mir-core", {alias = "mir-core"})
target("test")
set_kind("binary")
add_files("src/*.d")
add_packages("log", "dateparser", "emsi_containers", "stdx-allocator", "mir-core")
msvc的標頭檔案依賴通常需要解析/showIncludes
的輸出內容,提取裡面的includes檔案列表來處理依賴編譯問題,但是呢,cl.exe對這個的輸出做的很不好,includes資訊和編譯輸出是混在一起的。
對構建工具處理依賴解析非常不友好,尤其是多語言環境下,如何判斷是includes,需要透過前置的Note: including file:
字串來判斷提取,但中文下,又是注意: 包含檔案:
, 如果換成日語環境,又是日文的字首字串,編碼格式問題、硬編碼問題導致解析處理上,總歸不是很完美。
關於這一點,最新的vs2019預覽版中,微軟終於對齊做了改進,透過新的/sourceDependencies xxx.json
編譯選項,可以更好的輸出includes依賴資訊,方便多語言環境下的解析提取。
另外,這個新選項的輸出是獨立到單獨的json檔案中去的,終於不是跟編譯輸出混一起了,也終於不用痛苦地解析分離編譯錯誤、警告資訊、includes列表資訊了。
輸出內容大概長這樣:
{
"Version": "1.0",
"Data": {
"Source": "z:\\personal\\tbox\\src\\tbox\\tbox.c",
"Includes": [
"z:\\personal\\tbox\\src\\tbox\\tbox.h",
"z:\\personal\\tbox\\src\\tbox\\prefix.h",
"z:\\personal\\tbox\\src\\tbox\\prefix\\prefix.h",
"z:\\personal\\tbox\\src\\tbox\\prefix\\config.h",
"z:\\personal\\tbox\\src\\tbox\\config.h",
...
而新版本中,xmake透過新增內建的core.base.json
模組處理json解析,很方便地對新的標頭檔案依賴資料進行解析和支援,優先使用此模式(如果cl是新版本支援的話,老版本cl還是使用/showIncludes
)。
目前,我們還沒有時間去自己實現xcode工程的生成,但不代表不支援,因為xmake支援生成cmakelists.txt檔案,而cmake是支援xcode工程檔案生成的,在官方還沒有實現之前, 我們也可以透過cmake變相支援它,xmake會自動內部呼叫cmake中轉下生成結果,對使用者而言使用上沒啥區別,只需要確保cmake已經安裝即可:
$ xmake project -k xcode
!> 等之後有時間,我們會重新自己實現各更加完善的xcode輸出外掛,也歡迎大家幫忙貢獻。
近期,我們也更新了下xmake-vscode外掛,透過自動生成compile_commands.json
到當前專案的.vscode
目錄下,然後我們只需要配置.vscode/c_cpp_properties.json
在裡面關聯上這個.vscode/compile_commands.json
路徑 就能實現intellisense自動提示,同步xmake.lua裡面的includedirs等配置資訊。
至於,具體怎麼生成c_cpp_properties
,官方文件裡面有詳細說明:https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation
裡面的主要配置項:
"configurations": [
{
"compileCommands": ".vscode/compile_commands.json",
}
],
xmake project -k cmake
(當前採用cmake生成)
[admin
]