summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-02-07 00:50:37 +0800
committerruki <[email protected]>2025-02-07 00:50:37 +0800
commit94262ef203d602f0ae84433b834173373633bebf (patch)
treecc26d38694789daad80de856e74fd15321c527d7
parentc58753d3ed258177c10957659ad0426742f5a090 (diff)
improve embed files for lni
-rw-r--r--core/src/xmake/engine.c59
-rw-r--r--core/src/xmake/engine.h8
-rw-r--r--tests/projects/xmake_cli/hello/src/lni/main.c3
-rw-r--r--tests/projects/xmake_cli/hello/xmake.lua2
-rw-r--r--xmake/rules/xmake_cli/xmake.lua13
5 files changed, 71 insertions, 14 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index 8753607d4..500bca5c0 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -98,6 +98,11 @@ typedef struct __xm_engine_t
#ifdef XM_EMBED_ENABLE
// the temporary directory
tb_char_t tmpdir[TB_PATH_MAXN];
+
+ // the embed files
+ tb_byte_t const* embeddata[32];
+ tb_size_t embedsize[32];
+ tb_size_t embedcount;
#endif
}xm_engine_t;
@@ -812,8 +817,15 @@ static tb_bool_t xm_engine_get_program_directory(xm_engine_t* engine, tb_char_t*
do
{
#ifdef XM_EMBED_ENABLE
- // get it from the temporary directory
- tb_strlcpy(path, engine->tmpdir, maxn);
+ tb_size_t embedcount = engine->embedcount;
+ if (embedcount)
+ {
+ tb_uint32_t crc32 = 0;
+ for (tb_size_t i = 0; i < embedcount; i++)
+ crc32 += tb_crc32_make(engine->embeddata[i], engine->embedsize[i], 0);
+ tb_snprintf(path, maxn, "%s/%x", engine->tmpdir, crc32);
+ }
+ else tb_strlcpy(path, engine->tmpdir, maxn);
ok = tb_true;
break;
#endif
@@ -1189,14 +1201,8 @@ static tb_pointer_t xm_engine_lua_realloc(tb_pointer_t udata, tb_pointer_t data,
#endif
#ifdef XM_EMBED_ENABLE
-static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t const* programdir)
+static tb_bool_t xm_engine_extract_programfiles_impl(xm_engine_t* engine, tb_char_t const* programdir, tb_byte_t const* data, tb_size_t size)
{
- tb_file_info_t info = {0};
- if (tb_file_info(programdir, &info)) return tb_true;
-
- tb_byte_t const* data = g_xmake_xmz_data;
- tb_size_t size = sizeof(g_xmake_xmz_data);
-
// do decompress
tb_bool_t ok = tb_false;
LZ4F_errorCode_t code;
@@ -1289,6 +1295,28 @@ static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t c
tb_buffer_exit(&result);
return ok;
}
+
+static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t const* programdir)
+{
+ tb_file_info_t info = {0};
+ if (!tb_file_info(programdir, &info))
+ {
+ tb_byte_t const* data = g_xmake_xmz_data;
+ tb_size_t size = sizeof(g_xmake_xmz_data);
+ if (!xm_engine_extract_programfiles_impl(engine, programdir, data, size))
+ return tb_false;
+
+ tb_size_t embedcount = engine->embedcount;
+ for (tb_size_t i = 0; i < embedcount; i++)
+ {
+ data = engine->embeddata[i];
+ size = engine->embedsize[i];
+ if (!xm_engine_extract_programfiles_impl(engine, programdir, data, size))
+ return tb_false;
+ }
+ }
+ return tb_true;
+}
#endif
/* //////////////////////////////////////////////////////////////////////////////////////
@@ -1560,6 +1588,18 @@ tb_void_t xm_engine_register(xm_engine_ref_t self, tb_char_t const* module, luaL
xm_lua_register(engine->lua, tb_null, funcs);
lua_rawset(engine->lua, -3);
}
+#ifdef XM_EMBED_ENABLE
+tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t self, tb_byte_t const* data, tb_size_t size)
+{
+ // check
+ xm_engine_t* engine = (xm_engine_t*)self;
+ tb_assert_and_check_return(engine && engine->embedcount < tb_arrayn(engine->embedsize) && data && size);
+
+ engine->embeddata[engine->embedcount] = data;
+ engine->embedsize[engine->embedcount] = size;
+ engine->embedcount++;
+}
+#endif
tb_int_t xm_engine_run(tb_char_t const* name, tb_int_t argc, tb_char_t** argv, tb_char_t** taskargv, xm_engine_lni_initalizer_cb_t lni_initalizer)
{
tb_int_t ok = -1;
@@ -1575,3 +1615,4 @@ tb_int_t xm_engine_run(tb_char_t const* name, tb_int_t argc, tb_char_t** argv, t
}
return ok;
}
+
diff --git a/core/src/xmake/engine.h b/core/src/xmake/engine.h
index cc5a533ca..901e3997e 100644
--- a/core/src/xmake/engine.h
+++ b/core/src/xmake/engine.h
@@ -79,6 +79,14 @@ tb_int_t xm_engine_main(xm_engine_ref_t engine, tb_int_t argc
*/
tb_void_t xm_engine_register(xm_engine_ref_t engine, tb_char_t const* module, luaL_Reg const funcs[]);
+/*! add the embed files
+ *
+ * @param name the engine name
+ * @param data the embedfiles data
+ * @param size the data size
+ */
+tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t engine, tb_byte_t const* data, tb_size_t size);
+
/*! run main entry of the engine singleton
*
* @param name the engine name
diff --git a/tests/projects/xmake_cli/hello/src/lni/main.c b/tests/projects/xmake_cli/hello/src/lni/main.c
index 8996d83d3..d61d60dac 100644
--- a/tests/projects/xmake_cli/hello/src/lni/main.c
+++ b/tests/projects/xmake_cli/hello/src/lni/main.c
@@ -1,6 +1,6 @@
#include <xmake/xmake.h>
-static unsigned char g_luafiles_data[] = {
+static tb_byte_t const g_luafiles_data[] = {
#include "luafiles.xmz.h"
};
@@ -15,6 +15,7 @@ static tb_void_t lni_initalizer(xm_engine_ref_t engine, lua_State* lua) {
, {tb_null, tb_null}
};
xm_engine_register(engine, "test", lni_test_funcs);
+ xm_engine_add_embedfiles(engine, g_luafiles_data, sizeof(g_luafiles_data));
}
tb_int_t main(tb_int_t argc, tb_char_t** argv) {
diff --git a/tests/projects/xmake_cli/hello/xmake.lua b/tests/projects/xmake_cli/hello/xmake.lua
index c40a2826d..9923c85f7 100644
--- a/tests/projects/xmake_cli/hello/xmake.lua
+++ b/tests/projects/xmake_cli/hello/xmake.lua
@@ -5,6 +5,6 @@ add_requires("libxmake")
target("hello")
add_rules("xmake.cli")
add_files("src/lni/*.c")
- add_files("src/lua/*.lua")
+ add_files("src/lua/*.lua", {rootdir = "src"})
add_packages("libxmake")
diff --git a/xmake/rules/xmake_cli/xmake.lua b/xmake/rules/xmake_cli/xmake.lua
index 748e4f167..52b937a98 100644
--- a/xmake/rules/xmake_cli/xmake.lua
+++ b/xmake/rules/xmake_cli/xmake.lua
@@ -33,14 +33,21 @@ rule("xmake.cli")
end)
before_buildcmd_files(function (target, batchcmds, sourcebatch, opt)
+ import("private.core.base.match_copyfiles")
local sourcefiles = sourcebatch.sourcefiles
local archivefile = path.join(target:autogendir(), "rules", "xmake.cli", "luafiles.xmz")
local dependfile = archivefile .. ".d"
batchcmds:show_progress(opt.progress, "${color.build.target}archiving.luafiles %s", target:name())
- local argv = {"lua", "cli.archive", "-r", "-w", path(path.join(target:scriptdir(), "src")), "-o", path(archivefile)}
- for _, sourcefile in ipairs(sourcefiles) do
- table.insert(argv, path(sourcefile))
+ local luadir = path.join(target:autogendir(), "rules", "xmake.cli", "luafiles")
+ local argv = {"lua", "cli.archive", "-r", "-w", path(luadir), "-o", path(archivefile)}
+ local srcfiles, dstfiles = match_copyfiles(target, "files", path.join(luadir, "modules"))
+ for idx, srcfile in ipairs(srcfiles) do
+ if srcfile:endswith(".lua") then
+ local dstfile = dstfiles[idx]
+ batchcmds:cp(srcfile, dstfile)
+ table.insert(argv, path(dstfile))
+ end
end
batchcmds:vrunv(os.programfile(), argv, {envs = {XMAKE_SKIP_HISTORY = "y"}})