From 3975dd3e0f6d446241841cdf5c011d4f5f77b5eb Mon Sep 17 00:00:00 2001 From: Ophestra Date: Wed, 1 Jul 2026 14:25:30 +0900 Subject: [PATCH] internal/rosa: create /bin symlinks via helper This centralises the workaround for surprisingly common buggy scripts with nonstandard hardcoded paths. Signed-off-by: Ophestra --- .gitignore | 1 + internal/rosa/llvm.go | 18 +++++++--------- internal/rosa/package/acl/package.az | 6 ++---- internal/rosa/package/git.az | 4 ++-- internal/rosa/package/gnu.az | 5 +---- internal/rosa/package/libcap.az | 4 ++-- internal/rosa/package/libinput.az | 3 +-- internal/rosa/package/libseccomp/package.az | 3 +-- internal/rosa/package/lm_sensors.az | 8 ++----- internal/rosa/package/netfilter/package.az | 2 +- internal/rosa/package/ninja.az | 9 ++++---- internal/rosa/package/pcre2.az | 7 ++---- internal/rosa/package/rdfind.az | 7 +++--- internal/rosa/package/util-linux.az | 3 +-- internal/rosa/package/x.az | 5 +---- internal/rosa/rosa.go | 24 +++++++++++++++++++++ internal/rosa/state.go | 20 +++++++++-------- 17 files changed, 67 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 72917bd6..5be5f0ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # produced by tools and text editors +*.swp *.qcow2 *.test *.out diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go index 397cfe20..8fd515d2 100644 --- a/internal/rosa/llvm.go +++ b/internal/rosa/llvm.go @@ -341,6 +341,13 @@ ln -s \ return &meta, t.NewPackage("llvm", meta.Version, source, &PackageAttr{ Flag: TExclusive, + Bin: []string{ + "chmod", + "mkdir", + "rm", + "tr", + "awk", + }, }, &CMakeHelper{ Append: []string{"llvm"}, @@ -358,16 +365,7 @@ ln -s clang++ /work/system/bin/c++ // on 3-stage determinism to test later stages. SkipTest: t.stage.isStage0(), - Test: ` -chmod +w /bin && ln -s \ - ../system/bin/chmod \ - ../system/bin/mkdir \ - ../system/bin/rm \ - ../system/bin/tr \ - ../system/bin/awk \ - /bin -ninja ` + jobsFlagE + ` check-all -`, + Test: "ninja " + jobsFlagE + " check-all", }, _python, _perl, diff --git a/internal/rosa/package/acl/package.az b/internal/rosa/package/acl/package.az index 1317ae02..d4e4a13e 100644 --- a/internal/rosa/package/acl/package.az +++ b/internal/rosa/package/acl/package.az @@ -13,10 +13,8 @@ package attr { patches = [ "musl-errno.patch" ]; - early = ` -ln -s ../../system/bin/perl /usr/bin -`; - + bin = [ "perl" ]; + populateUsrBin = true; exec = make {}; inputs = [ diff --git a/internal/rosa/package/git.az b/internal/rosa/package/git.az index ffa6bb5a..f2da8ef5 100644 --- a/internal/rosa/package/git.az +++ b/internal/rosa/package/git.az @@ -12,8 +12,6 @@ package git { }; early = ` -ln -s ../../system/bin/perl /usr/bin/ || true - # test suite assumes apache rm -f /system/bin/httpd `; @@ -22,6 +20,8 @@ rm -f /system/bin/httpd enterSource = true; env = [ "NO_RUST=YesPlease" ]; + bin = [ "perl" ]; + populateUsrBin = true; exec = make { inPlace = true; generate = "make configure"; diff --git a/internal/rosa/package/gnu.az b/internal/rosa/package/gnu.az index c27fc2d8..49b8a933 100644 --- a/internal/rosa/package/gnu.az +++ b/internal/rosa/package/gnu.az @@ -511,10 +511,7 @@ package parallel { compress = bzip2; }; - early = ` -ln -s ../system/bin/bash /bin/ -`; - + bin = [ "bash" ]; exec = make {}; inputs = [ diff --git a/internal/rosa/package/libcap.az b/internal/rosa/package/libcap.az index 3816bc5d..6f6eb355 100644 --- a/internal/rosa/package/libcap.az +++ b/internal/rosa/package/libcap.az @@ -12,6 +12,7 @@ package libcap { }; // uses source tree as scratch space + enterSource = true; writable = true; chmod = true; @@ -20,8 +21,7 @@ package libcap { "lib=lib", ]; - early = "\nln -s ../system/bin/bash /bin/\n"; - + bin = [ "bash" ]; exec = make { skipConfigure = true; inPlace = true; diff --git a/internal/rosa/package/libinput.az b/internal/rosa/package/libinput.az index 90725e14..272f33c1 100644 --- a/internal/rosa/package/libinput.az +++ b/internal/rosa/package/libinput.az @@ -11,8 +11,7 @@ package libinput { checksum = "GxBGPN6YybQxrD2MDsIL8gdDYImXn4NAJi6EvTx_Hb_1jcbjwCrjeyjY2upUyTMi"; }; - early = "ln -sf ../system/bin/bash /bin/\n"; - + bin = [ "bash" ]; exec = meson { setup = { "Dmtdev": "false"; diff --git a/internal/rosa/package/libseccomp/package.az b/internal/rosa/package/libseccomp/package.az index 486a423a..71069849 100644 --- a/internal/rosa/package/libseccomp/package.az +++ b/internal/rosa/package/libseccomp/package.az @@ -13,8 +13,7 @@ package libseccomp { }; patches = [ "fix-export-oob-read.patch" ]; - early = "\nln -s ../system/bin/bash /bin/\n"; - + bin = [ "bash" ]; exec = make {}; inputs = [ diff --git a/internal/rosa/package/lm_sensors.az b/internal/rosa/package/lm_sensors.az index 6b89bd6a..4b0486f2 100644 --- a/internal/rosa/package/lm_sensors.az +++ b/internal/rosa/package/lm_sensors.az @@ -14,12 +14,8 @@ package lm_sensors { chmod = true; enterSource = true; - early = ` -ln -s \ - ../../system/bin/perl \ - /usr/bin/ -`; - + bin = [ "perl" ]; + populateUsrBin = true; exec = make { inPlace = true; skipConfigure = true; diff --git a/internal/rosa/package/netfilter/package.az b/internal/rosa/package/netfilter/package.az index 421e2880..d5aeb5a1 100644 --- a/internal/rosa/package/netfilter/package.az +++ b/internal/rosa/package/netfilter/package.az @@ -81,13 +81,13 @@ sed -i \ extensions/libebt_snat.txlate `; + bin = [ "bash" ]; exec = make { generate = "./autogen.sh"; configure = { "enable-static"; }; preCheck = ` -ln -s ../system/bin/bash /bin/ chmod +w /etc/ && ln -s ../usr/src/iptables/etc/ethertypes /etc/ `; }; diff --git a/internal/rosa/package/ninja.az b/internal/rosa/package/ninja.az index d6a45493..2eb7694b 100644 --- a/internal/rosa/package/ninja.az +++ b/internal/rosa/package/ninja.az @@ -15,6 +15,7 @@ package ninja { "CFLAGS=-std=c++17", ]; + bin = [ "echo" ]; exec = generic { build = ` python3 /usr/src/ninja/configure.py \ @@ -22,12 +23,10 @@ python3 /usr/src/ninja/configure.py \ --bootstrap python3 /usr/src/ninja/configure.py \ --gtest-source-dir=/usr/src/extra/googletest -./ninja ` + jobsFlagE + ` all`; +./ninja ` + jobsFlagE + ` all +`; - check = ` -chmod +w /bin/ -ln -s ../system/bin/echo /bin/ -./ninja_test`; + check = "./ninja_test"; install = ` mkdir -p /work/system/bin/ diff --git a/internal/rosa/package/pcre2.az b/internal/rosa/package/pcre2.az index 3fede131..27f21bf7 100644 --- a/internal/rosa/package/pcre2.az +++ b/internal/rosa/package/pcre2.az @@ -12,11 +12,8 @@ package pcre2 { compress = bzip2; }; - early = ` -# RunGrepTest expects /bin/echo -ln -s ../system/bin/toybox /bin/echo -`; - + // RunGrepTest expects /bin/echo + bin = [ "echo" ]; exec = make { configure = { "enable-jit"; diff --git a/internal/rosa/package/rdfind.az b/internal/rosa/package/rdfind.az index 86caf33f..5c16548d 100644 --- a/internal/rosa/package/rdfind.az +++ b/internal/rosa/package/rdfind.az @@ -10,10 +10,9 @@ package rdfind { compress = gzip; }; - exec = make { - // test suite hard codes /bin/echo - preCheck = "\nln -s ../system/bin/toybox /bin/echo\n"; - }; + // test suite hard codes /bin/echo + bin = [ "echo" ]; + exec = make {}; inputs = [ nettle ]; runtime = [ nettle ]; diff --git a/internal/rosa/package/util-linux.az b/internal/rosa/package/util-linux.az index 7b18d7c3..4c36199e 100644 --- a/internal/rosa/package/util-linux.az +++ b/internal/rosa/package/util-linux.az @@ -23,8 +23,7 @@ package util-linux { compress = gzip; }; - early = "\nln -s ../system/bin/bash /bin/\n"; - + bin = [ "bash" ]; exec = make { configure = { "disable-use-tty-group"; diff --git a/internal/rosa/package/x.az b/internal/rosa/package/x.az index 46658af9..04d4000f 100644 --- a/internal/rosa/package/x.az +++ b/internal/rosa/package/x.az @@ -781,6 +781,7 @@ package xwayland { checksum = "0D0bs8EbDzlyLIULvm6lizqzdx4g1-umdbjVVO7zk-cS1kVIaSkKronCqj95tz-A"; }; + bin = [ "bash" ]; exec = meson { setup = { "Dipv6": "false"; @@ -788,10 +789,6 @@ package xwayland { }; }; - early = ` -ln -sf ../system/bin/bash /bin/ -`; - inputs = [ bash, gawk, diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index ebb814dc..7c23736c 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -414,6 +414,10 @@ type PackageAttr struct { // Passed to [Toolchain.NewPatchedSource]. Patches []KV + // Programs to make available in /bin/. + Bin []string + // Whether to replace /usr/bin/ with a symlink to /bin/. + PopulateUsrBin bool // Unregistered extras. Extra []pkg.Artifact @@ -544,6 +548,26 @@ cd '/usr/src/` + name + `/' }) } + bin := attr.Bin + if attr.PopulateUsrBin { + scriptEarly += ` +chmod +w /usr/ /usr/bin/ +rm -rf /usr/bin/ +ln -s ../bin /usr/` + bin = append(bin, "env") + } + + if t.stage != stageGentoo && len(bin) > 0 { + scriptEarly += "\nchmod +w /bin/" + + "\n(set -o braceexpand && ln -sf ../system/bin/" + if len(bin) > 1 { + scriptEarly += "{'" + strings.Join(bin, "','") + "'}" + } else { + scriptEarly += "'" + bin[0] + "'" + } + scriptEarly += " /bin/)\n" + } + return t.New( rn, attr.Flag, diff --git a/internal/rosa/state.go b/internal/rosa/state.go index 6b914edc..088963bf 100644 --- a/internal/rosa/state.go +++ b/internal/rosa/state.go @@ -1004,15 +1004,17 @@ func (ctx *evalContext) pf( k("block"): &meta.Blocked, k("latest"): &meta.latest, - k("writable"): &attr.Writable, - k("chmod"): &attr.Chmod, - k("enterSource"): &attr.EnterSource, - k("env"): &attr.Env, - k("early"): &attr.ScriptEarly, - k("patches"): &patches, - k("files"): &files, - k("exclusive"): &excl, - k("toyboxEarly"): &early, + k("writable"): &attr.Writable, + k("chmod"): &attr.Chmod, + k("enterSource"): &attr.EnterSource, + k("env"): &attr.Env, + k("early"): &attr.ScriptEarly, + k("bin"): &attr.Bin, + k("populateUsrBin"): &attr.PopulateUsrBin, + k("patches"): &patches, + k("files"): &files, + k("exclusive"): &excl, + k("toyboxEarly"): &early, k("checksum"): &kc, k("output"): &output,