diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-01-31 03:38:16 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-01-31 05:01:22 +0900 |
| commit | 5f81aac0e23e0197b449373912aa995dd7bb004a (patch) | |
| tree | ec537ec178b0d3820d22754b18fe222a710d6212 /internal/rosa/make.go | |
| parent | 47490823be4d81643ed3895263feec1da64f751e (diff) | |
internal/rosa: make helper
This change only migrates artifacts that remain unchanged under the helper, so this change should not cause any rebuilds.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/make.go')
| -rw-r--r-- | internal/rosa/make.go | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/internal/rosa/make.go b/internal/rosa/make.go index 61763be3..7d7418f7 100644 --- a/internal/rosa/make.go +++ b/internal/rosa/make.go @@ -1,6 +1,11 @@ package rosa -import "hakurei.app/internal/pkg" +import ( + "slices" + "strings" + + "hakurei.app/internal/pkg" +) func (t Toolchain) newMake() pkg.Artifact { const ( @@ -23,3 +28,105 @@ cd "$(mktemp -d)" ))) } func init() { artifactsF[Make] = Toolchain.newMake } + +// MakeAttr holds the project-specific attributes that will be applied to a new +// [pkg.Artifact] compiled via [Make]. +type MakeAttr struct { + // Mount the source tree writable. + Writable bool + + // Do not include default extras. + OmitDefaults bool + + // Additional environment variables. + Env []string + // Runs before cmake. + ScriptEarly string + // Runs after cmake. + Script string + + // Flags passed to the configure script. + Configure [][2]string + // Target triple, zero value is equivalent to the Rosa OS triple. + Build string + // Whether to skip the check target. + SkipCheck bool + + // Suffix appended to the source pathname. + SourceSuffix string + + // Passed through to [Toolchain.New]. + Flag int +} + +// NewViaMake returns a [pkg.Artifact] for compiling and installing via [Make]. +func (t Toolchain) NewViaMake( + name, version string, + source pkg.Artifact, + attr *MakeAttr, + extra ...pkg.Artifact, +) pkg.Artifact { + if name == "" || version == "" { + panic("names must be non-empty") + } + if attr == nil { + attr = new(MakeAttr) + } + build := `"${ROSA_TRIPLE}"` + if attr.Build != "" { + build = attr.Build + } + + var configureFlags string + if len(attr.Configure) > 0 { + const sep = " \\\n\t" + configureFlags += sep + strings.Join( + slices.Collect(func(yield func(string) bool) { + for _, v := range attr.Configure { + s := v[0] + if v[1] == "" || (v[0] != "" && + v[0][0] >= 'a' && + v[0][0] <= 'z') { + s = "--" + s + } + if v[1] != "" { + s += "=" + v[1] + } + if !yield(s) { + return + } + } + }), + sep, + ) + } + + defaults := []pkg.Artifact{ + t.Load(Make), + } + if attr.OmitDefaults || attr.Flag&TEarly == 0 { + defaults = append(defaults, + t.Load(Gawk), + t.Load(Coreutils), + ) + } + + var makeSuffix string + if !attr.SkipCheck { + makeSuffix += " check" + } + + return t.New(name+"-"+version, attr.Flag, stage3Concat(t, + defaults, + extra..., + ), nil, attr.Env, attr.ScriptEarly+` +cd "$(mktemp -d)" +/usr/src/`+name+`/configure \ + --prefix=/system \ + --build=`+build+configureFlags+` +make "-j$(nproc)"`+makeSuffix+` +make DESTDIR=/work install +`+attr.Script, pkg.Path(AbsUsrSrc.Append( + name+attr.SourceSuffix, + ), attr.Writable, source)) +} |
