summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-03 16:21:14 +0800
committerruki <[email protected]>2015-06-03 16:21:14 +0800
commitfc3638d5128d6f652d79df8985ca5efcb104d22f (patch)
tree87ddca12301de8a3e19b210708288ebfdee31f28
parentbcb0d8e7eb53865f627cadd79eb181de34e86f5a (diff)
run the given target
-rwxr-xr-xcore/src/xmake/os/setenv.c80
-rw-r--r--xmake/scripts/action/_run.lua58
-rw-r--r--xmake/scripts/base/main.lua6
-rw-r--r--xmake/scripts/platform/windows/_maker.lua57
-rw-r--r--xmake/scripts/platform/windows/_windows.lua12
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