summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2022-10-20 22:52:22 +0800
committerruki <[email protected]>2022-10-20 22:52:22 +0800
commite6affabd6e20bbb179fea1f315414142cef650e3 (patch)
tree65bee5a1a7b23ff406a68d8be7344cbcc700ef4d /core/src
parent163516962fe212c7c6c3e7e7dd108438349fd292 (diff)
support openbsd
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/engine.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index 7e67dbece..20b845ccb 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -619,6 +619,13 @@ static tb_size_t xm_engine_get_program_file(xm_engine_t* engine, tb_char_t* path
tb_bool_t ok = tb_false;
do
{
+ // get it from the environment variable first
+ if (tb_environment_first("XMAKE_PROGRAM_FILE", path, maxn) && tb_file_info(path, tb_null))
+ {
+ ok = tb_true;
+ break;
+ }
+
#if defined(TB_CONFIG_OS_WINDOWS)
// get the executale file path as program directory
tb_wchar_t buf[TB_PATH_MAXN] = {0};
@@ -647,7 +654,8 @@ static tb_size_t xm_engine_get_program_file(xm_engine_t* engine, tb_char_t* path
tb_uint32_t bufsize = (tb_uint32_t)maxn;
if (!_NSGetExecutablePath(path, &bufsize))
ok = tb_true;
-#elif defined(TB_CONFIG_OS_BSD)
+#elif defined(TB_CONFIG_OS_BSD) && defined(KERN_PROC_PATHNAME)
+ // only for freebsd, https://github.com/xmake-io/xmake/issues/2948
tb_int_t mib[4]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PATHNAME; mib[3] = -1;
size_t size = maxn;
if (sysctl(mib, 4, path, &size, tb_null, 0) == 0 && size < maxn)
@@ -663,6 +671,23 @@ static tb_size_t xm_engine_get_program_file(xm_engine_t* engine, tb_char_t* path
path[size] = '\0';
ok = tb_true;
}
+#else
+ static tb_char_t const* s_paths[] =
+ {
+ "~/.local/bin/xmake",
+ "/usr/local/bin/xmake",
+ "/usr/bin/xmake"
+ };
+ for (tb_size_t i = 0; i < tb_arrayn(s_paths); i++)
+ {
+ tb_char_t const* p = s_paths[i];
+ if (tb_file_info(p, tb_null))
+ {
+ tb_strlcpy(path, p, maxn);
+ ok = tb_true;
+ break;
+ }
+ }
#endif
} while (0);