From d9ebaf20f8e71f043d2387a42d273dadc5d536b5 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 24 Jan 2026 11:48:19 +0900 Subject: [PATCH] internal/rosa: stage3 special case helper This makes it cleaner to specify non-stage3 and stage3-exclusive dependencies. Signed-off-by: Ophestra --- internal/rosa/busybox.go | 11 +++---- internal/rosa/cmake.go | 14 ++------- internal/rosa/git.go | 8 ++--- internal/rosa/llvm.go | 64 ++++++++++++++++++---------------------- internal/rosa/musl.go | 10 +------ internal/rosa/rosa.go | 18 +++++++++++ 6 files changed, 56 insertions(+), 69 deletions(-) diff --git a/internal/rosa/busybox.go b/internal/rosa/busybox.go index d5eabe7..b4fb2d3 100644 --- a/internal/rosa/busybox.go +++ b/internal/rosa/busybox.go @@ -108,18 +108,15 @@ func (t Toolchain) NewBusybox() pkg.Artifact { checksum = "Ial94Tnt7esJ_YEeb0AxunVL6MGYFyOw7Rtu2o87CXCi1TLrc6rlznVsN1rZk7it" ) - extra := []pkg.Artifact{ - t.NewMake(), - t.NewKernelHeaders(), - } var env []string - if t == toolchainStage3 { - extra = nil 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{ "STATIC", "PIE", diff --git a/internal/rosa/cmake.go b/internal/rosa/cmake.go index b299e59..d26ce25 100644 --- a/internal/rosa/cmake.go +++ b/internal/rosa/cmake.go @@ -81,14 +81,6 @@ func (t Toolchain) NewViaCMake( panic("CACHE must be non-empty") } - cmakeExtras := []pkg.Artifact{ - t.NewCMake(), - t.NewNinja(), - } - if t == toolchainStage3 { - cmakeExtras = nil - } - scriptEarly := attr.ScriptEarly if attr.Writable { scriptEarly = ` @@ -102,9 +94,9 @@ chmod -R +w "${ROSA_SOURCE}" } sourcePath := AbsUsrSrc.Append(name) - return t.New(name+"-"+variant+"-"+version, slices.Concat( - attr.Extra, - cmakeExtras, + return t.New(name+"-"+variant+"-"+version, stage3Concat(t, attr.Extra, + t.NewCMake(), + t.NewNinja(), ), nil, slices.Concat([]string{ "ROSA_SOURCE=" + sourcePath.String(), "ROSA_CMAKE_SOURCE=" + sourcePath.Append(attr.Append...).String(), diff --git a/internal/rosa/git.go b/internal/rosa/git.go index ca10ee4..8407024 100644 --- a/internal/rosa/git.go +++ b/internal/rosa/git.go @@ -10,7 +10,7 @@ func (t Toolchain) NewGit() pkg.Artifact { version = "2.52.0" checksum = "uH3J1HAN_c6PfGNJd2OBwW4zo36n71wmkdvityYnrh8Ak0D1IifiAvEWz9Vi9DmS" ) - extra := []pkg.Artifact{ + return t.New("git-"+version, stage3Concat(t, []pkg.Artifact{}, t.NewMake(), t.NewPerl(), t.NewM4(), @@ -18,11 +18,7 @@ func (t Toolchain) NewGit() pkg.Artifact { t.NewGettext(), t.NewZlib(), - } - if t == toolchainStage3 { - extra = nil - } - return t.New("git-"+version, extra, nil, nil, ` + ), nil, nil, ` chmod -R +w /usr/src/git && cd /usr/src/git make configure ./configure --prefix=/system diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go index b1d7966..a577df4 100644 --- a/internal/rosa/llvm.go +++ b/internal/rosa/llvm.go @@ -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 { cache = append(cache, [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) if len(patches) > 1 { source = t.New( - "llvmorg-patched", nil, nil, nil, ` + "llvmorg-patched", stage3Concat(t, []pkg.Artifact{}, + t.NewPatch(), + ), nil, nil, ` cp -r /usr/src/llvmorg/. /work/. chmod -R +w /work && cd /work 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{ Cache: slices.Concat(cache, attr.cmake), 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, Env: slices.Concat([]string{ @@ -239,15 +236,10 @@ func (t Toolchain) NewLLVM() (musl, compilerRT, runtimes, clang pkg.Artifact) { {"LLVM_ENABLE_LIBXML2", "OFF"}, } - var env []string - if t == toolchainStage3 { - env = []string{ - "LDFLAGS=" + earlyLDFLAGS(false), - } - } - compilerRT = t.newLLVM("compiler-rt", &llvmAttr{ - env: env, + env: stage3ExclConcat(t, []string{}, + "LDFLAGS="+earlyLDFLAGS(false), + ), cmake: [][2]string{ // libc++ not yet available {"CMAKE_CXX_COMPILER_TARGET", ""}, @@ -288,17 +280,21 @@ ln -s \ musl = t.NewMusl(&MuslAttr{ Extra: []pkg.Artifact{compilerRT}, - Env: slices.Concat(env, []string{ + Env: stage3ExclConcat(t, []string{ "CC=clang", "LIBCC=/system/lib/clang/21/lib/" + triplet() + "/libclang_rt.builtins.a", "AR=ar", "RANLIB=ranlib", - }), + }, + "LDFLAGS="+earlyLDFLAGS(false), + ), }) runtimes = t.newLLVM("runtimes", &llvmAttr{ - env: env, + env: stage3ExclConcat(t, []string{}, + "LDFLAGS="+earlyLDFLAGS(false), + ), flags: llvmRuntimeLibunwind | llvmRuntimeLibcxx | llvmRuntimeLibcxxABI, cmake: slices.Concat([][2]string{ // 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{ flags: llvmProjectClang | llvmProjectLld, - env: slices.Concat(clangExtraEnv, env), + env: stage3ExclConcat(t, []string{}, + "CFLAGS="+earlyCFLAGS, + "CXXFLAGS="+earlyCXXFLAGS(), + "LDFLAGS="+earlyLDFLAGS(false), + ), cmake: slices.Concat([][2]string{ {"LLVM_TARGETS_TO_BUILD", target}, {"CMAKE_CROSSCOMPILING", "OFF"}, diff --git a/internal/rosa/musl.go b/internal/rosa/musl.go index 4176075..c9945d1 100644 --- a/internal/rosa/musl.go +++ b/internal/rosa/musl.go @@ -41,16 +41,8 @@ rmdir -v /work/lib script = "" } - extra := []pkg.Artifact{ + return t.New("musl-"+version, stage3Concat(t, attr.Extra, t.NewMake(), - } - if t == toolchainStage3 { - extra = nil - } - - return t.New("musl-"+version, slices.Concat( - attr.Extra, - extra, ), nil, slices.Concat([]string{ "ROSA_MUSL_TARGET=" + target, }, attr.Env), ` diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index 06f73c6..c3b6a3e 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -116,6 +116,24 @@ const ( 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]. func lastIndexFunc[S ~[]E, E any](s S, f func(E) bool) (i int) { if i = slices.IndexFunc(s, f); i < 0 {