summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-12-16 23:37:27 +0800
committerruki <[email protected]>2025-12-16 23:37:27 +0800
commit5537af295c452f1bbc1875c27b285a35a167f44e (patch)
tree86e9148f37081cd27d463c0b854e23856c1ca596
parentfb8a3f6b216638783cd25600a02f7527dabd91cf (diff)
add incbuild support
-rw-r--r--xmake/rules/ndk/package.lua93
1 files changed, 53 insertions, 40 deletions
diff --git a/xmake/rules/ndk/package.lua b/xmake/rules/ndk/package.lua
index 797efa22e..076c78217 100644
--- a/xmake/rules/ndk/package.lua
+++ b/xmake/rules/ndk/package.lua
@@ -19,6 +19,7 @@
--
-- imports
+import("core.project.depend")
import("utils.progress")
-- main entry
@@ -36,56 +37,68 @@ function main(target, opt)
assert(android_manifest, "android manifest not set")
local final_apk = path.join(target:targetdir(), target:basename() .. ".apk")
- progress.show(opt.progress, "${color.build.target}packing.apk %s", final_apk)
- local tmp_path = path.join(target:targetdir(), "temp")
- os.mkdir(tmp_path)
- os.mkdir(path.join(tmp_path, "lib"))
- os.mkdir(path.join(tmp_path, "lib", target:arch()))
+ -- add dependencies
+ local depfiles = {target:targetfile(), android_manifest, keystore}
+ if android_res and os.isdir(android_res) then
+ table.join2(depfiles, os.files(path.join(android_res, "**")))
+ end
+ if android_assets and os.isdir(android_assets) then
+ table.join2(depfiles, os.files(path.join(android_assets, "**")))
+ end
- -- copy the target library to temp folder with name libmain.so
- local libfile = path.join(tmp_path, "lib", target:arch(), "libmain.so")
- os.cp(target:targetfile(), libfile)
+ depend.on_changed(function ()
+ progress.show(opt.progress, "${color.build.target}packing.apk %s", final_apk)
- -- get android tool path
- local android_sdkdir = target:toolchain("ndk"):config("android_sdk")
- local android_build_toolver = target:toolchain("ndk"):config("build_toolver")
- local sdk_tool_path = path.join(android_sdkdir, "build-tools", android_build_toolver)
+ local tmp_path = path.join(target:targetdir(), "temp")
+ os.mkdir(tmp_path)
+ os.mkdir(path.join(tmp_path, "lib"))
+ os.mkdir(path.join(tmp_path, "lib", target:arch()))
- local aapt = path.join(sdk_tool_path, "aapt" .. (is_host("windows") and ".exe" or ""))
- local zipalign = path.join(sdk_tool_path, "zipalign" .. (is_host("windows") and ".exe" or ""))
- local apksigner = path.join(sdk_tool_path, "apksigner" .. (is_host("windows") and ".bat" or ""))
+ -- copy the target library to temp folder with name libmain.so
+ local libfile = path.join(tmp_path, "lib", target:arch(), "libmain.so")
+ os.cp(target:targetfile(), libfile)
- -- pack resources
- local resonly_apk = path.join(tmp_path, "res_only.apk")
- local androidjar = path.join(android_sdkdir, "platforms", string.format("android-%s", android_sdk_version),
- "android.jar")
- assert(os.exists(androidjar), "%s not found", androidjar)
- local aapt_argv = {"package", "-f", "-M", android_manifest, "-I", androidjar, "-F", resonly_apk}
+ -- get android tool path
+ local android_sdkdir = target:toolchain("ndk"):config("android_sdk")
+ local android_build_toolver = target:toolchain("ndk"):config("build_toolver")
+ local sdk_tool_path = path.join(android_sdkdir, "build-tools", android_build_toolver)
- if android_res and not os.emptydir(android_res) then
- table.insert(aapt_argv, "-S")
- table.insert(aapt_argv, android_res)
- end
+ local aapt = path.join(sdk_tool_path, "aapt" .. (is_host("windows") and ".exe" or ""))
+ local zipalign = path.join(sdk_tool_path, "zipalign" .. (is_host("windows") and ".exe" or ""))
+ local apksigner = path.join(sdk_tool_path, "apksigner" .. (is_host("windows") and ".bat" or ""))
- if android_assets and not os.emptydir(android_assets) then
- table.insert(aapt_argv, "-A")
- table.insert(aapt_argv, android_assets)
- end
+ -- pack resources
+ local resonly_apk = path.join(tmp_path, "res_only.apk")
+ local androidjar = path.join(android_sdkdir, "platforms", string.format("android-%s", android_sdk_version),
+ "android.jar")
+ assert(os.exists(androidjar), "%s not found", androidjar)
+ local aapt_argv = {"package", "-f", "-M", android_manifest, "-I", androidjar, "-F", resonly_apk}
+
+ if android_res and not os.emptydir(android_res) then
+ table.insert(aapt_argv, "-S")
+ table.insert(aapt_argv, android_res)
+ end
+
+ if android_assets and not os.emptydir(android_assets) then
+ table.insert(aapt_argv, "-A")
+ table.insert(aapt_argv, android_assets)
+ end
- os.vrunv(aapt, aapt_argv)
+ os.vrunv(aapt, aapt_argv)
- -- pack libs
- os.vrunv(aapt, {"add", "res_only.apk", "lib/" .. target:arch() .."/libmain.so"}, {curdir = tmp_path})
+ -- pack libs
+ os.vrunv(aapt, {"add", "res_only.apk", "lib/" .. target:arch() .."/libmain.so"}, {curdir = tmp_path})
- -- align apk
- local aligned_apk = path.join(tmp_path, "unsigned.apk")
- local zipalign_argv = {"-f", "4", "res_only.apk", "unsigned.apk"}
+ -- align apk
+ local aligned_apk = path.join(tmp_path, "unsigned.apk")
+ local zipalign_argv = {"-f", "4", "res_only.apk", "unsigned.apk"}
- os.vrunv(zipalign, zipalign_argv, {curdir = tmp_path})
+ os.vrunv(zipalign, zipalign_argv, {curdir = tmp_path})
- -- sign apk
- local apksigner_argv = {"sign", "--ks", keystore, "--ks-pass", string.format("pass:%s", keystore_pass), "--out",
- final_apk, "--in", aligned_apk}
- os.vrunv(apksigner, apksigner_argv)
+ -- sign apk
+ local apksigner_argv = {"sign", "--ks", keystore, "--ks-pass", string.format("pass:%s", keystore_pass), "--out",
+ final_apk, "--in", aligned_apk}
+ os.vrunv(apksigner, apksigner_argv)
+ end, {dependfile = target:dependfile(final_apk), files = depfiles, values = {android_sdk_version, keystore_pass}})
end