xmake是一個基於lua的現代化c/c++構建工具。
這個版本主要是對內建的構建規則做了些擴充套件,新增了相關規則來實現對iOS/MacOS相關App應用程式專案、Framework和Bundle程式的構建支援。
並且支援App簽名,也提供了相關工程模板來快速建立應用程式,另外此版本還對Qt的開發構建也做了不少改進,增加對Qt5.14.0新版本sdk的支援,對android的打包部署支援上也改進了不少。
處理之外,xmake還提供了一個特殊的xmake.cli構建rule,通過整合libxmake engine庫,來擴充套件開發基於xmake引擎的程式,比如:做個定製版的xmake,也可以基於此寫點lua指令碼程式。
專案原始碼官方文件更新內容新特性#727: 支援為android, ios程式生成.so/.dSYM符號檔案#687: 支援編譯生成objc/bundle程式#743: 支援編譯生成objc/framework程式支援編譯bundle, framework程式,以及mac, ios應用程式,並新增一些工程模板支援對ios應用程式打包生成ipa檔案,以及程式碼簽名支援增加一些ipa打包、安裝、重簽名等輔助工具新增xmake.cli規則來支援開發帶有xmake/core引擎的lua擴充套件程式改進#750: 改進qt.widgetapp規則,支援qt私有槽改進Qt/android的apk部署,並且支援Qt5.14.0新版本sdk構建iOS/MacOS程式構建App應用程式用於生成.app/.ipa應用程式,同時支援iOS/MacOS。
target("test") add_rules("xcode.application") add_files("src/*.m", "src/**.storyboard", "src/*.xcassets") add_files("src/Info.plist")
建立工程
我們也可以通過模板工程快速建立:
$ xmake create -t xcode.macapp -l objc test$ xmake create -t xcode.iosapp -l objc test
編譯
$ xmake f -p [iphoneos|macosx]$ xmake[ 18%]: compiling.xcode.release src/Assets.xcassets[ 27%]: processing.xcode.release src/Info.plist[ 72%]: compiling.xcode.release src/Base.lproj/Main.storyboard[ 81%]: compiling.xcode.release src/Base.lproj/LaunchScreen.storyboard[ 45%]: ccache compiling.release src/ViewController.m[ 63%]: ccache compiling.release src/AppDelegate.m[ 54%]: ccache compiling.release src/SceneDelegate.m[ 36%]: ccache compiling.release src/main.m[ 90%]: linking.release test[100%]: generating.xcode.release test.app[100%]: build ok!
配置簽名對於iOS程式,預設會檢測系統先用可用簽名來簽名app,當然我們也可以手動指定其他簽名證書:
$ xmake f -p iphoneos --xcode_codesign_identity='Apple Development: [email protected] (T3NA4MRVPU)' --xcode_mobile_provision='iOS Team Provisioning Profile: org.tboox.test --xcode_bundle_identifier=org.tboox.test'$ xmake
如果每次這麼配置簽名覺得繁瑣的話,可以設定到xmake global全域性配置中,也可以在xmake.lua中對每個target單獨設定:
target("test") add_rules("xcode.application") add_files("src/*.m", "src/**.storyboard", "src/*.xcassets") add_files("src/Info.plist") add_values("xcode.bundle_identifier", "org.tboox.test") add_values("xcode.codesign_identity", "Apple Development: [email protected] (T3NA4MRVPU)") add_values("xcode.mobile_provision", "iOS Team Provisioning Profile: org.tboox.test")
那如何知道我們需要的簽名配置呢?一種就是在xcode裡面檢視,另外xmake也提供了一些輔助工具可以dump出當前可用的所有簽名配置:
$ xmake l private.tools.codesign.dump==================================== codesign identities ===================================={ "Apple Development: [email protected] (T3NA4MRVPU)" = "AF73C231A0C35335B72761BD3759694739D34EB1" }===================================== mobile provisions ====================================={ "iOS Team Provisioning Profile: org.tboox.test" = "<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict>\t<key>AppIDName</key>\t<string>XC org tboox test5</string>\t<key>ApplicationIdentifierPrefix</key>\t<array>\t<string>43AAQM58X3</string>...
我們也提供了其他輔助工具來對已有的ipa/app程式進行重簽名,例如:
$ xmake l utils.ipa.resign test.ipa|test.app [codesign_identity] [mobile_provision] [bundle_identifier]
其中,後面的簽名引數都是可選的,如果沒設定,那麼預設會探測使用一個有效的簽名:
$ xmake l utils.ipa.resign test.ipa$ xmake l utils.ipa.resign test.app "Apple Development: [email protected] (T3NA4MRVPU)"$ xmake l utils.ipa.resign test.ipa "Apple Development: [email protected] (T3NA4MRVPU)" iOS Team Provisioning Profile: org.tboox.test" org.tboox.test
執行應用程式
目前僅支援執行macos程式:
$ xmake run
生成程式包
如果是iOS程式會生成ipa安裝包,如果是macos會生成dmg包(dmg包生成暫時還在開發中)。
$ xmake packageoutput: build/iphoneos/release/arm64/test.ipapackage ok!
我們也提供了輔助工具,來對指定app程式進行打包:
$ xmake l utils.ipa.package test.app output.ipa [iconfile.png]
安裝
如果是iOS程式會安裝ipa到裝置,如果是macos會安裝app到/Applications目錄。
$ xmake install
我們也提供了輔助工具,來對指定ipa/app程式安裝到裝置:
$ xmake l utils.ipa.install test.app$ xmake l utils.ipa.install test.ipa
解除安裝
!> 目前僅支援macos程式解除安裝
$ xmake uninstall
構建Framework庫程式
target("test") add_rules("xcode.framework") add_files("src/*.m") add_files("src/Info.plist")
我們也可以通過模板工程快速建立:
$ xmake create -t xcode.framework -l objc test
構建Bundle程式target("test") add_rules("xcode.bundle") add_files("src/*.m") add_files("src/Info.plist")
我們也可以通過模板工程快速建立:
$ xmake create -t xcode.bundle -l objc test
xmake.cli程式
關於這塊,主要還是方便我個人自己用來寫一些基於xmake engine的lua程式,當然使用者也可以用來擴充套件定製自己的xmake版本。現在xmake開放了libxmake開發庫,我們可以通過:
add_requires("libxmake")target("test") add_rules("xmake.cli") add_files("src/*.c") add_packages("libxmake")
來快速整合libxmake庫做定製化開發。
定製化擴充套件xmake一個典型的例子就是,我們可以用xmake.cli快速編譯構建出xmake自身,並且使用者可以在此基礎做二次開發,相關例子程式碼見:myxmake
add_rules("mode.debug", "mode.release")add_requires("libxmake")target("xmake") add_rules("xmake.cli") add_files("src/*.c") if is_plat("windows") then add_files("src/*.rc") end add_packages("libxmake")
只需要自己在main函式裡面呼叫libxmake介面建立自己的xmake engine就行了:
#include <xmake/xmake.h>tb_int_t main(tb_int_t argc, tb_char_t** argv){ return xm_engine_run("xmake", argc, argv, tb_null, tb_null);}
lua指令碼程式開發
我們可以利用xmake.cli快速寫一些基於lua的xmake engine的命令列小工具,利用xmake內建的各種modules,來開發一些原型程式。
基於此,我寫了個獨立完整的小專案,可以參考下:luject, 一個靜態注入動態庫的工具。
大致的專案結構非常簡單:
luject - src - lni -- main.c -- lua -- main.lua
其中,lni目錄用於通過c/lua互動,利用豐富的c/c++程式庫對lua介面進行擴充套件,而lua目錄用於通過lua指令碼來快速實現程式邏輯,下面是luject的xmake.lua構建描述:
set_xmakever("2.3.3")add_rules("mode.debug", "mode.release")add_requires("libxmake", "lief")if is_plat("windows") then if is_mode("release") then add_cxflags("-MT") elseif is_mode("debug") then add_cxflags("-MTd") end add_cxxflags("-EHsc", "-FIiso646.h") add_ldflags("-nodefaultlib:msvcrt.lib")endtarget("luject") add_rules("xmake.cli") add_files("src/lni/*.cpp") set_languages("c++14") add_packages("libxmake", "lief") add_installfiles("res/*", {prefixdir = "share/luject/res"})includes("tests")
編譯安裝非常簡單,只需要:
xmakexmake install
我們也可以直接載入執行:
xmake run
雖然跟python/ruby這種完整龐然大物和生態沒法比,xmake.cli主要還是對於一些習慣lua語法的使用者快速寫一些小指令碼程式,並且提供一種通過c快速擴充套件介面的能力。
後期,我會在lanoox專案組專門放置自己平時寫的一些xmake.cli程式。