summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamian Höster <[email protected]>2026-08-23 17:03:20 +0200
committerGitHub <[email protected]>2026-08-23 17:03:20 +0200
commit54dcc7b47b473dd9b065b13ce7da97b80b1e9649 (patch)
tree2c80316efab71f519f12d959d3c7a372ef2c4d85
parent0eb5c44e2ddb51f58ae76aadf823bacba51078f5 (diff)
parent05b1ec467142a02aad0304f1361c2b59491fffcd (diff)
Merge branch 'xmake-io:dev' into patch1
-rw-r--r--core/src/xmake/utf8/width.c6
-rw-r--r--tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua22
-rw-r--r--tests/projects/package/usage_requirements/src/main.cpp3
-rw-r--r--tests/projects/package/usage_requirements/src/usage.cpp7
-rw-r--r--tests/projects/package/usage_requirements/test.lua5
-rw-r--r--tests/projects/package/usage_requirements/xmake.lua35
-rw-r--r--xmake/core/base/poller.lua16
-rw-r--r--xmake/core/base/scheduler.lua14
-rw-r--r--xmake/platforms/bsd/xmake.lua4
-rw-r--r--xmake/platforms/cross/xmake.lua4
-rw-r--r--xmake/platforms/linux/xmake.lua2
-rw-r--r--xmake/platforms/solaris/xmake.lua4
12 files changed, 31 insertions, 91 deletions
diff --git a/core/src/xmake/utf8/width.c b/core/src/xmake/utf8/width.c
index 615572462..fb79ee198 100644
--- a/core/src/xmake/utf8/width.c
+++ b/core/src/xmake/utf8/width.c
@@ -33,7 +33,11 @@
* utf8.width(codepoint)
*/
tb_int_t xm_utf8_width(lua_State* lua) {
- if (lua_isnumber(lua, 1)) {
+ /* we must not use lua_isnumber() here: it also accepts a numeric string,
+ * so utf8.width("9") would return the width of the code point 9 (a tab)
+ * instead of the width of the string "9"
+ */
+ if (lua_type(lua, 1) == LUA_TNUMBER) {
xm_utf8_int_t val = (xm_utf8_int_t)lua_tointeger(lua, 1);
lua_pushinteger(lua, xm_utf8_charwidth(val));
} else {
diff --git a/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua b/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua
deleted file mode 100644
index c62605e3c..000000000
--- a/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-package("usage-requirements")
- set_kind("library", {headeronly = true})
- set_sourcedir(path.join(os.scriptdir(), "src"))
-
- add_components("enabled")
- add_components("disabled")
-
- on_load(function (package)
- package:add("vectorexts", "avx")
- end)
-
- on_component("enabled", function (package, component)
- component:add("vectorexts", "avx2")
- end)
-
- on_component("disabled", function (package, component)
- component:add("vectorexts", "avx512")
- end)
-
- on_install(function (package)
- os.cp("README.md", package:installdir())
- end)
diff --git a/tests/projects/package/usage_requirements/src/main.cpp b/tests/projects/package/usage_requirements/src/main.cpp
deleted file mode 100644
index 33c14ce1d..000000000
--- a/tests/projects/package/usage_requirements/src/main.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-int main() {
- return 0;
-}
diff --git a/tests/projects/package/usage_requirements/src/usage.cpp b/tests/projects/package/usage_requirements/src/usage.cpp
deleted file mode 100644
index b1fbda2b3..000000000
--- a/tests/projects/package/usage_requirements/src/usage.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-#if !defined(__AVX2__) && !defined(_M_AVX2) && !defined(__AVX2)
-# error AVX2 is required by the package
-#endif
-
-int usage() {
- return 0;
-}
diff --git a/tests/projects/package/usage_requirements/test.lua b/tests/projects/package/usage_requirements/test.lua
deleted file mode 100644
index ca225630a..000000000
--- a/tests/projects/package/usage_requirements/test.lua
+++ /dev/null
@@ -1,5 +0,0 @@
-function main(t)
- if os.subarch():startswith("x") or os.subarch() == "i386" then
- t:build()
- end
-end
diff --git a/tests/projects/package/usage_requirements/xmake.lua b/tests/projects/package/usage_requirements/xmake.lua
deleted file mode 100644
index 7f9eb9107..000000000
--- a/tests/projects/package/usage_requirements/xmake.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-add_rules("mode.debug", "mode.release")
-
-add_repositories("usage-requirements-repo repo")
-add_requires("usage-requirements", {system = false})
-
-local function _has_value_from(target, name, source, expected)
- local values = target:get_from(name, source, {interface = true})
- for _, source_values in ipairs(values or {}) do
- if table.contains(table.wrap(source_values), expected) then
- return true
- end
- end
-end
-
-target("usage")
- set_kind("static")
- add_files("src/usage.cpp")
- add_packages("usage-requirements", {components = "enabled", public = true})
- before_build(function (target)
- local package = assert(target:pkg("usage-requirements"))
- assert(table.contains(package:get("vectorexts"), "avx"))
- assert(_has_value_from(target, "vectorexts", "package::*", "avx"))
- assert(_has_value_from(target, "vectorexts", "package::*", "avx2"))
- assert(not _has_value_from(target, "vectorexts", "package::*", "avx512"))
- end)
-
-target("consumer")
- set_kind("binary")
- add_deps("usage")
- add_files("src/main.cpp")
- before_build(function (target)
- assert(_has_value_from(target, "vectorexts", "dep::usage/package::*", "avx"))
- assert(_has_value_from(target, "vectorexts", "dep::usage/package::*", "avx2"))
- assert(not _has_value_from(target, "vectorexts", "dep::usage/package::*", "avx512"))
- end)
diff --git a/xmake/core/base/poller.lua b/xmake/core/base/poller.lua
index bb18dfda4..43c3bea1a 100644
--- a/xmake/core/base/poller.lua
+++ b/xmake/core/base/poller.lua
@@ -124,7 +124,7 @@ function poller:remove(obj)
end
-- remove poller object data
- self:_pollerdata_set(obj, nil)
+ self:_pollerdata_set(obj:cdata(), nil)
return true
end
@@ -153,13 +153,15 @@ function poller:wait(timeout)
local otype = v[1]
local cdata = v[2]
local events = v[3]
- local pollerdata = self:_pollerdata(cdata)
- if not pollerdata then
- return -1, string.format("no object data for cdata(%s)!", cdata)
+ -- this object may have been removed from the poller while its event
+ -- was already collected, e.g. a pending overlapped io on windows,
+ -- we just drop it, it has no owner any more, @see poller:remove()
+ local pollerdata = self:_pollerdata(cdata)
+ if pollerdata then
+ local obj = pollerdata[1]
+ assert(obj and obj:otype() == otype and obj:cdata() == cdata)
+ table.insert(results, {obj, events, pollerdata[2]})
end
- local obj = pollerdata[1]
- assert(obj and obj:otype() == otype and obj:cdata() == cdata)
- table.insert(results, {obj, events, pollerdata[2]})
end
end
return count, results
diff --git a/xmake/core/base/scheduler.lua b/xmake/core/base/scheduler.lua
index a59c38207..4ae8d74e0 100644
--- a/xmake/core/base/scheduler.lua
+++ b/xmake/core/base/scheduler.lua
@@ -304,9 +304,17 @@ end
function scheduler:_poller_events_cb(obj, events)
-- get poller object data
+ --
+ -- the object may have been cancelled while its event was already queued,
+ -- e.g. a process which exits right after we stopped waiting for it,
+ -- @see scheduler:poller_cancel()
+ --
+ -- such an event has no owner any more, we just drop it: it is not an
+ -- error of the scheduler and it must not abort the whole loop
local pollerdata = self:_poller_data(obj)
if not pollerdata then
- return false, string.format("%s: cannot get poller data!", obj)
+ utils.dprint("%s: drop the event(%d), it has been cancelled!", obj, events)
+ return true
end
-- is process/fwatcher object?
@@ -1068,6 +1076,10 @@ function scheduler:poller_waitproc(obj, timeout)
running:waitobj_set(obj)
-- wait
+ --
+ -- @note we keep this process in the poller if it is timeout, so its exit status
+ -- is still saved as a pending status when it exits later, and the next wait
+ -- returns it immediately, @see scheduler:_poller_events_cb()
local ok = self:co_suspend()
return ok, pollerdata.object_event
end
diff --git a/xmake/platforms/bsd/xmake.lua b/xmake/platforms/bsd/xmake.lua
index 98143d019..89ab580fe 100644
--- a/xmake/platforms/bsd/xmake.lua
+++ b/xmake/platforms/bsd/xmake.lua
@@ -21,7 +21,7 @@
platform("bsd")
set_os("bsd")
set_hosts("bsd")
- set_archs("i386", "x86_64")
+ set_archs("i386", "x86_64", "arm", "arm64", "ppc", "ppc64", "ppc64el", "riscv64", "sparc64")
set_formats("static", "lib$(name).a")
set_formats("object", "$(name).o")
@@ -53,5 +53,3 @@ platform("bsd")
, {nil, "qt_host", "kv", "auto", "The Qt Host SDK Directory" }
}
}
-
-
diff --git a/xmake/platforms/cross/xmake.lua b/xmake/platforms/cross/xmake.lua
index 98bb31634..462fc961b 100644
--- a/xmake/platforms/cross/xmake.lua
+++ b/xmake/platforms/cross/xmake.lua
@@ -20,7 +20,7 @@
platform("cross")
set_hosts("macosx", "linux", "windows", "bsd")
- set_archs("i386", "x86_64", "arm", "arm64", "mips", "mips64", "riscv", "riscv64", "loong64", "s390x", "ppc", "ppc64", "sh4")
+ set_archs("i386", "x86_64", "arm", "armv7", "arm64", "mips", "mips64", "mips64el", "riscv", "riscv64", "loong64", "s390x", "ppc", "ppc64", "ppc64el", "sh4", "sparc64")
set_formats("static", "lib$(name).a")
set_formats("object", "$(name).o")
@@ -28,5 +28,3 @@ platform("cross")
set_formats("symbol", "$(name).sym")
set_toolchains("envs", "cross")
-
-
diff --git a/xmake/platforms/linux/xmake.lua b/xmake/platforms/linux/xmake.lua
index c4d09880e..c26f99fb5 100644
--- a/xmake/platforms/linux/xmake.lua
+++ b/xmake/platforms/linux/xmake.lua
@@ -21,7 +21,7 @@
platform("linux")
set_os("linux")
set_hosts("macosx", "linux", "windows", "bsd")
- set_archs("i386", "x86_64", "armv7", "armv7s", "arm64", "mips", "mips64", "mipsel", "mips64el", "loong64")
+ set_archs("i386", "x86_64", "armv7", "armv7s", "arm64", "mips", "mips64", "mipsel", "mips64el", "loong64", "riscv64", "s390x", "ppc", "ppc64", "ppc64el", "sparc64")
set_formats("static", "lib$(name).a")
set_formats("object", "$(name).o")
diff --git a/xmake/platforms/solaris/xmake.lua b/xmake/platforms/solaris/xmake.lua
index 5abdde4fb..260bc138b 100644
--- a/xmake/platforms/solaris/xmake.lua
+++ b/xmake/platforms/solaris/xmake.lua
@@ -21,7 +21,7 @@
platform("solaris")
set_os("solaris")
set_hosts("solaris")
- set_archs("i386", "x86_64")
+ set_archs("i386", "x86_64", "sparc64")
set_formats("static", "lib$(name).a")
set_formats("object", "$(name).o")
@@ -53,5 +53,3 @@ platform("solaris")
, {nil, "qt_host", "kv", "auto", "The Qt Host SDK Directory" }
}
}
-
-