summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTitanSnow <[email protected]>2017-05-23 19:51:30 +0800
committerTitanSnow <[email protected]>2017-05-23 19:51:41 +0800
commit550e0a96ce87a164d6a74b915d4ffa49ac9455fd (patch)
treefb34a2c28b1cc2c427903a3d63f8139ef9db67c2
parentf2e0d829b43011cce87568118a5b8b0b469ade1e (diff)
add xmake._EXECUTABLE_PATH to fix $(xmake)
$(xmake) is set to join(_PROGRAM_DIR, 'xmake') that is wrong when XMAKE_PROGRAM_DIR is set to another program dir (like developing dir) with no executable so use system-special ways to get absolution path of executable file always
-rw-r--r--core/src/xmake/machine.c94
-rw-r--r--xmake/core/_xmake_main.lua1
-rw-r--r--xmake/core/project/project.lua2
-rw-r--r--xmake/core/project/task.lua2
4 files changed, 65 insertions, 34 deletions
diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c
index ccfd91254..f6818d3be 100644
--- a/core/src/xmake/machine.c
+++ b/core/src/xmake/machine.c
@@ -244,29 +244,39 @@ static tb_bool_t xm_machine_main_get_program_directory(xm_machine_impl_t* impl,
{
// ok
ok = tb_true;
- break;
+ // not break // even XMAKE_PROGRAM_DIR is set, exact path is needed
}
#if defined(TB_CONFIG_OS_WINDOWS)
// get the executale file path as program directory
- tb_size_t size = (tb_size_t)GetModuleFileName(tb_null, path, (DWORD)maxn);
+ tb_size_t size = (tb_size_t)GetModuleFileName(tb_null, data, (DWORD)maxn);
tb_assert_and_check_break(size < maxn);
// end
- path[size] = '\0';
+ data[size] = '\0';
- // get the directory
- while (size-- > 0)
+ // set _EXECUTABLE_PATH
+ lua_pushstring(impl -> lua, data);
+ lua_setglobal(impl -> lua, "_EXECUTABLE_PATH");
+
+ if (!ok)
{
- if (path[size] == '\\')
+ // get the directory
+ while (size-- > 0)
{
- path[size] = '\0';
- break;
+ if (data[size] == '\\')
+ {
+ data[size] = '\0';
+ break;
+ }
}
- }
- // ok
- ok = tb_true;
+ // copy to path
+ tb_strcpy(path, data);
+
+ // ok
+ ok = tb_true;
+ }
#elif defined(TB_CONFIG_OS_MACOSX)
/*
* _NSGetExecutablePath() copies the path of the main executable into the buffer. The bufsize parameter
@@ -279,44 +289,64 @@ static tb_bool_t xm_machine_main_get_program_directory(xm_machine_impl_t* impl,
* needed could be more than MAXPATHLEN.
*/
tb_uint32_t size = (tb_uint32_t)maxn;
- if (!_NSGetExecutablePath(path, &size))
+ if (!_NSGetExecutablePath(data, &size))
{
- // get path size
- size = tb_strlen(path);
+ // set _EXECUTABLE_PATH
+ lua_pushstring(impl -> lua, data);
+ lua_setglobal(impl -> lua, "_EXECUTABLE_PATH");
- // get the directory
- while (size-- > 0)
+ if (!ok)
{
- if (path[size] == '/')
+ // get path size
+ size = tb_strlen(data);
+
+ // get the directory
+ while (size-- > 0)
{
- path[size] = '\0';
- break;
+ if (data[size] == '/')
+ {
+ data[size] = '\0';
+ break;
+ }
}
- }
- // ok
- ok = tb_true;
+ // copy to path
+ tb_strcpy(path, data);
+
+ // ok
+ ok = tb_true;
+ }
}
#elif defined(TB_CONFIG_OS_LINUX)
// get the executale file path as program directory
- ssize_t size = readlink("/proc/self/exe", path, (size_t)maxn);
+ ssize_t size = readlink("/proc/self/exe", data, (size_t)maxn);
if (size > 0 && size < maxn)
{
// end
- path[size] = '\0';
+ data[size] = '\0';
- // get the directory
- while (size-- > 0)
+ // set _EXECUTABLE_PATH
+ lua_pushstring(impl -> lua, data);
+ lua_setglobal(impl -> lua, "_EXECUTABLE_PATH");
+
+ if (!ok)
{
- if (path[size] == '/')
+ // get the directory
+ while (size-- > 0)
{
- path[size] = '\0';
- break;
+ if (data[size] == '/')
+ {
+ data[size] = '\0';
+ break;
+ }
}
- }
- // ok
- ok = tb_true;
+ // copy to path
+ tb_strcpy(path, data);
+
+ // ok
+ ok = tb_true;
+ }
}
#endif
diff --git a/xmake/core/_xmake_main.lua b/xmake/core/_xmake_main.lua
index 1f169e4af..c454406c0 100644
--- a/xmake/core/_xmake_main.lua
+++ b/xmake/core/_xmake_main.lua
@@ -36,6 +36,7 @@ xmake._CORE_DIR = _PROGRAM_DIR .. "/core"
xmake._TOOLS_DIR = _PROGRAM_DIR .. "/tools"
xmake._TEMPLATES_DIR = _PROGRAM_DIR .. "/templates"
xmake._PROJECT_FILE = "xmake.lua"
+xmake._EXECUTABLE_PATH = _EXECUTABLE_PATH
-- init package path
package.path = xmake._CORE_DIR .. "/?.lua;" .. package.path
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 6dff6d1a4..e68f399ca 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -320,7 +320,7 @@ function project._interpreter()
, projectdir = project.directory()
, packagedir = package.directory()
, programdir = xmake._PROGRAM_DIR
- , xmake = path.join(xmake._PROGRAM_DIR, "xmake")
+ , xmake = xmake._EXECUTABLE_PATH or path.join(xmake._PROGRAM_DIR, "xmake")
}
-- map it
diff --git a/xmake/core/project/task.lua b/xmake/core/project/task.lua
index 0111dd6e9..732a33b34 100644
--- a/xmake/core/project/task.lua
+++ b/xmake/core/project/task.lua
@@ -204,7 +204,7 @@ function task._interpreter()
, projectdir = xmake._PROJECT_DIR
, packagedir = package.directory()
, programdir = xmake._PROGRAM_DIR
- , xmake = path.join(xmake._PROGRAM_DIR, "xmake")
+ , xmake = xmake._EXECUTABLE_PATH or path.join(xmake._PROGRAM_DIR, "xmake")
}
-- map it