diff options
| author | ruki <[email protected]> | 2025-02-07 00:50:37 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-02-07 00:50:37 +0800 |
| commit | 94262ef203d602f0ae84433b834173373633bebf (patch) | |
| tree | cc26d38694789daad80de856e74fd15321c527d7 | |
| parent | c58753d3ed258177c10957659ad0426742f5a090 (diff) | |
improve embed files for lni
| -rw-r--r-- | core/src/xmake/engine.c | 59 | ||||
| -rw-r--r-- | core/src/xmake/engine.h | 8 | ||||
| -rw-r--r-- | tests/projects/xmake_cli/hello/src/lni/main.c | 3 | ||||
| -rw-r--r-- | tests/projects/xmake_cli/hello/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/rules/xmake_cli/xmake.lua | 13 |
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"}}) |
