internal/rosa: stage3 special case helper
All checks were successful
Test / Create distribution (push) Successful in 49s
Test / Sandbox (push) Successful in 2m42s
Test / Hakurei (push) Successful in 3m48s
Test / ShareFS (push) Successful in 3m58s
Test / Hpkg (push) Successful in 4m30s
Test / Sandbox (race detector) (push) Successful in 5m1s
Test / Hakurei (race detector) (push) Successful in 5m54s
Test / Flake checks (push) Successful in 1m40s

This makes it cleaner to specify non-stage3 and stage3-exclusive dependencies.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-01-24 11:48:19 +09:00
parent acee0b3632
commit d9ebaf20f8
6 changed files with 56 additions and 69 deletions

View File

@@ -108,18 +108,15 @@ func (t Toolchain) NewBusybox() pkg.Artifact {
checksum = "Ial94Tnt7esJ_YEeb0AxunVL6MGYFyOw7Rtu2o87CXCi1TLrc6rlznVsN1rZk7it" checksum = "Ial94Tnt7esJ_YEeb0AxunVL6MGYFyOw7Rtu2o87CXCi1TLrc6rlznVsN1rZk7it"
) )
extra := []pkg.Artifact{
t.NewMake(),
t.NewKernelHeaders(),
}
var env []string var env []string
if t == toolchainStage3 { if t == toolchainStage3 {
extra = nil
env = append(env, "EXTRA_LDFLAGS=-static") env = append(env, "EXTRA_LDFLAGS=-static")
} }
return t.New("busybox-"+version, extra, nil, slices.Concat([]string{ return t.New("busybox-"+version, stage3Concat(t, []pkg.Artifact{},
t.NewMake(),
t.NewKernelHeaders(),
), nil, slices.Concat([]string{
"ROSA_BUSYBOX_ENABLE=" + strings.Join([]string{ "ROSA_BUSYBOX_ENABLE=" + strings.Join([]string{
"STATIC", "STATIC",
"PIE", "PIE",

View File

@@ -81,14 +81,6 @@ func (t Toolchain) NewViaCMake(
panic("CACHE must be non-empty") panic("CACHE must be non-empty")
} }
cmakeExtras := []pkg.Artifact{
t.NewCMake(),
t.NewNinja(),
}
if t == toolchainStage3 {
cmakeExtras = nil
}
scriptEarly := attr.ScriptEarly scriptEarly := attr.ScriptEarly
if attr.Writable { if attr.Writable {
scriptEarly = ` scriptEarly = `
@@ -102,9 +94,9 @@ chmod -R +w "${ROSA_SOURCE}"
} }
sourcePath := AbsUsrSrc.Append(name) sourcePath := AbsUsrSrc.Append(name)
return t.New(name+"-"+variant+"-"+version, slices.Concat( return t.New(name+"-"+variant+"-"+version, stage3Concat(t, attr.Extra,
attr.Extra, t.NewCMake(),
cmakeExtras, t.NewNinja(),
), nil, slices.Concat([]string{ ), nil, slices.Concat([]string{
"ROSA_SOURCE=" + sourcePath.String(), "ROSA_SOURCE=" + sourcePath.String(),
"ROSA_CMAKE_SOURCE=" + sourcePath.Append(attr.Append...).String(), "ROSA_CMAKE_SOURCE=" + sourcePath.Append(attr.Append...).String(),

View File

@@ -10,7 +10,7 @@ func (t Toolchain) NewGit() pkg.Artifact {
version = "2.52.0" version = "2.52.0"
checksum = "uH3J1HAN_c6PfGNJd2OBwW4zo36n71wmkdvityYnrh8Ak0D1IifiAvEWz9Vi9DmS" checksum = "uH3J1HAN_c6PfGNJd2OBwW4zo36n71wmkdvityYnrh8Ak0D1IifiAvEWz9Vi9DmS"
) )
extra := []pkg.Artifact{ return t.New("git-"+version, stage3Concat(t, []pkg.Artifact{},
t.NewMake(), t.NewMake(),
t.NewPerl(), t.NewPerl(),
t.NewM4(), t.NewM4(),
@@ -18,11 +18,7 @@ func (t Toolchain) NewGit() pkg.Artifact {
t.NewGettext(), t.NewGettext(),
t.NewZlib(), t.NewZlib(),
} ), nil, nil, `
if t == toolchainStage3 {
extra = nil
}
return t.New("git-"+version, extra, nil, nil, `
chmod -R +w /usr/src/git && cd /usr/src/git chmod -R +w /usr/src/git && cd /usr/src/git
make configure make configure
./configure --prefix=/system ./configure --prefix=/system

View File

@@ -124,20 +124,6 @@ func (t Toolchain) newLLVM(variant string, attr *llvmAttr) pkg.Artifact {
) )
} }
extra := []pkg.Artifact{
t.NewLibffi(),
t.NewPython(),
t.NewPerl(),
t.NewDiffutils(),
t.NewBash(),
t.NewCoreutils(),
t.NewKernelHeaders(),
}
if t == toolchainStage3 {
extra = nil
}
if attr.flags&llvmProjectClang != 0 { if attr.flags&llvmProjectClang != 0 {
cache = append(cache, cache = append(cache,
[2]string{"CLANG_DEFAULT_LINKER", "lld"}, [2]string{"CLANG_DEFAULT_LINKER", "lld"},
@@ -200,7 +186,9 @@ cp -r /system/include /usr/include && rm -rf /system/include
patches[0] = pkg.Path(AbsUsrSrc.Append("llvmorg"), false, source) patches[0] = pkg.Path(AbsUsrSrc.Append("llvmorg"), false, source)
if len(patches) > 1 { if len(patches) > 1 {
source = t.New( source = t.New(
"llvmorg-patched", nil, nil, nil, ` "llvmorg-patched", stage3Concat(t, []pkg.Artifact{},
t.NewPatch(),
), nil, nil, `
cp -r /usr/src/llvmorg/. /work/. cp -r /usr/src/llvmorg/. /work/.
chmod -R +w /work && cd /work chmod -R +w /work && cd /work
cat /usr/src/llvm-patches/* | patch -p 1 cat /usr/src/llvm-patches/* | patch -p 1
@@ -211,7 +199,16 @@ cat /usr/src/llvm-patches/* | patch -p 1
return t.NewViaCMake("llvm", version, variant, source, &CMakeAttr{ return t.NewViaCMake("llvm", version, variant, source, &CMakeAttr{
Cache: slices.Concat(cache, attr.cmake), Cache: slices.Concat(cache, attr.cmake),
Append: cmakeAppend, Append: cmakeAppend,
Extra: slices.Concat(attr.extra, extra), Extra: stage3Concat(t, attr.extra,
t.NewLibffi(),
t.NewPython(),
t.NewPerl(),
t.NewDiffutils(),
t.NewBash(),
t.NewCoreutils(),
t.NewKernelHeaders(),
),
Prefix: attr.prefix, Prefix: attr.prefix,
Env: slices.Concat([]string{ Env: slices.Concat([]string{
@@ -239,15 +236,10 @@ func (t Toolchain) NewLLVM() (musl, compilerRT, runtimes, clang pkg.Artifact) {
{"LLVM_ENABLE_LIBXML2", "OFF"}, {"LLVM_ENABLE_LIBXML2", "OFF"},
} }
var env []string
if t == toolchainStage3 {
env = []string{
"LDFLAGS=" + earlyLDFLAGS(false),
}
}
compilerRT = t.newLLVM("compiler-rt", &llvmAttr{ compilerRT = t.newLLVM("compiler-rt", &llvmAttr{
env: env, env: stage3ExclConcat(t, []string{},
"LDFLAGS="+earlyLDFLAGS(false),
),
cmake: [][2]string{ cmake: [][2]string{
// libc++ not yet available // libc++ not yet available
{"CMAKE_CXX_COMPILER_TARGET", ""}, {"CMAKE_CXX_COMPILER_TARGET", ""},
@@ -288,17 +280,21 @@ ln -s \
musl = t.NewMusl(&MuslAttr{ musl = t.NewMusl(&MuslAttr{
Extra: []pkg.Artifact{compilerRT}, Extra: []pkg.Artifact{compilerRT},
Env: slices.Concat(env, []string{ Env: stage3ExclConcat(t, []string{
"CC=clang", "CC=clang",
"LIBCC=/system/lib/clang/21/lib/" + "LIBCC=/system/lib/clang/21/lib/" +
triplet() + "/libclang_rt.builtins.a", triplet() + "/libclang_rt.builtins.a",
"AR=ar", "AR=ar",
"RANLIB=ranlib", "RANLIB=ranlib",
}), },
"LDFLAGS="+earlyLDFLAGS(false),
),
}) })
runtimes = t.newLLVM("runtimes", &llvmAttr{ runtimes = t.newLLVM("runtimes", &llvmAttr{
env: env, env: stage3ExclConcat(t, []string{},
"LDFLAGS="+earlyLDFLAGS(false),
),
flags: llvmRuntimeLibunwind | llvmRuntimeLibcxx | llvmRuntimeLibcxxABI, flags: llvmRuntimeLibunwind | llvmRuntimeLibcxx | llvmRuntimeLibcxxABI,
cmake: slices.Concat([][2]string{ cmake: slices.Concat([][2]string{
// libc++ not yet available // libc++ not yet available
@@ -314,17 +310,13 @@ ln -s \
}, },
}) })
var clangExtraEnv []string
if t == toolchainStage3 {
clangExtraEnv = []string{
"CFLAGS=" + earlyCFLAGS,
"CXXFLAGS=" + earlyCXXFLAGS(),
}
}
clang = t.newLLVM("clang", &llvmAttr{ clang = t.newLLVM("clang", &llvmAttr{
flags: llvmProjectClang | llvmProjectLld, flags: llvmProjectClang | llvmProjectLld,
env: slices.Concat(clangExtraEnv, env), env: stage3ExclConcat(t, []string{},
"CFLAGS="+earlyCFLAGS,
"CXXFLAGS="+earlyCXXFLAGS(),
"LDFLAGS="+earlyLDFLAGS(false),
),
cmake: slices.Concat([][2]string{ cmake: slices.Concat([][2]string{
{"LLVM_TARGETS_TO_BUILD", target}, {"LLVM_TARGETS_TO_BUILD", target},
{"CMAKE_CROSSCOMPILING", "OFF"}, {"CMAKE_CROSSCOMPILING", "OFF"},

View File

@@ -41,16 +41,8 @@ rmdir -v /work/lib
script = "" script = ""
} }
extra := []pkg.Artifact{ return t.New("musl-"+version, stage3Concat(t, attr.Extra,
t.NewMake(), t.NewMake(),
}
if t == toolchainStage3 {
extra = nil
}
return t.New("musl-"+version, slices.Concat(
attr.Extra,
extra,
), nil, slices.Concat([]string{ ), nil, slices.Concat([]string{
"ROSA_MUSL_TARGET=" + target, "ROSA_MUSL_TARGET=" + target,
}, attr.Env), ` }, attr.Env), `

View File

@@ -116,6 +116,24 @@ const (
Std Std
) )
// stage3Concat concatenates s and values. If the current toolchain is
// toolchainStage3, stage3Concat returns s as is.
func stage3Concat[S ~[]E, E any](t Toolchain, s S, values ...E) S {
if t == toolchainStage3 {
return s
}
return slices.Concat(s, values)
}
// stage3ExclConcat concatenates s and values. If the current toolchain is not
// toolchainStage3, stage3ExclConcat returns s as is.
func stage3ExclConcat[S ~[]E, E any](t Toolchain, s S, values ...E) S {
if t == toolchainStage3 {
return slices.Concat(s, values)
}
return s
}
// lastIndexFunc is like [strings.LastIndexFunc] but for [slices]. // lastIndexFunc is like [strings.LastIndexFunc] but for [slices].
func lastIndexFunc[S ~[]E, E any](s S, f func(E) bool) (i int) { func lastIndexFunc[S ~[]E, E any](s S, f func(E) bool) (i int) {
if i = slices.IndexFunc(s, f); i < 0 { if i = slices.IndexFunc(s, f); i < 0 {