首頁>技術>

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: xxx@gmail.com (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: xxx@gmail.com (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: waruqi@gmail.com (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: waruqi@gmail.com (T3NA4MRVPU)"$ xmake l utils.ipa.resign test.ipa "Apple Development: waruqi@gmail.com (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程式。

202

iOS

Lua

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 與其他語言相比,Java有多安全?