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>
126 lines
3.2 KiB
Go
126 lines
3.2 KiB
Go
package rosa
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
|
|
"hakurei.app/container/check"
|
|
"hakurei.app/internal/pkg"
|
|
)
|
|
|
|
func (t Toolchain) newCMake() pkg.Artifact {
|
|
const (
|
|
version = "4.2.1"
|
|
checksum = "Y3OdbMsob6Xk2y1DCME6z4Fryb5_TkFD7knRT8dTNIRtSqbiCJyyDN9AxggN_I75"
|
|
)
|
|
return t.New("cmake-"+version, 0, []pkg.Artifact{
|
|
t.Load(Make),
|
|
t.Load(KernelHeaders),
|
|
}, nil, nil, `
|
|
cd "$(mktemp -d)"
|
|
/usr/src/cmake/bootstrap \
|
|
--prefix=/system \
|
|
--parallel="$(nproc)" \
|
|
-- \
|
|
-DCMAKE_USE_OPENSSL=OFF
|
|
make "-j$(nproc)"
|
|
make DESTDIR=/work install
|
|
`, pkg.Path(AbsUsrSrc.Append("cmake"), true, t.NewPatchedSource(
|
|
// expected to be writable in the copy made during bootstrap
|
|
"cmake", version, pkg.NewHTTPGetTar(
|
|
nil, "https://github.com/Kitware/CMake/releases/download/"+
|
|
"v"+version+"/cmake-"+version+".tar.gz",
|
|
mustDecode(checksum),
|
|
pkg.TarGzip,
|
|
), false,
|
|
)))
|
|
}
|
|
func init() { artifactsF[CMake] = Toolchain.newCMake }
|
|
|
|
// CMakeAttr holds the project-specific attributes that will be applied to a new
|
|
// [pkg.Artifact] compiled via [CMake].
|
|
type CMakeAttr struct {
|
|
// Path elements joined with source.
|
|
Append []string
|
|
// Use source tree as scratch space.
|
|
Writable bool
|
|
|
|
// CMake CACHE entries.
|
|
Cache [][2]string
|
|
// Additional environment variables.
|
|
Env []string
|
|
// Runs before cmake.
|
|
ScriptEarly string
|
|
// Runs after cmake, replaces default.
|
|
ScriptConfigured string
|
|
// Runs after install.
|
|
Script string
|
|
|
|
// Override the default installation prefix [AbsSystem].
|
|
Prefix *check.Absolute
|
|
|
|
// Passed through to [Toolchain.New].
|
|
Paths []pkg.ExecPath
|
|
// Passed through to [Toolchain.New].
|
|
Flag int
|
|
}
|
|
|
|
// NewViaCMake returns a [pkg.Artifact] for compiling and installing via [CMake].
|
|
func (t Toolchain) NewViaCMake(
|
|
name, version, variant string,
|
|
source pkg.Artifact,
|
|
attr *CMakeAttr,
|
|
extra ...pkg.Artifact,
|
|
) pkg.Artifact {
|
|
if name == "" || version == "" || variant == "" {
|
|
panic("names must be non-empty")
|
|
}
|
|
if attr == nil {
|
|
attr = &CMakeAttr{
|
|
Cache: [][2]string{
|
|
{"CMAKE_BUILD_TYPE", "Release"},
|
|
},
|
|
}
|
|
}
|
|
if len(attr.Cache) == 0 {
|
|
panic("CACHE must be non-empty")
|
|
}
|
|
|
|
scriptConfigured := "cmake --build .\ncmake --install .\n"
|
|
if attr.ScriptConfigured != "" {
|
|
scriptConfigured = attr.ScriptConfigured
|
|
}
|
|
|
|
prefix := attr.Prefix
|
|
if prefix == nil {
|
|
prefix = AbsSystem
|
|
}
|
|
|
|
sourcePath := AbsUsrSrc.Append(name)
|
|
return t.New(name+"-"+variant+"-"+version, attr.Flag, stage0Concat(t, extra,
|
|
t.Load(CMake),
|
|
t.Load(Ninja),
|
|
), nil, slices.Concat([]string{
|
|
"ROSA_SOURCE=" + sourcePath.String(),
|
|
"ROSA_CMAKE_SOURCE=" + sourcePath.Append(attr.Append...).String(),
|
|
"ROSA_INSTALL_PREFIX=/work" + prefix.String(),
|
|
}, attr.Env), attr.ScriptEarly+`
|
|
mkdir /cure && cd /cure
|
|
cmake -G Ninja \
|
|
-DCMAKE_C_COMPILER_TARGET="${ROSA_TRIPLE}" \
|
|
-DCMAKE_CXX_COMPILER_TARGET="${ROSA_TRIPLE}" \
|
|
-DCMAKE_ASM_COMPILER_TARGET="${ROSA_TRIPLE}" \
|
|
`+strings.Join(slices.Collect(func(yield func(string) bool) {
|
|
for _, v := range attr.Cache {
|
|
if !yield("-D" + v[0] + "=" + v[1]) {
|
|
return
|
|
}
|
|
}
|
|
}), " \\\n\t")+` \
|
|
-DCMAKE_INSTALL_PREFIX="${ROSA_INSTALL_PREFIX}" \
|
|
"${ROSA_CMAKE_SOURCE}"
|
|
`+scriptConfigured+attr.Script, slices.Concat([]pkg.ExecPath{
|
|
pkg.Path(sourcePath, attr.Writable, source),
|
|
}, attr.Paths)...)
|
|
}
|