xmake提供了自定义打包、安装、运行脚本,能够更加灵活的针对我的实际需求来操做xmakejava
这里用一个例子详细说明下,好比有个需求,我须要自动编译、安装、运行android app工程,而且可以支持jni 能够进行以下操做android
首先建立个基于ant的android app工程,目录结构以下:git
app └── android ├── AndroidManifest.xml ├── ant.properties ├── bin │ └── Demo-debug.apk ├── build.xml ├── jni │ └── demo.c ├── libs │ └── armeabi │ └── libdemo.so ├── local.properties ├── proguard-project.txt ├── project.properties ├── res │ ├── drawable-hdpi │ │ └── ic_launcher.png │ ├── drawable-ldpi │ │ └── ic_launcher.png │ ├── drawable-mdpi │ │ └── ic_launcher.png │ ├── drawable-xhdpi │ │ └── ic_launcher.png │ ├── layout │ │ └── main.xml │ └── values │ └── strings.xml ├── src │ └── com │ └── demo │ └── DemoTest.java └── xmake.lua
-- 添加一个android app的测试demogithub
add_target("demo") -- 生成动态库:libdemo.so set_kind("shared") -- 设置对象的输出目录,可选 set_objectdir("$(buildir)/.objs") -- 每次编译完的libdemo.so的生成目录,设置为app/libs/armeabi set_targetdir("libs/armeabi") -- 添加jni的代码文件 add_files("jni/*.c") -- 设置自定义打包脚本,在使用xmake编译完libdemo.so后,执行xmake p进行打包 -- 会自动使用ant将app编译成apk文件 -- -- target参数提供了一些编译目标的信息,例如:目标文件路径,目标类型等等 -- 具体有哪些信息,能够调用 utils.dump(target) 打印出来 -- 固然首先得import("utils")导入这个utils模块 set_packagescript( function (target) -- 导入一些内置模块 local os = import("os") local path = import("path") local project = import("project") assert(target and os and path and project) -- 获取编译错误输出的日志文件,用于重定向输出,可选 -- 通常用于隐藏ant工具的内部输出信息,可是编译出错后,xmake会去自动显示出来 local logfile = path.absolute(project.logfile()) -- 首先清除app的bin的目录 os.rmdir("bin") -- 打印一些信息 print("buiding app") -- 使用ant编译app成apk文件,输出信息重定向到日志文件 if 0 ~= os.execute(string.format("ant debug > %s 2>&1", logfile)) then -- 出错后,显示日志文件中的信息 os.cat(logfile) return -1 end -- 若是成功打包,返回1,就再也不执行内置默认的打包流程了 -- 若是返回0,会继续执行内部默认的打包程序 -- 若是返回-1,说明打包失败,终止运行 return 1 end) -- 设置自定义安装脚本,自动安装apk文件 set_installscript( function (target) -- 导入一些内置模块 local os = import("os") local path = import("path") local project = import("project") assert(target and os and path and project) -- trace print("installing app") -- the logfile local logfile = path.absolute(project.logfile()) -- 使用adb安装打包生成的apk文件 if 0 ~= os.execute(string.format("adb install -r ./bin/Demo-debug.apk > %s 2>&1", logfile)) then -- failed os.cat(logfile) return -1 end -- ok return 1 end) -- 设置自定义运行脚本,自动运行安装好的app程序,而且自动获取设备输出信息 set_runscript( function (target) -- 导入一些内置模块 local os = import("os") assert(target and os) -- 设置过滤器,来过滤设备输出信息,固然默认也能够不设置 -- 使用以下:xmake r demo filter local filter = nil if target.arguments ~= nil then filter = target.arguments[1] end local cmd = "adb shell am start -n com.demo/com.demo.DemoTest ; adb logcat" if filter ~= nil then cmd = cmd .. " | grep " .. filter end -- 使用adb运行app程序 if 0 ~= os.execute(cmd) then return -1 end -- ok return 1 end)
修改完xmake.lua后,就能够很方便的使用了:shell
# 从新编译工程,生成libdemo.so到app/libs/armeabi xmake -r # 打包app为apk xmake p # 安装apk到设备上 xmake i # 运行app,并获取日志信息 xmake r demo
若是以为上面的步骤有点繁琐,能够简化成:bash
-- 安装的时候,会先去自动打包,因此能够省略xmake p xmake -r; xmake i; xmake r demo
若是是增量编译,不须要重建,能够继续简化:app
xmake i; xmake r demo
固然,因为是根据本身的实际需求自定义的脚本,可能跨平台性有点弱,像这里只能支持android的编译平台,工具
你也可使用 if plats("android") then ... end
来作一些跨平台处理测试