package rosa import ( "path" "slices" "strings" "hakurei.app/internal/pkg" ) func (t Toolchain) newCMake() pkg.Artifact { const ( version = "4.2.1" checksum = "Y3OdbMsob6Xk2y1DCME6z4Fryb5_TkFD7knRT8dTNIRtSqbiCJyyDN9AxggN_I75" ) return t.NewViaMake("cmake", version, 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, ), &MakeAttr{ OmitDefaults: true, ConfigureName: "/usr/src/cmake/bootstrap", Configure: [][2]string{ {"prefix", "/system"}, {"parallel", `"$(nproc)"`}, {"--"}, {"-DCMAKE_USE_OPENSSL", "OFF"}, }, SkipCheck: true, }, t.Load(KernelHeaders), ) } func init() { artifactsF[CMake] = Toolchain.newCMake } // CMakeHelper is the [CMake] build system helper. type CMakeHelper struct { // Joined with name with a dash if non-empty. Variant string // Path elements joined with source. Append []string // CMake CACHE entries. Cache [][2]string // Runs after install. Script string } var _ Helper = new(CMakeHelper) // name returns its arguments and an optional variant string joined with '-'. func (attr *CMakeHelper) name(name, version string) string { if attr != nil && attr.Variant != "" { name += "-" + attr.Variant } return name + "-" + version } // extra returns a hardcoded slice of [CMake] and [Ninja]. func (*CMakeHelper) extra(int) []PArtifact { return []PArtifact{CMake, Ninja} } // wantsChmod returns false. func (*CMakeHelper) wantsChmod() bool { return false } // wantsWrite returns false. func (*CMakeHelper) wantsWrite() bool { return false } // scriptEarly returns the zero value. func (*CMakeHelper) scriptEarly() string { return "" } // createDir returns true. func (*CMakeHelper) createDir() bool { return true } // wantsDir returns a hardcoded, deterministic pathname. func (*CMakeHelper) wantsDir() string { return "/cure/" } // script generates the cure script. func (attr *CMakeHelper) script(name string) string { if attr == nil { attr = &CMakeHelper{ Cache: [][2]string{ {"CMAKE_BUILD_TYPE", "Release"}, }, } } if len(attr.Cache) == 0 { panic("CACHE must be non-empty") } return ` 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=/work/system \ '/usr/src/` + name + `/` + path.Join(attr.Append...) + `' cmake --build . cmake --install . ` + attr.Script }