ww: select sources by Go platform suffixes

This commit is contained in:
2026-08-14 21:25:16 +09:00
parent c59a7c11de
commit f138844737
3 changed files with 391 additions and 47 deletions

View File

@@ -582,9 +582,108 @@ fn pkgisreg(path: str) bool = {
};
};
fn pkgnamerangeis(name: str, start: i32, end: i32, word: str) bool = {
if (end < start || end - start != word.len) { return false; };
let i: i32 = 0;
for (i < end - start) {
if (name[start + i] != word[i]) { return false; };
i += 1;
};
return true;
};
fn pkgknownos(name: str, start: i32, end: i32) bool = {
return pkgnamerangeis(name, start, end, "aix")
|| pkgnamerangeis(name, start, end, "android")
|| pkgnamerangeis(name, start, end, "darwin")
|| pkgnamerangeis(name, start, end, "dragonfly")
|| pkgnamerangeis(name, start, end, "freebsd")
|| pkgnamerangeis(name, start, end, "hurd")
|| pkgnamerangeis(name, start, end, "illumos")
|| pkgnamerangeis(name, start, end, "ios")
|| pkgnamerangeis(name, start, end, "js")
|| pkgnamerangeis(name, start, end, "linux")
|| pkgnamerangeis(name, start, end, "nacl")
|| pkgnamerangeis(name, start, end, "netbsd")
|| pkgnamerangeis(name, start, end, "openbsd")
|| pkgnamerangeis(name, start, end, "plan9")
|| pkgnamerangeis(name, start, end, "solaris")
|| pkgnamerangeis(name, start, end, "wasip1")
|| pkgnamerangeis(name, start, end, "windows")
|| pkgnamerangeis(name, start, end, "zos");
};
fn pkgknownarch(name: str, start: i32, end: i32) bool = {
return pkgnamerangeis(name, start, end, "386")
|| pkgnamerangeis(name, start, end, "amd64")
|| pkgnamerangeis(name, start, end, "amd64p32")
|| pkgnamerangeis(name, start, end, "arm")
|| pkgnamerangeis(name, start, end, "armbe")
|| pkgnamerangeis(name, start, end, "arm64")
|| pkgnamerangeis(name, start, end, "arm64be")
|| pkgnamerangeis(name, start, end, "loong64")
|| pkgnamerangeis(name, start, end, "mips")
|| pkgnamerangeis(name, start, end, "mipsle")
|| pkgnamerangeis(name, start, end, "mips64")
|| pkgnamerangeis(name, start, end, "mips64le")
|| pkgnamerangeis(name, start, end, "mips64p32")
|| pkgnamerangeis(name, start, end, "mips64p32le")
|| pkgnamerangeis(name, start, end, "ppc")
|| pkgnamerangeis(name, start, end, "ppc64")
|| pkgnamerangeis(name, start, end, "ppc64le")
|| pkgnamerangeis(name, start, end, "riscv")
|| pkgnamerangeis(name, start, end, "riscv64")
|| pkgnamerangeis(name, start, end, "s390")
|| pkgnamerangeis(name, start, end, "s390x")
|| pkgnamerangeis(name, start, end, "sparc")
|| pkgnamerangeis(name, start, end, "sparc64")
|| pkgnamerangeis(name, start, end, "wasm");
};
fn pkgtargettag(name: str, start: i32, end: i32) bool = {
return pkgnamerangeis(name, start, end, "linux")
|| pkgnamerangeis(name, start, end, "amd64");
};
// Recursive discovery must decide platform eligibility before a source can
// enter any production or test package graph.
fn pkgsourceplatform(name: str) bool = {
let stem: i32 = 0;
let hasunderscore: bool = false;
for (stem < name.len && name[stem] != '.') {
if (name[stem] == '_') { hasunderscore = true; };
stem += 1;
};
if (!hasunderscore) { return true; };
let end: i32 = stem;
let last: i32 = end;
for (last > 0 && name[last - 1] != '_') { last -= 1; };
if (pkgnamerangeis(name, last, end, "test")) {
if (last == 0) { return true; };
end = last - 1;
last = end;
for (last > 0 && name[last - 1] != '_') { last -= 1; };
};
if (last == 0) { return true; };
let prevend: i32 = last - 1;
let prev: i32 = prevend;
for (prev > 0 && name[prev - 1] != '_') { prev -= 1; };
if (prev < prevend && pkgknownos(name, prev, prevend)
&& pkgknownarch(name, last, end)) {
return pkgtargettag(name, last, end)
&& pkgtargettag(name, prev, prevend);
};
if (pkgknownos(name, last, end) || pkgknownarch(name, last, end)) {
return pkgtargettag(name, last, end);
};
return true;
};
fn pkgkeepfile(name: str) bool = {
if (name.len <= 3 || name[0] == '.' || name[0] == '_') { return false; };
return strings.hassuffix(name, ".ww");
return strings.hassuffix(name, ".ww") && pkgsourceplatform(name);
};
type pkgmatcher = struct {