diff options
| -rwxr-xr-x | core/src/xmake/os/setenv.c | 80 | ||||
| -rw-r--r-- | xmake/scripts/action/_run.lua | 58 | ||||
| -rw-r--r-- | xmake/scripts/base/main.lua | 6 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/_maker.lua | 57 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/_windows.lua | 12 |
5 files changed, 194 insertions, 19 deletions
diff --git a/core/src/xmake/os/setenv.c b/core/src/xmake/os/setenv.c index 1b911bbdc..1dcf125ce 100755 --- a/core/src/xmake/os/setenv.c +++ b/core/src/xmake/os/setenv.c @@ -33,6 +33,17 @@ #include "prefix.h" /* ////////////////////////////////////////////////////////////////////////////////////// + * macros + */ + +// the separator +#ifdef TB_CONFIG_OS_WINDOWS +# define XM_OS_ENV_SEP ';' +#else +# define XM_OS_ENV_SEP ':' +#endif + +/* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ tb_int_t xm_os_setenv(lua_State* lua) @@ -41,12 +52,73 @@ tb_int_t xm_os_setenv(lua_State* lua) tb_assert_and_check_return_val(lua, 0); // get the name and value - tb_char_t const* name = luaL_checkstring(lua, 1); - tb_char_t const* value = luaL_checkstring(lua, 2); + size_t value_size = 0; + tb_char_t const* name = luaL_checkstring(lua, 1); + tb_char_t const* value = luaL_checklstring(lua, 2, &value_size); tb_check_return_val(name, 0); - // done os.setenv(name, value) - lua_pushboolean(lua, tb_environment_set_one(name, value)); + // find the first separator position + tb_char_t const* p = value? tb_strchr(value, XM_OS_ENV_SEP) : tb_null; + if (p) + { + // init filter + tb_bloom_filter_ref_t filter = tb_bloom_filter_init(TB_BLOOM_FILTER_PROBABILITY_0_1, 1, 32, tb_element_str(tb_true)); + + // init environment + tb_char_t data[TB_PATH_MAXN]; + tb_environment_ref_t environment = tb_environment_init(); + if (environment) + { + // make environment + tb_char_t const* b = value; + tb_char_t const* e = b + value_size; + do + { + // not empty? + if (b < p) + { + // the size + tb_size_t size = tb_min(p - b, sizeof(data) - 1); + + // copy it + tb_strlcpy(data, b, size); + data[size] = '\0'; + + // have been not inserted? + if (!filter || tb_bloom_filter_set(filter, data)) + { + // append the environment + tb_environment_set(environment, data, tb_false); + } + } + + // end? + tb_check_break(p + 1 < e); + + // find the next separator position + b = p + 1; + p = tb_strchr(b, XM_OS_ENV_SEP); + if (!p) p = e; + + } while (1); + + // done os.setenv(name, value) + lua_pushboolean(lua, tb_environment_save(environment, name)); + + // exit environment + tb_environment_exit(environment); + } + + // exit filter + if (filter) tb_bloom_filter_exit(filter); + filter = tb_null; + } + // only one? + else + { + // done os.setenv(name, value) + lua_pushboolean(lua, tb_environment_set_one(name, value)); + } // ok return 1; diff --git a/xmake/scripts/action/_run.lua b/xmake/scripts/action/_run.lua index 92972aa0b..8de5ab5f1 100644 --- a/xmake/scripts/action/_run.lua +++ b/xmake/scripts/action/_run.lua @@ -24,15 +24,67 @@ local _run = _run or {} -- load modules +local rule = require("base/rule") +local path = require("base/path") local utils = require("base/utils") local config = require("base/config") +local project = require("base/project") -- done the given config function _run.done() - - -- ok - return true + -- the options + local options = xmake._OPTIONS + assert(options and xmake._PROJECT_DIR) + + -- the target name + local name = options.target + if not name then + -- error + utils.error("no runable target!") + return false + end + + -- the targets + local targets = project.targets() + if not targets or not targets[name] then + -- error + utils.error("not found target: %s!", name) + return false + end + + -- the target + local target = targets[name] + if not target.kind or type(target.kind) ~= "string" or target.kind ~= "binary" then + -- error + utils.error("the target %s is not executale!", name) + return false + end + + -- the target file + local targetfile = rule.targetfile(name, target) + if targetfile and not path.is_absolute(targetfile) then + targetfile = path.absolute(targetfile, xmake._PROJECT_DIR) + end + + -- check the target file + if not targetfile and not os.isfile(targetfile) then + -- error + utils.error("not found target file: %s!", targetfile) + return false + end + + -- the arguments + local arguments = options.arguments or {} + if type(arguments) ~= "table" then + arguments = {} + end + + -- done + local ok = os.execute(string.format("%s %s", targetfile, table.concat(arguments))) + + -- ok? + return utils.ifelse(ok == 0, true, false) end -- return module: _run diff --git a/xmake/scripts/base/main.lua b/xmake/scripts/base/main.lua index 92df2c29c..830a958d6 100644 --- a/xmake/scripts/base/main.lua +++ b/xmake/scripts/base/main.lua @@ -343,7 +343,11 @@ local menu = -- options , options = { - {'f', "file", "kv", "xmake.xproj","Read a given xmake.xproj file." } + {'d', "debug", "k", nil, "Run and debug the given target." } + , {nil, "debugger", "kv", "auto", "Set the debugger path." } + + , {} + , {'f', "file", "kv", "xmake.xproj","Read a given xmake.xproj file." } , {'P', "project", "kv", nil, "Change to the given project directory." , "Search priority:" , " 1. The Given Command Argument" diff --git a/xmake/scripts/platform/windows/_maker.lua b/xmake/scripts/platform/windows/_maker.lua index 9b459ad45..f7bdddbf3 100644 --- a/xmake/scripts/platform/windows/_maker.lua +++ b/xmake/scripts/platform/windows/_maker.lua @@ -25,13 +25,57 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") +local config = require("base/config") -- define module: _maker local _maker = _maker or {} +-- enter the given environment +function _maker._enter(name) + + -- check + assert(name) + + -- get the pathes for the vs environment + local old = nil + local new = config.get("__vsenv_" .. name) + if new then + + -- get the current pathes + old = os.getenv(name) or "" + + -- append the current pathes + new = new .. ";" .. old + + -- update the pathes for the environment + os.setenv(name, new) + end + + -- return the previous environment + return old; +end + +-- leave the given environment +function _maker._leave(name, old) + + -- check + assert(name) + + -- restore the previous environment + if old then + os.setenv(name, old) + end +end + -- build the target from the given makefile function _maker.done(mkfile, target) + -- enter the vs environment + local pathes = _maker._enter("path") + local libs = _maker._enter("lib") + local includes = _maker._enter("include") + local libpathes = _maker._enter("libpath") + -- make command local cmd = nil if mkfile and os.isfile(mkfile) then @@ -42,12 +86,15 @@ function _maker.done(mkfile, target) -- done local ok = os.execute(cmd) - if ok ~= 0 then - return false - end - -- ok - return true + -- leave the vs environment + _maker._leave("path", pathes) + _maker._leave("lib", libs) + _maker._leave("include", includes) + _maker._leave("libpath", libpathes) + + -- ok? + return utils.ifelse(ok == 0, true, false) end -- return module: _maker diff --git a/xmake/scripts/platform/windows/_windows.lua b/xmake/scripts/platform/windows/_windows.lua index 012b0a0ff..b1bc0890b 100644 --- a/xmake/scripts/platform/windows/_windows.lua +++ b/xmake/scripts/platform/windows/_windows.lua @@ -46,18 +46,18 @@ function _windows.make(configs) configs.format.static = {"", ".lib"} configs.format.object = {"", ".obj"} configs.format.shared = {"", ".dll"} - configs.format.execute = {"", ".exe"} + configs.format.binary = {"", ".exe"} -- init the compiler configs.compiler = {} - configs.compiler.cc = config.get("cc") or "cl.exe" - configs.compiler.cxx = config.get("cxx") or "cl.exe" + configs.compiler.cc = config.get("cc") or "cl.exe" + configs.compiler.cxx = config.get("cxx") or "cl.exe" -- init the linker configs.linker = {} - configs.linker.binary = config.get("ld") or "link.exe" - configs.linker.static = config.get("ar") or "link.exe" - configs.linker.shared = config.get("sh") or "link.exe" + configs.linker.binary = config.get("ld") or "link.exe" + configs.linker.static = config.get("ar") or "link.exe" + configs.linker.shared = config.get("sh") or "link.exe" end |
