package rosa import ( "slices" "strings" "hakurei.app/internal/pkg" ) func (t Toolchain) newMake() pkg.Artifact { const ( version = "4.4.1" checksum = "YS_B07ZcAy9PbaK5_vKGj64SrxO2VMpnMKfc9I0Q9IC1rn0RwOH7802pJoj2Mq4a" ) return t.New("make-"+version, TEarly, nil, nil, nil, ` cd "$(mktemp -d)" /usr/src/make/configure \ --prefix=/system \ --build="${ROSA_TRIPLE}" \ --disable-dependency-tracking ./build.sh ./make DESTDIR=/work install check `, pkg.Path(AbsUsrSrc.Append("make"), false, pkg.NewHTTPGetTar( nil, "https://ftp.gnu.org/gnu/make/make-"+version+".tar.gz", mustDecode(checksum), pkg.TarGzip, ))) } 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)) }