Skip to content

IDE integration in native code #6137

@waruqi

Description

@waruqi

Is your feature request related to a problem? Please describe.

Use libxmake to get project information in c/c++ code

main.c

#include <xmake/xmake.h>

static lua_State* g_lua = tb_null;
static tb_void_t lni_initalizer(xm_engine_ref_t engine, lua_State* lua) {
    g_lua = lua;
}

static tb_char_t const* load_scriptfile(xm_engine_ref_t engine, tb_char_t const* filepath, tb_char_t const* arg1) {
    // reset result first
    lua_getglobal(g_lua, "_lni");
    lua_pushnil(g_lua);
    lua_setfield(g_lua, -2, "result");
    lua_pop(g_lua, 1);

    // load script and get result (string)
    tb_char_t* argv[] = {"xmake"};
    tb_char_t* taskargv[] = {"lua", "-D", (tb_char_t*)filepath, (tb_char_t*)arg1, tb_null};
    tb_char_t const* result = tb_null;
    if (xm_engine_main(engine, 1, argv, taskargv) == 0) {
        lua_getglobal(g_lua, "_lni");
        lua_getfield(g_lua, -1, "result");
        if (lua_isstring(g_lua, -1)) {
            result = tb_strdup(lua_tostring(g_lua, -1));
        }
        lua_pop(g_lua, 2);
    }
    return result;
}

static tb_void_t dump_targets(xm_engine_ref_t engine) {
    tb_trace_i("------------------------- targets -------------------------");
    tb_char_t const* result = load_scriptfile(engine, "assets/targets.lua", tb_null);
    if (result) {
        tb_trace_i("result: %s", result);
        tb_free(result);
    }
}

static tb_void_t dump_targetpath(xm_engine_ref_t engine) {
    tb_trace_i("------------------------- targetpath -------------------------");
    tb_char_t const* result = load_scriptfile(engine, "assets/targetpath.lua", "ide");
    if (result) {
        tb_trace_i("result: %s", result);
        tb_free(result);
    }
}

tb_int_t main(tb_int_t argc, tb_char_t** argv) {
    if (xm_init()) {
        xm_engine_ref_t engine = xm_engine_init("xmake", lni_initalizer);
        if (engine) {
            dump_targets(engine);
            dump_targetpath(engine);
            xm_engine_exit(engine);
        }
        xm_exit();
    }
    return 0;
}

xmake.lua

add_rules("mode.debug", "mode.release")
add_requires("libxmake")
target("ide")
    add_files("src/*.c")
    add_packages("libxmake")
    set_rundir(".")

assets/targets.lua

import("core.project.config")
import("core.project.project")
import("core.base.json")
import("lib.lni")

function main ()
    config.load()

    local names = {}
    for name, _ in pairs((project.targets())) do
        table.insert(names, name)
    end
    table.sort(names)
    if json.mark_as_array then
        json.mark_as_array(names)
    end
    lni.result = json.encode(names)
end

Example

https://github.com/xmake-io/xmake/tree/dev/tests/projects/xmake_cli/ide_integration

Output

ruki-2:ide_integration ruki$ xmake -r
[ 50%]: cache compiling.release src/main.c
[ 75%]: linking.release ide
[100%]: build ok, spent 0.231s
ruki-2:ide_integration ruki$ xmake run
------------------------- targets -------------------------
result: ["ide"]
------------------------- targetpath -------------------------
result: /Users/ruki/projects/personal/xmake/tests/projects/xmake_cli/ide_int
egration/build/macosx/x86_64/release/ide

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions