這個版本主要對Cuda項目的構建做了很多的改進,並且新增了對lex/yacc編譯支持,同時也對target新增了on_link
, before_link
和after_link
等鏈接階段的定製化支持。
這裡,我還要感謝下@OpportunityLiu對xmake的支持,這個版本中OpportunityLiu貢獻了大量的代碼去改進Cuda的支持。 此外,他還幫忙改進了xmake的整個單元測試框架,自更新程序,命令行tab補全以及ci腳本,使得xmake的更新迭代更加高效和穩定。
2.2.6之前的版本,對cuda的編譯支持並不是很完善,至少連頭文件依賴檢測也是沒有提供的,因此如果cuda代碼一多,每次改動都會編譯所有,並不能像c/c++代碼那樣做到檢測改動,進行增量編譯。
而在新版本中,xmake對其進行了支持,現在已經可以很好的在不同平台下,處理依賴關係了,這對日常編譯和開發效率也會有不少的提升。
之前的版本,添加gencodes配置非常的繁瑣,並不簡潔,可以看下之前的配置:
target("cuda_console") set_kind("binary") add_files("src/*.cu") add_cuflags("-gencode arch=compute_30,code=sm_30", "-gencode arch=compute_35,code=sm_35") add_cuflags("-gencode arch=compute_37,code=sm_37", "-gencode arch=compute_50,code=sm_50") add_cuflags("-gencode arch=compute_52,code=sm_52", "-gencode arch=compute_60,code=sm_60") add_cuflags("-gencode arch=compute_61,code=sm_61", "-gencode arch=compute_70,code=sm_70") add_cuflags("-gencode arch=compute_70,code=compute_70") add_ldflags("-gencode arch=compute_30,code=sm_30", "-gencode arch=compute_35,code=sm_35") add_ldflags("-gencode arch=compute_37,code=sm_37", "-gencode arch=compute_50,code=sm_50") add_ldflags("-gencode arch=compute_52,code=sm_52", "-gencode arch=compute_60,code=sm_60") add_ldflags("-gencode arch=compute_61,code=sm_61", "-gencode arch=compute_70,code=sm_70") add_ldflags("-gencode arch=compute_70,code=compute_70")
因此為了精簡xmake.lua的配置,針對cuda項目增加的add_cugencodes
api來簡化配置,改進后如下:
target("cuda_console") set_kind("binary") add_files("src/*.cu") -- generate SASS code for each SM architecture add_cugencodes("sm_30", "sm_35", "sm_37", "sm_50", "sm_52", "sm_60", "sm_61", "sm_70") -- generate PTX code from the highest SM architecture to guarantee forward-compatibility add_cugencodes("compute_70")
另外當配置成add_cugencodes("native")
的時候,xmake會自動探測當前設備支持的gencodes,自動添加進來,會更加的方便高效。
這個,也要感謝下OpportunityLiu提供的探測代碼以及對add_cugencodes
的實現。
新版本中,xmake基本上重構了整個cuda的構建過程,將cuda相關構建抽離到獨立的cuda構建rule中去維護,並且默認採用了device-link的鏈接方式。
關於device-link的描述和好處,可以參考相關官方介紹:https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/
我們在編譯包含跨編譯單元的 __global__
或 __device__
函數的調用的時候也是需要devlink的,因此在xmake中,目前默認就是開啟了devlink。
對於用戶來講,並不需要對xmake.lua做任何改動,當然如果用戶想要手動禁用devlink,也是可以的:
target("test") set_kind("binary") add_files("src/*.cu") add_values("cuda.devlink", false) -- 顯式禁用默認的device-link行為
clang目前也支持對*.cu文件的編譯,不過不同版本的clang支持的cuda版本是有一定限制的,clang7隻能支持cuda7-9.2,8支持到10,要支持10.1得需要clang9。
而xmake除了支持調用nvcc來編譯cuda項目,也可以直接切到clang來編譯,例如:
xmake f --cu=clang xmake
不過關於devlink,似乎還是需要依賴nvcc,clang並不支持。
xmake新增了--ccbin=
參數可以配置切換,nvcc默認使用的c++編譯器和鏈接器,用法如下:
xmake f --ccbin=clang++ xmake
即可讓nvcc在編譯cuda代碼的時候,內部調用clang++編譯器。
在新版本中,我們加入了跟link鏈接階段相關的定製化處理,用戶可以通過在target/rule中實現on_link
, before_link
和after_link
來擴展定製自己的鏈接過程。
比如,我們想在正常c/c++代碼的鏈接階段前,預處理一些其他的事情,比如對*.o文件做些處理什麼的,那麼就可以在before_link階段寫點自己的lua腳本就行了:
target("test") before_link(function (target) print("process objects", target:objectfiles()) end)
或者我們想改寫內置的鏈接過程,可以用on_link
:
target("test") on_link(function (target) print("link objects", target:objectfiles()) end)
還有after_link
則是在鏈接完成之後,做一些定製化任務。
當前xmake已經可以原生支持lex/flex, yacc/bison等對.l/.y文件的編譯處理,來快速開發一些跟編譯器相關的項目。
我們只需要添加lex,yacc兩個規則到target中,使其可以正常處理.l/.y文件,當然.ll/.yy也是支持的。
target("calc") set_kind("binary") add_rules("lex", "yacc") add_files("src/*.l", "src/*.y")
這裡有個例子代碼,可供參考:lex_yacc_example
我們可以通過set_rundir
介面用於設置默認運行target程序的當前運行目錄,如果不設置,默認情況下,target是在可執行文件所在目錄載入運行。
如果用戶想要修改載入目錄,一種是通過on_run()
的方式自定義運行邏輯,裡面去做切換,但僅僅為了切個目錄就這麼做,太過繁瑣。
因此可以通過這個介面快速的對默認執行的目錄環境做設置切換。
target("test") set_kind("binary") add_files("src/*.c") set_rundir("$(projectdir)/xxx")
另外一個新介面add_runenvs
可用於添加設置默認運行target程序的環境變數。
target("test") set_kind("binary") add_files("src/*.c") add_runenvs("PATH", "/tmp/bin", "xxx/bin") add_runenvs("NAME", "value")
為了改善用戶體驗,新版本中對命令行下xmake命令參數tab補全也做了支持,用戶可以很方便快速的tab出xmake的所有命令參數。
當前支持zsh/bash/sh以及powershell。
之前的版本,xmake已經提供了方便的自更新命令xmake update
來更新xmake自身版本,甚至是更新指定分支版本,例如:xmake update dev/master
但是,還有些不足的地方:
每次更新都需要重新編譯core,所以更新很慢,然而很多情況下,新版本僅僅只有腳本變動,core並不會變
更新指定dev/master分支,在windows上實現的並不完美,有點滯后,並不能即時同步到線上dev/master版本。
因此,這塊OpportunityLiu幫忙做了很多的改進工作:
提供xmake update -s/--scriptonly
參數,僅僅更新lua腳本,不去額外編譯core,實現快速的迭代更新
改進ci腳本,在windows上實現ci自動化構建,xmake update dev
自動拉取ci上預構建好的安裝包下載更新
可以指定從其他github repo上更新xmake,方便貢獻者更新自己的fork版本,也方便用戶切換鏡像repo,xmake update gitee:tboox/xmake
#440: 為target/run添加set_rundir()
和add_runenvs()
介面設置
#443: 添加命令行tab自動完成支持
為rule/target添加on_link
,before_link
和after_link
階段自定義腳本支持
#190: 添加add_rules("lex", "yacc")
規則去支持lex/yacc項目
[admin
]