forked from security/hakurei
This is stage0 relative to Rosa OS, and stage3 relative to the toolchain it is compiled on (Gentoo in this case). Referring to the toolchain itself as stage3 is counterintuitive and misleading. Signed-off-by: Ophestra <cat@gensokyo.uk>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package rosa
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"hakurei.app/internal/pkg"
|
|
)
|
|
|
|
// MuslAttr holds the attributes that will be applied to musl.
|
|
type MuslAttr struct {
|
|
// Install headers only.
|
|
Headers bool
|
|
// Environment variables concatenated with defaults.
|
|
Env []string
|
|
// Dependencies concatenated with defaults.
|
|
Extra []pkg.Artifact
|
|
}
|
|
|
|
// NewMusl returns a [pkg.Artifact] containing an installation of musl libc.
|
|
func (t Toolchain) NewMusl(attr *MuslAttr) pkg.Artifact {
|
|
const (
|
|
version = "1.2.5"
|
|
checksum = "y6USdIeSdHER_Fw2eT2CNjqShEye85oEg2jnOur96D073ukmIpIqDOLmECQroyDb"
|
|
)
|
|
|
|
if attr == nil {
|
|
attr = new(MuslAttr)
|
|
}
|
|
|
|
target := "install"
|
|
script := `
|
|
mkdir -p /work/system/bin
|
|
COMPAT_LINKER_NAME="ld-musl-` + linuxArch() + `.so.1"
|
|
ln -vs ../lib/libc.so /work/system/bin/linker
|
|
ln -vs ../lib/libc.so /work/system/bin/ldd
|
|
ln -vs libc.so "/work/system/lib/${COMPAT_LINKER_NAME}"
|
|
rm -v "/work/lib/${COMPAT_LINKER_NAME}"
|
|
rmdir -v /work/lib
|
|
`
|
|
if attr.Headers {
|
|
target = "install-headers"
|
|
script = ""
|
|
}
|
|
|
|
return t.New("musl-"+version, 0, stage0Concat(t, attr.Extra,
|
|
t.Load(Make),
|
|
t.Load(Coreutils),
|
|
), nil, slices.Concat([]string{
|
|
"ROSA_MUSL_TARGET=" + target,
|
|
}, attr.Env), `
|
|
cd "$(mktemp -d)"
|
|
/usr/src/musl/configure \
|
|
--prefix=/system \
|
|
--target="${ROSA_TRIPLE}"
|
|
make "-j$(nproc)" DESTDIR=/work "${ROSA_MUSL_TARGET}"
|
|
`+script, pkg.Path(AbsUsrSrc.Append("musl"), false, t.NewPatchedSource(
|
|
// expected to be writable in copies
|
|
"musl", version, pkg.NewHTTPGetTar(
|
|
nil, "https://musl.libc.org/releases/musl-"+version+".tar.gz",
|
|
mustDecode(checksum),
|
|
pkg.TarGzip,
|
|
), false,
|
|
)))
|
|
}
|