1
0
forked from rosa/hakurei

75 Commits

Author SHA1 Message Date
e231341e48 release: 0.4.3
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-22 02:18:10 +09:00
70f977627d internal/pkg: arch-specific expected offline substituted
IR includes the target architecture name.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-22 01:51:15 +09:00
f3a6f7ddf9 internal/rosa/package: migrate hakurei
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-22 00:07:25 +09:00
2a9aa3b400 cmd/dist: include version in release
This makes HAKUREI_VERSION optional during build.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 23:37:08 +09:00
68a91523b9 internal/rosa/package: migrate bison
This is the final remaining trivial legacy artifact.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 23:06:34 +09:00
5647321622 internal/rosa: move azalea builtins
This improves readability.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 22:51:50 +09:00
cdd31dd27b internal/rosa/azalea: integer arrays
This is useful for some helper functions. Performance is unaffected.

Before:
BenchmarkStage3-128     	    8308	   1960687 ns/op	 1023794 B/op	   14755 allocs/op
BenchmarkAll-128        	    3331	   5518571 ns/op	 2902320 B/op	   37993 allocs/op

After:
BenchmarkStage3-128     	    8330	   1946273 ns/op	 1023046 B/op	   14750 allocs/op
BenchmarkAll-128        	    3296	   5585805 ns/op	 2901746 B/op	   37991 allocs/op

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 22:47:41 +09:00
0615899e56 internal/rosa: do not register stage0
Nothing can depend on this, so remove it from the namespace.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 22:20:01 +09:00
0914569e62 internal/rosa/go: migrate to generic helper
The go toolchain predates all abstractions currently available. This migration causes rebuilds due to internal cleanups affecting the final build script.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 19:55:38 +09:00
25d9edfc64 internal/rosa/package: migrate tamago
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 19:40:16 +09:00
af4c3bbff2 internal/rosa/package: migrate toybox
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 18:10:02 +09:00
54aae9d72a internal/rosa/package: migrate llvm patches
LLVM itself is unlikely to ever be migrated due to complexity of the bootstrap, so migrate patches instead.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 17:51:23 +09:00
58646f8ea5 internal/rosa/package/googletest: 1.16.0 to 1.17.0
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 17:02:40 +09:00
9d7a27d8ac internal/rosa/package: migrate ninja
The ninja package predates all abstractions currently available. This migration causes rebuilds due to the old package being nonreproducible.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 16:48:10 +09:00
6546ddc64b internal/rosa: expose in-place behaviour in generic helper
This change also combines the createDir and wantsDir methods, and replaces the non-inplace target of the generic helper with a deterministic path.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 16:11:38 +09:00
cbf18b302d internal/rosa/package: migrate nss
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 15:36:10 +09:00
1acb5b0105 internal/rosa: extra inputs in alternative path
This works around particularly unwieldy build systems.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 15:05:12 +09:00
40b33f9fc7 internal/rosa: enforce exclusions
This restores unexported artifact behaviour.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 14:48:16 +09:00
443a7a30f6 internal/rosa: use string pair for files
This is a much cleaner representation than the separator syntax.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 14:07:20 +09:00
497e4a5642 internal/rosa/package/git: disable flaky test
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 13:35:21 +09:00
c0e3841ddb internal/rosa/llvm: 22.1.5 to 22.1.6
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-21 10:39:42 +09:00
9ce2c325db internal/rosa/package/kernel: populate riscv64 checksum
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 21:25:15 +09:00
9836030c59 internal/rosa: reinitialise frame alongside cache
The cached frame can contain information made outdated by the DropCaches call.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 09:01:40 +09:00
b482fd4abf internal/rosa: remove global handles
These no longer serve any purpose.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 08:15:23 +09:00
2e502ede6c internal/rosa/package: migrate X packages
This also improves naming consistency.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 07:44:17 +09:00
4bec0b890c internal/rosa/package: migrate unzip
This is now possible via the generic helper.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 06:21:49 +09:00
7770ccf0aa internal/rosa/package: migrate wayland
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 06:12:19 +09:00
656059278d internal/rosa/package: migrate remaining trivial packages
The rest are migrated individually.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 05:57:26 +09:00
1a9974ffdc internal/rosa/package: migrate qemu
This has many dependencies.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 05:10:41 +09:00
1a2699b486 internal/rosa/package: migrate multiple packages
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 05:01:06 +09:00
1d3d621e2f internal/rosa/package: migrate perl Module::Build
This is now possible via the generic helper.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 04:48:03 +09:00
47f4e287fc internal/rosa/package: migrate multiple libraries
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 04:37:58 +09:00
2e710328a4 internal/rosa/package: migrate musl
This removes some legacy cruft, causing 2 rebuilds per stage.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 04:13:10 +09:00
2e7b52d701 internal/rosa/package: migrate mesa
This has many dependencies.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 04:02:02 +09:00
d728607505 internal/rosa/package: migrate mesa dependencies
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 03:51:48 +09:00
ef414ab01a internal/rosa/package: migrate many libraries
This also adds more string helpers.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 03:33:15 +09:00
96abf266dd internal/rosa/package: migrate hwdata, kmod, libarchive
This removes a blank line in CTestCustom.cmake, causing a libarchive rebuild. Resulting IR is identical otherwise.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 02:25:41 +09:00
fcba32e9c4 internal/rosa/package: migrate glib
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 02:09:12 +09:00
a7f5a5802d internal/rosa/package: migrate spirv-llvm-translator
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-20 00:01:03 +09:00
bb230378e0 internal/rosa/package: migrate glslang
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 23:48:39 +09:00
f638c73933 internal/rosa: bind anitya functions
This is far more scalable than individual fields.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 23:34:21 +09:00
98d915af3d internal/rosa/package: migrate argp-standalone, dtc, elfutils, flex, freetype, fuse
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 23:26:34 +09:00
c0593e8325 internal/rosa/package: migrate dbus
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 22:51:08 +09:00
608d8303ec internal/rosa/package: migrate git
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 22:37:24 +09:00
1c6f30379e internal/rosa/package: migrate bzip2, curl, connman
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 22:26:40 +09:00
009a4e0d58 internal/rosa/hakurei: migrate to helper
This predates the helper infrastructure, so migrate it.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 22:10:39 +09:00
e7c8656691 internal/rosa: remove fakeroot
This is unused and broken, so remove it.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 21:54:40 +09:00
d6be116ff8 internal/rosa/package: migrate firmware
This does not depend on the kernel.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 21:46:40 +09:00
962b02cf25 internal/rosa/package: migrate kernel
This introduces bindings for extra paths and KnownChecksum, and exposes a passthrough special case.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 21:40:15 +09:00
6fd6d971ed internal/rosa/package: migrate mksh
This benefits greatly from the new generic helper.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 19:47:57 +09:00
548c96c7ec internal/rosa/package: migrate make
This also introduces the generic helper for unusual build scripts.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 19:28:18 +09:00
6e8bfa6c4c internal/rosa/package: migrate cmake
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 18:42:54 +09:00
a770d62b9b internal/rosa/package: migrate meson
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 18:24:07 +09:00
ff44060763 internal/rosa/package: migrate python packages
This also migrates LLVM LIT via the newly implemented special case.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 18:15:04 +09:00
3010a209b5 internal/rosa/azalea: pass through source ident
For source handle special case.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 18:10:11 +09:00
e65a3b435c internal/rosa/package/gnutls: 3.8.12 to 3.8.13
The new release came with new broken tests, but at least nettle3 can be removed.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 04:36:32 +09:00
23515f67c8 internal/rosa/package: migrate perl packages
Most of these are currently unused.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 04:08:22 +09:00
4389df60ae internal/rosa/perl: remove obsolete helper
This method predates the helper infrastructure.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 03:40:31 +09:00
8092492018 internal/rosa/perl: Makefile.PL helper
This can be invoked from azalea.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 03:24:27 +09:00
a7877844bf internal/rosa/package: migrate perl interpreter
Packages will be migrated separtely.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 02:49:11 +09:00
1ed027846d internal/rosa/package: migrate python interpreter
Packages will take quite some work.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 02:06:17 +09:00
2f376d4813 internal/rosa/package: rename buildcatrust
This causes a single rebuild due to substitution.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 01:50:03 +09:00
dc3810b530 internal/rosa/python: remove unnecessary input
This is added by the helper. Removing it has no effect since it is promoted by Append.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 01:48:24 +09:00
6e9e8c74f3 internal/rosa: migrate buildcatrust
Other nss-related packages are unlikely to be migrated any time soon.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 01:44:23 +09:00
4d60fa5632 internal/rosa: evaluate packages late
This also enables concurrent evaluation.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 01:26:21 +09:00
8807cbc730 internal/rosa: create metadata alongside artifact
This enables deferring evaluation of azalea-based packages and fixes the longstanding quirk of version being disjoint from other metadata.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-19 00:44:24 +09:00
0e95573f18 internal/rosa/package: migrate acl
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 22:42:43 +09:00
eb2b53307a internal/rosa/package: migrate gcc
The azalea implementation used an adaptation of this as testdata.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 22:29:53 +09:00
682b3a2ce5 internal/rosa: track evaluation time
Useful to track performance regressions over migrations.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 22:18:09 +09:00
594221eb78 internal/rosa/package: migrate gnutls
This is the first nontrivial package to be migrated to azalea. Validated to generate identical IR.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 22:06:00 +09:00
34822925e1 internal/rosa: migrate GNU software
These are quite trivial, so migrate them in one pass.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 21:23:19 +09:00
37df040d85 internal/rosa: evaluate packages from fs
This migrates GNU sed to azalea, and resulting IR matches.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 17:54:01 +09:00
0360e779f3 internal/rosa: initial azalea bindings
Supported fields are still rather minimal, but evaluation works, and resulting artifacts cure correctly.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 02:56:38 +09:00
3e236333a7 internal/rosa: panic error for invalid handle
This enables recovery and better error handling for errors originating from external azalea files.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-18 00:07:39 +09:00
f24ae21af1 internal/rosa/azalea: package special case
This is more efficient for the inputs array and packages in general.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-05-17 23:49:19 +09:00
228 changed files with 8951 additions and 9362 deletions

1
cmd/dist/VERSION vendored Normal file
View File

@@ -0,0 +1 @@
v0.4.3

7
cmd/dist/main.go vendored
View File

@@ -18,8 +18,13 @@ import (
"os/signal" "os/signal"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings"
) )
//go:generate sh -c "git describe --tags > VERSION"
//go:embed VERSION
var version string
// getenv looks up an environment variable, and returns fallback if it is unset. // getenv looks up an environment variable, and returns fallback if it is unset.
func getenv(key, fallback string) string { func getenv(key, fallback string) string {
if v, ok := os.LookupEnv(key); ok { if v, ok := os.LookupEnv(key); ok {
@@ -47,7 +52,7 @@ func main() {
verbose := os.Getenv("VERBOSE") != "" verbose := os.Getenv("VERBOSE") != ""
runTests := os.Getenv("HAKUREI_DIST_MAKE") == "" runTests := os.Getenv("HAKUREI_DIST_MAKE") == ""
version := getenv("HAKUREI_VERSION", "untagged") version = getenv("HAKUREI_VERSION", strings.TrimSpace(version))
prefix := getenv("PREFIX", "/usr") prefix := getenv("PREFIX", "/usr")
destdir := getenv("DESTDIR", "dist") destdir := getenv("DESTDIR", "dist")

View File

@@ -39,14 +39,13 @@ func commandInfo(
t := rosa.Native().Std() t := rosa.Native().Std()
for i, name := range args { for i, name := range args {
handle := rosa.ArtifactH(unique.Make(name)) handle := rosa.ArtifactH(unique.Make(name))
if meta := rosa.Native().Get(handle); meta == nil { if meta, a := t.Load(handle); meta == nil {
return fmt.Errorf("unknown artifact %q", name) return fmt.Errorf("unknown artifact %q", name)
} else { } else {
var suffix string var suffix string
a, version := t.MustLoad(handle) if meta.Version != rosa.Unversioned {
if version != rosa.Unversioned { suffix += "-" + meta.Version
suffix += "-" + version
} }
mustPrintln("name : " + name + suffix) mustPrintln("name : " + name + suffix)
@@ -58,9 +57,10 @@ func commandInfo(
if len(meta.Dependencies) > 0 { if len(meta.Dependencies) > 0 {
mustPrint("depends on :") mustPrint("depends on :")
for _, d := range meta.Dependencies { for _, d := range meta.Dependencies {
s := rosa.Native().MustGet(d).Name _meta, _ := rosa.Native().Std().MustLoad(d)
if _, _version := t.Load(d); _version != rosa.Unversioned { s := _meta.Name
s += "-" + _version if _meta.Version != rosa.Unversioned {
s += "-" + _meta.Version
} }
mustPrint(" " + s) mustPrint(" " + s)
} }

View File

@@ -22,12 +22,12 @@ func TestInfo(t *testing.T) {
t.Parallel() t.Parallel()
_t := rosa.Native().Std() _t := rosa.Native().Std()
_, qemuVersion := _t.Load(rosa.QEMU) qemuMeta, _ := _t.Load(rosa.H("qemu"))
_, glibVersion := _t.Load(rosa.GLib) glibMeta, _ := _t.Load(rosa.H("glib"))
zlib, zlibVersion := _t.Load(rosa.Zlib) zlibMeta, zlib := _t.Load(rosa.H("zlib"))
_, zstdVersion := _t.Load(rosa.Zstd) zstdMeta, _ := _t.Load(rosa.H("zstd"))
_, hakureiVersion := _t.Load(rosa.Hakurei) hakureiMeta, _ := _t.Load(rosa.H("hakurei"))
_, hakureiDistVersion := _t.Load(rosa.HakureiDist) hakureiDistMeta, _ := _t.Load(rosa.H("hakurei-dist"))
testCases := []struct { testCases := []struct {
name string name string
@@ -38,24 +38,24 @@ func TestInfo(t *testing.T) {
wantErr any wantErr any
}{ }{
{"qemu", []string{"qemu"}, nil, "", ` {"qemu", []string{"qemu"}, nil, "", `
name : qemu-` + qemuVersion + ` name : qemu-` + qemuMeta.Version + `
description : a generic and open source machine emulator and virtualizer description : a generic and open source machine emulator and virtualizer
website : https://www.qemu.org website : https://www.qemu.org
depends on : glib-` + glibVersion + ` zstd-` + zstdVersion + ` depends on : glib-` + glibMeta.Version + ` zstd-` + zstdMeta.Version + `
`, nil}, `, nil},
{"multi", []string{"hakurei", "hakurei-dist"}, nil, "", ` {"multi", []string{"hakurei", "hakurei-dist"}, nil, "", `
name : hakurei-` + hakureiVersion + ` name : hakurei-` + hakureiMeta.Version + `
description : low-level userspace tooling for Rosa OS description : low-level userspace tooling for Rosa OS
website : https://hakurei.app website : https://hakurei.app
name : hakurei-dist-` + hakureiDistVersion + ` name : hakurei-dist-` + hakureiDistMeta.Version + `
description : low-level userspace tooling for Rosa OS (distribution tarball) description : low-level userspace tooling for Rosa OS (distribution tarball)
website : https://hakurei.app website : https://hakurei.app
`, nil}, `, nil},
{"nonexistent", []string{"zlib", "\x00"}, nil, "", ` {"nonexistent", []string{"zlib", "\x00"}, nil, "", `
name : zlib-` + zlibVersion + ` name : zlib-` + zlibMeta.Version + `
description : lossless data-compression library description : lossless data-compression library
website : https://zlib.net website : https://zlib.net
@@ -65,12 +65,12 @@ website : https://zlib.net
"zstd": "internal/pkg (amd64) on satori\n", "zstd": "internal/pkg (amd64) on satori\n",
"hakurei": "internal/pkg (amd64) on satori\n\n", "hakurei": "internal/pkg (amd64) on satori\n\n",
}, "", ` }, "", `
name : zlib-` + zlibVersion + ` name : zlib-` + zlibMeta.Version + `
description : lossless data-compression library description : lossless data-compression library
website : https://zlib.net website : https://zlib.net
status : not yet cured status : not yet cured
name : zstd-` + zstdVersion + ` name : zstd-` + zstdMeta.Version + `
description : a fast compression algorithm description : a fast compression algorithm
website : https://facebook.github.io/zstd website : https://facebook.github.io/zstd
status : internal/pkg (amd64) on satori status : internal/pkg (amd64) on satori
@@ -79,7 +79,7 @@ status : internal/pkg (amd64) on satori
{"status cache perm", []string{"zlib"}, map[string]string{ {"status cache perm", []string{"zlib"}, map[string]string{
"zlib": "\x00", "zlib": "\x00",
}, "", ` }, "", `
name : zlib-` + zlibVersion + ` name : zlib-` + zlibMeta.Version + `
description : lossless data-compression library description : lossless data-compression library
website : https://zlib.net website : https://zlib.net
`, func(cm *cache) error { `, func(cm *cache) error {
@@ -91,7 +91,7 @@ website : https://zlib.net
}}, }},
{"status report", []string{"zlib"}, nil, strings.Repeat("\x00", len(pkg.Checksum{})+8), ` {"status report", []string{"zlib"}, nil, strings.Repeat("\x00", len(pkg.Checksum{})+8), `
name : zlib-` + zlibVersion + ` name : zlib-` + zlibMeta.Version + `
description : lossless data-compression library description : lossless data-compression library
website : https://zlib.net website : https://zlib.net
status : not in report status : not in report
@@ -140,7 +140,7 @@ status : not in report
if tc.status != nil { if tc.status != nil {
for name, status := range tc.status { for name, status := range tc.status {
a, _ := _t.Load(rosa.ArtifactH(unique.Make(name))) _, a := _t.Load(rosa.ArtifactH(unique.Make(name)))
if a == nil { if a == nil {
t.Fatalf("invalid name %q", name) t.Fatalf("invalid name %q", name)
} }

View File

@@ -30,7 +30,7 @@ var (
// handleInfo writes constant system information. // handleInfo writes constant system information.
func handleInfo(w http.ResponseWriter, _ *http.Request) { func handleInfo(w http.ResponseWriter, _ *http.Request) {
infoPayloadOnce.Do(func() { infoPayloadOnce.Do(func() {
infoPayload.Count = int(rosa.Native().Count()) infoPayload.Count = len(rosa.Native().Collect())
infoPayload.HakureiVersion = info.Version() infoPayload.HakureiVersion = info.Version()
}) })
// TODO(mae): cache entire response if no additional fields are planned // TODO(mae): cache entire response if no additional fields are planned

View File

@@ -31,7 +31,7 @@ func TestAPIInfo(t *testing.T) {
checkPayload(t, resp, struct { checkPayload(t, resp, struct {
Count int `json:"count"` Count int `json:"count"`
HakureiVersion string `json:"hakurei_version"` HakureiVersion string `json:"hakurei_version"`
}{rosa.Native().Count(), info.Version()}) }{len(rosa.Native().Collect()), info.Version()})
} }
func TestAPIGet(t *testing.T) { func TestAPIGet(t *testing.T) {
@@ -92,11 +92,12 @@ func TestAPIGet(t *testing.T) {
) )
}) })
count := len(rosa.Native().Collect())
t.Run("index", func(t *testing.T) { t.Run("index", func(t *testing.T) {
t.Parallel() t.Parallel()
checkValidate( checkValidate(
t, "limit=1&sort=0&index", 0, rosa.Native().Count()-1, t, "limit=1&sort=0&index", 0, count-1,
"index must be an integer between 0 and "+strconv.Itoa(rosa.Native().Count()-1), "index must be an integer between 0 and "+strconv.Itoa(count-1),
) )
}) })

View File

@@ -33,10 +33,10 @@ type packageIndex struct {
// metadata holds [rosa.Metadata] extended with additional information. // metadata holds [rosa.Metadata] extended with additional information.
type metadata struct { type metadata struct {
handle rosa.ArtifactH handle rosa.ArtifactH
*rosa.Artifact *rosa.Metadata
// Populated via [rosa.Toolchain.Version], [rosa.Unversioned] is equivalent // Copied from [rosa.Metadata], [rosa.Unversioned] is equivalent to the zero
// to the zero value. Otherwise, the zero value is invalid. // value. Otherwise, the zero value is invalid.
Version string `json:"version,omitempty"` Version string `json:"version,omitempty"`
// Output data size, available if present in report. // Output data size, available if present in report.
Size int64 `json:"size,omitempty"` Size int64 `json:"size,omitempty"`
@@ -61,12 +61,12 @@ func (index *packageIndex) populate(report *rosa.Report) (err error) {
index.names = make(map[string]*metadata) index.names = make(map[string]*metadata)
ir := pkg.NewIR() ir := pkg.NewIR()
for i, handle := range handles { for i, handle := range handles {
a, version := rosa.Native().Std().MustLoad(handle) meta, a := rosa.Native().Std().MustLoad(handle)
m := metadata{ m := metadata{
handle: handle, handle: handle,
Artifact: rosa.Native().MustGet(handle), Metadata: meta,
Version: version, Version: meta.Version,
} }
if m.Version == "" { if m.Version == "" {
return errors.New("invalid version from " + m.Name) return errors.New("invalid version from " + m.Name)

View File

@@ -58,6 +58,19 @@ func main() {
log.Fatal("this program must not run as root") log.Fatal("this program must not run as root")
} }
defer func() {
r := recover()
if r == nil {
return
}
e, ok := r.(rosa.LoadError)
if !ok {
panic(r)
}
log.Fatal(e)
}()
ctx, stop := signal.NotifyContext(context.Background(), ctx, stop := signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
defer stop() defer stop()
@@ -71,12 +84,21 @@ func main() {
flagArch string flagArch string
flagCheck bool flagCheck bool
flagLTO bool flagLTO bool
flagPT bool
flagCrossOverride int flagCrossOverride int
addr net.UnixAddr addr net.UnixAddr
) )
c := command.New(os.Stderr, log.Printf, "mbf", func([]string) error { c := command.New(os.Stderr, log.Printf, "mbf", func([]string) error {
if !rosa.Native().HasStageEarly() {
return pkg.UnsupportedArchError(runtime.GOARCH)
}
if flagPT {
log.Println("parsed in", rosa.ParseTime())
}
msg.SwapVerbose(!flagQuiet) msg.SwapVerbose(!flagQuiet)
cm.ctx, cm.msg = ctx, msg cm.ctx, cm.msg = ctx, msg
cm.base = os.ExpandEnv(cm.base) cm.base = os.ExpandEnv(cm.base)
@@ -100,7 +122,7 @@ func main() {
rosa.Native().DropCaches("", flags) rosa.Native().DropCaches("", flags)
cross := flagArch != "" && flagArch != runtime.GOARCH cross := flagArch != "" && flagArch != runtime.GOARCH
if flagQEMU || cross { if flagQEMU || cross {
cm.qemu, _ = rosa.Native().Std().Load(rosa.QEMU) _, cm.qemu = rosa.Native().Std().MustLoad(rosa.H("qemu"))
} }
if cross { if cross {
@@ -109,7 +131,7 @@ func main() {
} }
rosa.Native().DropCaches(flagArch, flags) rosa.Native().DropCaches(flagArch, flags)
if !rosa.HasStage0() { if !rosa.Native().HasStageEarly() {
return pkg.UnsupportedArchError(flagArch) return pkg.UnsupportedArchError(flagArch)
} }
} }
@@ -170,6 +192,10 @@ func main() {
&addr.Name, &addr.Name,
"socket", command.StringFlag("$MBF_DAEMON_SOCKET"), "socket", command.StringFlag("$MBF_DAEMON_SOCKET"),
"Pathname of socket to bind to", "Pathname of socket to bind to",
).Flag(
&flagPT,
"parse-time", command.BoolFlag(false),
"Print duration of the initial azalea parse",
) )
c.NewCommand( c.NewCommand(
@@ -336,7 +362,7 @@ func main() {
for range max(flagJobs, 1) { for range max(flagJobs, 1) {
wg.Go(func() { wg.Go(func() {
for p := range w { for p := range w {
meta := rosa.Native().MustGet(p) meta, _ := rosa.Native().Std().MustLoad(p)
if meta.ID == 0 { if meta.ID == 0 {
continue continue
} }
@@ -349,13 +375,9 @@ func main() {
continue continue
} }
_, version := rosa.Native().Std().Load(p) if latest := meta.GetLatest(v); meta.Version != latest {
if current, latest :=
version,
meta.GetLatest(v); current != latest {
n.Add(1) n.Add(1)
log.Printf("%s %s < %s", meta.Name, current, latest) log.Printf("%s %s < %s", meta.Name, meta.Version, latest)
continue continue
} }
@@ -365,7 +387,7 @@ func main() {
} }
done: done:
for _, p := range rosa.Native().Collect() { for _, p := range rosa.Native().CollectAll() {
select { select {
case w <- p: case w <- p:
break break
@@ -430,8 +452,9 @@ func main() {
checksum [2]unique.Handle[pkg.Checksum] checksum [2]unique.Handle[pkg.Checksum]
) )
_llvm := rosa.H("llvm")
if err = cm.Do(func(cache *pkg.Cache) (err error) { if err = cm.Do(func(cache *pkg.Cache) (err error) {
llvm, _ := rosa.Native().New(s - 2).Load(rosa.LLVM) _, llvm := rosa.Native().New(s - 2).Load(_llvm)
pathname, _, err = cache.Cure(llvm) pathname, _, err = cache.Cure(llvm)
return return
}); err != nil { }); err != nil {
@@ -440,7 +463,7 @@ func main() {
log.Println("stage1:", pathname) log.Println("stage1:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) { if err = cm.Do(func(cache *pkg.Cache) (err error) {
llvm, _ := rosa.Native().New(s - 1).Load(rosa.LLVM) _, llvm := rosa.Native().New(s - 1).Load(_llvm)
pathname, checksum[0], err = cache.Cure(llvm) pathname, checksum[0], err = cache.Cure(llvm)
return return
}); err != nil { }); err != nil {
@@ -448,7 +471,7 @@ func main() {
} }
log.Println("stage2:", pathname) log.Println("stage2:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) { if err = cm.Do(func(cache *pkg.Cache) (err error) {
llvm, _ := rosa.Native().New(s).Load(rosa.LLVM) _, llvm := rosa.Native().New(s).Load(_llvm)
pathname, checksum[1], err = cache.Cure(llvm) pathname, checksum[1], err = cache.Cure(llvm)
return return
}); err != nil { }); err != nil {
@@ -470,8 +493,7 @@ func main() {
if flagStage0 { if flagStage0 {
if err = cm.Do(func(cache *pkg.Cache) (err error) { if err = cm.Do(func(cache *pkg.Cache) (err error) {
stage0, _ := rosa.Native().New(s).Load(rosa.Stage0) pathname, _, err = cache.Cure(rosa.Native().Std().NewStage0())
pathname, _, err = cache.Cure(stage0)
return return
}); err != nil { }); err != nil {
return return
@@ -524,7 +546,7 @@ func main() {
t -= 1 t -= 1
} }
a, _ := rosa.Native().New(t).Load(rosa.ArtifactH(unique.Make(args[0]))) _, a := rosa.Native().New(t).Load(rosa.ArtifactH(unique.Make(args[0])))
if a == nil { if a == nil {
return fmt.Errorf("unknown artifact %q", args[0]) return fmt.Errorf("unknown artifact %q", args[0])
} }
@@ -737,22 +759,22 @@ func main() {
"shell", "shell",
"Interactive shell in the specified Rosa OS environment", "Interactive shell in the specified Rosa OS environment",
func(args []string) error { func(args []string) error {
handles := make([]rosa.ArtifactH, len(args)+3) handles := make([]rosa.ArtifactH, len(args), len(args)+3)
for i, arg := range args { for i, arg := range args {
handles[i] = rosa.ArtifactH(unique.Make(arg)) handles[i] = rosa.ArtifactH(unique.Make(arg))
if rosa.Native().Get(handles[i]) == nil { if meta, _ := rosa.Native().Std().Load(handles[i]); meta == nil {
return fmt.Errorf("unknown artifact %q", arg) return fmt.Errorf("unknown artifact %q", arg)
} }
} }
base := rosa.LLVM base := rosa.H("llvm")
if !flagWithToolchain { if !flagWithToolchain {
base = rosa.Musl base = rosa.H("musl")
} }
handles = append(handles, handles = append(handles,
base, base,
rosa.Mksh, rosa.H("mksh"),
rosa.Toybox, rosa.H("toybox"),
) )
root := make(pkg.Collect, 0, 6+len(args)) root := make(pkg.Collect, 0, 6+len(args))

View File

@@ -36,8 +36,8 @@ func TestCureAll(t *testing.T) {
}) })
for _, handle := range rosa.Native().Collect() { for _, handle := range rosa.Native().Collect() {
a, _ := rosa.Native().Std().MustLoad(handle) _, a := rosa.Native().Std().MustLoad(handle)
t.Run(rosa.Native().MustGet(handle).Name, func(t *testing.T) { t.Run(handle.String(), func(t *testing.T) {
_, err := cureRemote(t.Context(), &addr, a, 0) _, err := cureRemote(t.Context(), &addr, a, 0)
if err != nil { if err != nil {
t.Error(err) t.Error(err)

View File

@@ -139,7 +139,6 @@
GOCACHE="$(mktemp -d)" \ GOCACHE="$(mktemp -d)" \
PATH="${pkgs.pkgsStatic.musl.bin}/bin:$PATH" \ PATH="${pkgs.pkgsStatic.musl.bin}/bin:$PATH" \
DESTDIR="$out" \ DESTDIR="$out" \
HAKUREI_VERSION="v${hakurei.version}" \
./all.sh ./all.sh
''; '';
} }

View File

@@ -183,10 +183,10 @@ func TestExec(t *testing.T) {
"checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400, Data: []byte{}}, "checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb": {Mode: 0400, Data: []byte{}},
"identifier": {Mode: fs.ModeDir | 0700}, "identifier": {Mode: fs.ModeDir | 0700},
"identifier/IY91PCtOpCYy21AaIK0c9f8-Z6fb2_2ewoHWkt4dxoLf0GOrWqS8yAGFLV84b1Dw": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
"identifier/QwS7SmiatdqryQYgESdGw7Yw2PcpNf0vNfpvUA0t92BTlKiUjfCrXyMW17G2X77X": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "identifier/QwS7SmiatdqryQYgESdGw7Yw2PcpNf0vNfpvUA0t92BTlKiUjfCrXyMW17G2X77X": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
"identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")}, "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")},
"identifier/" + expected.Offline: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "identifier/" + expected.Offline: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
"identifier/" + expected.OfflineS: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)},
"identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")},
"substitute": {Mode: fs.ModeDir | 0700}, "substitute": {Mode: fs.ModeDir | 0700},

View File

@@ -2,6 +2,7 @@ package expected
const ( const (
Offline = "q5ktDTq0miP-VvB2blxqXQeaRXCUWgP_KbC18KNtUDtyoaI_h5mHmGuPMArVEBDs" Offline = "q5ktDTq0miP-VvB2blxqXQeaRXCUWgP_KbC18KNtUDtyoaI_h5mHmGuPMArVEBDs"
OfflineS = "IY91PCtOpCYy21AaIK0c9f8-Z6fb2_2ewoHWkt4dxoLf0GOrWqS8yAGFLV84b1Dw"
OvlRoot = "NacZGXwuRkTvcHaG08a22ujJ8qCWN0RSoFlRSR5FSt0ZcBbJ28FRvkYsHEtX7G8i" OvlRoot = "NacZGXwuRkTvcHaG08a22ujJ8qCWN0RSoFlRSR5FSt0ZcBbJ28FRvkYsHEtX7G8i"
Layers = "WBJDrATtX6rIE5yAu8ePX3WmDF0Tt9kFiue0m3cRnyRoVx1my8a67fh3CAW486oP" Layers = "WBJDrATtX6rIE5yAu8ePX3WmDF0Tt9kFiue0m3cRnyRoVx1my8a67fh3CAW486oP"
Net = "CmYtj2sNB3LHtqiDuck_Lz3MjLLIiwyP8N4NDitQ1Icvv__LVP9p8tm-sHeQaKKp" Net = "CmYtj2sNB3LHtqiDuck_Lz3MjLLIiwyP8N4NDitQ1Icvv__LVP9p8tm-sHeQaKKp"

View File

@@ -2,6 +2,7 @@ package expected
const ( const (
Offline = "WapqyoPxbWSnq07dWHt71mHaJXq99pAjJfFlELlJljSiZMhTFqqlzU1_mN86shSj" Offline = "WapqyoPxbWSnq07dWHt71mHaJXq99pAjJfFlELlJljSiZMhTFqqlzU1_mN86shSj"
OfflineS = "ibQZHcdXgNQ1OiMX1FrburBbGPVvKEHvPilbQCkm_0oV0BQCHomyyTbYNrFMGIwl"
OvlRoot = "V9anFOiRvjGfAeBhLl14AL8TKdWZyD0WTPYe4fS9mOBw8iW5Lmarvt6TG6MV8uWm" OvlRoot = "V9anFOiRvjGfAeBhLl14AL8TKdWZyD0WTPYe4fS9mOBw8iW5Lmarvt6TG6MV8uWm"
Layers = "tKx7JNRoSBdK_7MdzI-nwTNV2wmiPzwYdcd17oLmXKL_iLmUzUiA79qTqdrTasrv" Layers = "tKx7JNRoSBdK_7MdzI-nwTNV2wmiPzwYdcd17oLmXKL_iLmUzUiA79qTqdrTasrv"
Net = "aXyDLzBCJ9XltXZIfetEVsEkrqHfcXuD5XE_FcUnYbN3emwL55N6P8LlHzNfGnM5" Net = "aXyDLzBCJ9XltXZIfetEVsEkrqHfcXuD5XE_FcUnYbN3emwL55N6P8LlHzNfGnM5"

View File

@@ -2,6 +2,7 @@ package expected
const ( const (
Offline = "Z6yXE5gOJScL3srmnVMWgCXccDiUNZ5snSrf6RkXuU1_U0rX_kGVwsfHUgNG_awd" Offline = "Z6yXE5gOJScL3srmnVMWgCXccDiUNZ5snSrf6RkXuU1_U0rX_kGVwsfHUgNG_awd"
OfflineS = "zN16xv6LKRJRipUJwupyxg2rZcvf-qpsMn_qCxUmgxlTSuNwYI70ZEb7dHW5k0gO"
OvlRoot = "zYXJHFRLuxvUhuisZEXgGgVvdQd6piMfp5jmtT6jdVjvC2gICXquOq-UTwlrSD5I" OvlRoot = "zYXJHFRLuxvUhuisZEXgGgVvdQd6piMfp5jmtT6jdVjvC2gICXquOq-UTwlrSD5I"
Layers = "_F8EDazHbcLeT0sVSQXRN_kn9IjduqJcDYgzXpsT-hpKU4EBcZ0PISN2zchpqMbm" Layers = "_F8EDazHbcLeT0sVSQXRN_kn9IjduqJcDYgzXpsT-hpKU4EBcZ0PISN2zchpqMbm"
Net = "CA_FAaSIYJgapBEHV40doxpH23PdUEy_6s1TZc7wfSPN0XYqwGpMceXXDSabGveO" Net = "CA_FAaSIYJgapBEHV40doxpH23PdUEy_6s1TZc7wfSPN0XYqwGpMceXXDSabGveO"

View File

@@ -1,110 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newAttr() (pkg.Artifact, string) {
const (
version = "2.5.2"
checksum = "YWEphrz6vg1sUMmHHVr1CRo53pFXRhq_pjN-AlG8UgwZK1y6m7zuDhxqJhD0SV0l"
)
return t.NewPackage("attr", version, newTar(
"https://download.savannah.nongnu.org/releases/attr/"+
"attr-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Patches: []KV{
{"libgen-basename", `From 8a80d895dfd779373363c3a4b62ecce5a549efb2 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sat, 30 Mar 2024 10:17:10 +0100
Subject: tools/attr.c: Add missing libgen.h include for basename(3)
Fixes compilation issue with musl and modern C99 compilers.
See: https://bugs.gentoo.org/926294
---
tools/attr.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/attr.c b/tools/attr.c
index f12e4af..6a3c1e9 100644
--- a/tools/attr.c
+++ b/tools/attr.c
@@ -28,6 +28,7 @@
#include <errno.h>
#include <string.h>
#include <locale.h>
+#include <libgen.h>
#include <attr/attributes.h>
--
cgit v1.1`},
{"musl-errno", `diff --git a/test/attr.test b/test/attr.test
index 6ce2f9b..e9bde92 100644
--- a/test/attr.test
+++ b/test/attr.test
@@ -11,7 +11,7 @@ Try various valid and invalid names
$ touch f
$ setfattr -n user -v value f
- > setfattr: f: Operation not supported
+ > setfattr: f: Not supported
$ setfattr -n user. -v value f
> setfattr: f: Invalid argument
`},
},
ScriptEarly: `
ln -s ../../system/bin/perl /usr/bin
`,
}, (*MakeHelper)(nil),
Perl,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newAttr,
Name: "attr",
Description: "Commands for Manipulating Filesystem Extended Attributes",
Website: "https://savannah.nongnu.org/projects/attr/",
ID: 137,
})
}
func (t Toolchain) newACL() (pkg.Artifact, string) {
const (
version = "2.3.2"
checksum = "-fY5nwH4K8ZHBCRXrzLdguPkqjKI6WIiGu4dBtrZ1o0t6AIU73w8wwJz_UyjIS0P"
)
return t.NewPackage("acl", version, newTar(
"https://download.savannah.nongnu.org/releases/acl/"+
"acl-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, &MakeHelper{
// makes assumptions about uid_map/gid_map
SkipCheck: true,
},
Attr,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newACL,
Name: "acl",
Description: "Commands for Manipulating POSIX Access Control Lists",
Website: "https://savannah.nongnu.org/projects/acl/",
Dependencies: P{
Attr,
},
ID: 16,
})
}

View File

@@ -1,36 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newArgpStandalone() (pkg.Artifact, string) {
const (
version = "1.3"
checksum = "vtW0VyO2pJ-hPyYmDI2zwSLS8QL0sPAUKC1t3zNYbwN2TmsaE-fADhaVtNd3eNFl"
)
return t.NewPackage("argp-standalone", version, newTar(
"http://www.lysator.liu.se/~nisse/misc/"+
"argp-standalone-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Env: []string{
"CC=cc -std=gnu89 -fPIC",
},
}, &MakeHelper{
Install: `
install -D -m644 /usr/src/argp-standalone/argp.h /work/system/include/argp.h
install -D -m755 libargp.a /work/system/lib/libargp.a
`,
},
Diffutils,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newArgpStandalone,
Name: "argp-standalone",
Description: "hierarchical argument parsing library broken out from glibc",
Website: "http://www.lysator.liu.se/~nisse/misc/",
})
}

View File

@@ -5,12 +5,13 @@ import (
"fmt" "fmt"
"maps" "maps"
"reflect" "reflect"
"slices"
"unique" "unique"
) )
// Value are types supported by the language. // Value are types supported by the language.
type Value interface { type Value interface {
bool | int64 | string | []string | [][2]string bool | int64 | string | []string | []int64 | [][2]string
} }
type ( type (
@@ -23,9 +24,12 @@ type (
// FArgs are arguments passed to [F]. // FArgs are arguments passed to [F].
FArgs []FArg FArgs []FArg
// PF implements the package declaration function.
PF func(name Ident, args FArgs) (v any, set bool, err error)
// F is the implementation of a [Func]. // F is the implementation of a [Func].
F struct { F struct {
F func(isPackage bool, args FArgs) (v any, set bool, err error) F func(args FArgs) (v any, set bool, err error)
V map[unique.Handle[Ident]]any V map[unique.Handle[Ident]]any
} }
) )
@@ -77,8 +81,20 @@ func (e UndefinedError) Error() string {
} }
// evaluate is evaluateAny with a type parameter. // evaluate is evaluateAny with a type parameter.
func evaluate[T Value](s []Frame, expr any, rp *T) bool { func evaluate[T Value](d PF, s []Frame, expr any, rp *T) bool {
return evaluateAny(s, expr, rp) return evaluateAny(d, s, expr, rp)
}
// evaluateArray evaluates expr and returns its values as a slice.
func evaluateArray[T Value](d PF, s []Frame, expr Array) []T {
r := make([]T, 0, len(expr))
for i := range expr {
var _r T
if evaluate(d, s, expr[i], &_r) {
r = append(r, _r)
}
}
return r
} }
// TypeError is an unexpected type during evaluation. // TypeError is an unexpected type during evaluation.
@@ -87,7 +103,7 @@ type TypeError struct {
} }
func (e TypeError) Error() string { func (e TypeError) Error() string {
return "expected " + e.Asserted.String() + ", got " + e.Concrete.String() return fmt.Sprintf("expected %s, got %s", e.Asserted, e.Concrete)
} }
func (e TypeError) Is(err error) bool { func (e TypeError) Is(err error) bool {
@@ -132,8 +148,25 @@ func (e EvaluationError) Error() string {
return fmt.Sprintf("expression %#v: %v", e.Expr, e.Err) return fmt.Sprintf("expression %#v: %v", e.Expr, e.Err)
} }
var (
// IdentInputs is a special array argument in a package declaration whose
// values of [Ident] are kept as is when passed to a [PF].
IdentInputs = unique.Make(Ident("inputs"))
// IdentRuntime has the same semantics as [IdentInputs].
IdentRuntime = unique.Make(Ident("runtime"))
// IdentExtra has the same semantics as [IdentInputs].
IdentExtra = unique.Make(Ident("extra"))
// IdentSource is a special argument in a package declaration where an
// assignment of a [Val] with a single [Ident] passes through the evaluator.
IdentSource = unique.Make(Ident("source"))
// ErrInvalidSpecial is panicked for a special [PF] argument sharing its
// value or set for R.
ErrInvalidSpecial = errors.New("special must not be common or bound to scope")
)
// evaluateAny implements [Evaluate]. // evaluateAny implements [Evaluate].
func evaluateAny(s []Frame, expr, rp any) bool { func evaluateAny(d PF, s []Frame, expr, rp any) bool {
defer func() { defer func() {
r := recover() r := recover()
if r == nil { if r == nil {
@@ -193,17 +226,17 @@ func evaluateAny(s []Frame, expr, rp any) bool {
store(rp, false) store(rp, false)
return true return true
default: default:
return evaluateAny(s, v, rp) return evaluateAny(d, s, v, rp)
} }
default: default:
return evaluateAny(s, e[0], rp) return evaluateAny(d, s, e[0], rp)
} }
} }
var v string var v string
for i := range e { for i := range e {
var _r string var _r string
if evaluate(s, e[i], &_r) { if evaluate(d, s, e[i], &_r) {
v += _r v += _r
} }
} }
@@ -211,21 +244,20 @@ func evaluateAny(s []Frame, expr, rp any) bool {
return true return true
case Array: case Array:
r := make([]string, 0, len(e)) if len(e) > 0 && len(e[0]) == 1 {
for i := range e { if _, ok := e[0][0].(Int); ok {
var _r string store(rp, evaluateArray[int64](d, s, e))
if evaluate(s, e[i], &_r) { return true
r = append(r, _r)
} }
} }
store(rp, r) store(rp, evaluateArray[string](d, s, e))
return true return true
case []KV: case []KV:
r := make([][2]string, 0, len(e)) r := make([][2]string, 0, len(e))
for i := range e { for i := range e {
var _r string var _r string
if e[i].V == nil || evaluate(s, e[i].V, &_r) { if e[i].V == nil || evaluate(d, s, e[i].V, &_r) {
r = append(r, [2]string{string(e[i].K), _r}) r = append(r, [2]string{string(e[i].K), _r})
} }
} }
@@ -237,6 +269,7 @@ func evaluateAny(s []Frame, expr, rp any) bool {
f F f F
ok bool ok bool
) )
if !e.Package {
for i := range s { for i := range s {
f, ok = s[len(s)-1-i].Func[unique.Make(e.Ident)] f, ok = s[len(s)-1-i].Func[unique.Make(e.Ident)]
if ok { if ok {
@@ -246,35 +279,86 @@ func evaluateAny(s []Frame, expr, rp any) bool {
if !ok { if !ok {
panic(UndefinedError(e.Ident)) panic(UndefinedError(e.Ident))
} }
}
argc := len(e.Args) argc := len(e.Args)
for _, arg := range e.Args { for _, arg := range e.Args {
argc += len(arg.K) - 1 argc += len(arg.K) - 1
} }
fargs := make([]FArg, 0, len(e.Args)) fargs := make([]FArg, 0, len(e.Args))
s = append(s, Frame{Val: maps.Clone(f.V)}) s = append(s, Frame{})
fp := &s[len(s)-1] fp := &s[len(s)-1]
if !e.Package {
fp.Val = maps.Clone(f.V)
}
args:
for _, arg := range e.Args { for _, arg := range e.Args {
names := make([]unique.Handle[Ident], len(arg.K))
for i, name := range arg.K {
names[i] = unique.Make(name)
}
farg := FArg{R: arg.R} farg := FArg{R: arg.R}
if !evaluateAny(s, arg.V, &farg.V) { if e.Package {
for _, special := range [...]unique.Handle[Ident]{
IdentInputs,
IdentRuntime,
IdentExtra,
} {
if slices.Contains(names, special) {
if len(names) != 1 || len(arg.V) != 1 || arg.R {
panic(ErrInvalidSpecial)
}
farg.K = names[0]
if err := storeE(&farg.V, arg.V[0]); err != nil {
panic(err)
}
fargs = append(fargs, farg)
continue args
}
}
if slices.Contains(names, IdentSource) {
if len(names) != 1 || len(arg.V) != 1 || arg.R {
panic(ErrInvalidSpecial)
}
if _, ok = arg.V[0].(Ident); ok {
farg.K = names[0]
if err := storeE(&farg.V, arg.V[0]); err != nil {
panic(err)
}
fargs = append(fargs, farg)
continue args
}
}
}
if !evaluateAny(d, s, arg.V, &farg.V) {
farg.V = nil farg.V = nil
} }
for _, name := range arg.K { for _, name := range names {
h := unique.Make(name) farg.K = name
farg.K = h
fargs = append(fargs, farg) fargs = append(fargs, farg)
if arg.R && farg.V != nil { if arg.R && farg.V != nil {
if fp.Val == nil { if fp.Val == nil {
fp.Val = make(map[unique.Handle[Ident]]any) fp.Val = make(map[unique.Handle[Ident]]any)
} }
(*fp).Val[h] = farg.V (*fp).Val[name] = farg.V
} }
} }
} }
v, set, err := f.F(e.Package, fargs) var (
v any
err error
)
if !e.Package {
v, ok, err = f.F(fargs)
} else {
v, ok, err = d(e.Ident, fargs)
}
if err != nil { if err != nil {
panic(err) panic(err)
} else if v != nil { } else if v != nil {
@@ -282,7 +366,7 @@ func evaluateAny(s []Frame, expr, rp any) bool {
panic(err) panic(err)
} }
} }
return set return ok
default: default:
panic(UnsupportedExprError{expr}) panic(UnsupportedExprError{expr})
@@ -290,7 +374,7 @@ func evaluateAny(s []Frame, expr, rp any) bool {
} }
// Evaluate evaluates a statement and returns its value. // Evaluate evaluates a statement and returns its value.
func Evaluate[T Value](s []Frame, expr any) (v T, set bool, err error) { func Evaluate[T any](d PF, s []Frame, expr any) (v T, set bool, err error) {
defer func() { defer func() {
r := recover() r := recover()
if r == nil { if r == nil {
@@ -303,6 +387,6 @@ func Evaluate[T Value](s []Frame, expr any) (v T, set bool, err error) {
} }
err = _err err = _err
}() }()
set = evaluate[T](s, expr, &v) set = evaluateAny(d, s, expr, &v)
return return
} }

View File

@@ -16,19 +16,26 @@ import (
func makeStackCheck(check func(args FArgs) (any, error)) []Frame { func makeStackCheck(check func(args FArgs) (any, error)) []Frame {
return []Frame{{Func: map[unique.Handle[Ident]]F{ return []Frame{{Func: map[unique.Handle[Ident]]F{
unique.Make(Ident("f")): {F: func( unique.Make(Ident("f")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
set = true set = true
v, err = check(args) v, err = check(args)
if isPackage {
err = errors.New("unexpected package")
}
return return
}}, }},
}}} }}}
} }
// checkArgs is like makeStackCheck, but the resulting function asserts that its
// args match the expected value.
func checkArgs(want FArgs) []Frame {
return makeStackCheck(func(args FArgs) (any, error) {
if !reflect.DeepEqual(args, want) {
return nil, fmt.Errorf("%#v, want %#v", args, want)
}
return "\xfd", nil
})
}
func TestEvaluate(t *testing.T) { func TestEvaluate(t *testing.T) {
t.Parallel() t.Parallel()
@@ -36,7 +43,7 @@ func TestEvaluate(t *testing.T) {
name string name string
data string data string
s []Frame s []Frame
want string want any
err error err error
}{ }{
{"apply unset", `f { v = unset; }`, makeStackCheck(func( {"apply unset", `f { v = unset; }`, makeStackCheck(func(
@@ -101,6 +108,78 @@ func TestEvaluate(t *testing.T) {
Expr: Ident("nil"), Expr: Ident("nil"),
Err: UndefinedError("nil"), Err: UndefinedError("nil"),
}}, }},
{"common inputs", `package name { inputs, v = []; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
Package: true,
Args: []Arg{
{K: []Ident{
"inputs",
"v",
}, V: Val{Array(nil)}},
},
},
Err: ErrInvalidSpecial,
}},
{"bound inputs", `package name { inputs* = []; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
Package: true,
Args: []Arg{
{K: []Ident{"inputs"}, V: Val{Array(nil)}, R: true},
},
},
Err: ErrInvalidSpecial,
}},
{"bound runtime", `package name { runtime* = []; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
Package: true,
Args: []Arg{
{K: []Ident{"runtime"}, V: Val{Array(nil)}, R: true},
},
},
Err: ErrInvalidSpecial,
}},
{"concat inputs", `package name { inputs = ""+""; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
Package: true,
Args: []Arg{
{K: []Ident{"inputs"}, V: Val{String(""), String("")}},
},
},
Err: ErrInvalidSpecial,
}},
{"concat source", `package name { source = ""+""; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
Package: true,
Args: []Arg{
{K: []Ident{"source"}, V: Val{String(""), String("")}},
},
},
Err: ErrInvalidSpecial,
}},
{"source handle", `package name { source = name; }`, nil, FArgs{
{K: unique.Make(Ident("source")), V: Ident("name")},
}, nil},
{"integer array", `f { v = [ 0 ]; _v = [ 0, 9 ]; }`, checkArgs(FArgs{
{K: unique.Make(Ident("v")), V: []int64{0}},
{K: unique.Make(Ident("_v")), V: []int64{0, 9}},
}), "\xfd", nil},
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
@@ -114,12 +193,23 @@ func TestEvaluate(t *testing.T) {
} else { } else {
expr = e[0].(Func) expr = e[0].(Func)
} }
r, set, err := Evaluate[string](tc.s, expr) const rPackage = "\xff\xff\xff\xff"
r, set, err := Evaluate[string](func(
name Ident,
args FArgs,
) (v any, set bool, err error) {
v = rPackage
if !reflect.DeepEqual(args, tc.want) {
err = fmt.Errorf("%#v, want %#v", args, tc.want)
}
set = true
return
}, tc.s, expr)
if set != (err == nil) { if set != (err == nil) {
t.Error("Evaluate: unexpected unset") t.Error("Evaluate: unexpected unset")
} }
if r != tc.want { if r != rPackage && r != tc.want {
t.Errorf("Evaluate: %q, want %q", r, tc.want) t.Errorf("Evaluate: %q, want %q", r, tc.want)
} }
@@ -147,36 +237,19 @@ func TestEvaluateGCC(t *testing.T) {
} }
var got [3]FArgs var got [3]FArgs
if r, set, err := Evaluate[string]([]Frame{{ if r, set, err := Evaluate[string](func(
Func: map[unique.Handle[Ident]]F{ name Ident,
unique.Make(Ident("gcc")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
v = "\x00" v = "\x00"
if !isPackage {
err = errors.New("not a package")
}
set = true set = true
got[0] = args got[0] = args
return return
}, V: map[unique.Handle[Ident]]any{ }, []Frame{{
unique.Make(Ident("binutils")): "binutils", Func: map[unique.Handle[Ident]]F{
unique.Make(Ident("mpc")): "mpc",
unique.Make(Ident("zlib")): "zlib",
unique.Make(Ident("libucontext")): "libucontext",
unique.Make(Ident("kernel-headers")): "kernel-headers",
}},
unique.Make(Ident("remoteTar")): {F: func( unique.Make(Ident("remoteTar")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
if isPackage {
err = errors.New("unexpected package")
return
}
var url, checksum string var url, checksum string
var compress int var compress int
if err = args.Apply(map[unique.Handle[Ident]]any{ if err = args.Apply(map[unique.Handle[Ident]]any{
@@ -198,37 +271,25 @@ func TestEvaluateGCC(t *testing.T) {
}}, }},
unique.Make(Ident("make")): {F: func( unique.Make(Ident("make")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
v = args v = args
if isPackage {
err = errors.New("unexpected package")
}
set = true set = true
return return
}}, }},
unique.Make(Ident("arch")): {F: func( unique.Make(Ident("arch")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
set = false set = false
if isPackage {
err = errors.New("unexpected package")
}
got[1] = args got[1] = args
return return
}}, }},
unique.Make(Ident("noop")): {F: func( unique.Make(Ident("noop")): {F: func(
isPackage bool,
args FArgs, args FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
set = false set = false
if isPackage {
err = errors.New("unexpected package")
}
set = true set = true
got[2] = args got[2] = args
return return
@@ -274,12 +335,12 @@ func TestEvaluateGCC(t *testing.T) {
{K: unique.Make(Ident("skip-check")), V: true}, {K: unique.Make(Ident("skip-check")), V: true},
}}, }},
{K: unique.Make(Ident("inputs")), V: []string{ {K: unique.Make(Ident("inputs")), V: Array{
"binutils", {Ident("binutils")},
"mpc", {Ident("mpc")},
"zlib", {Ident("zlib")},
"libucontext", {Ident("libucontext")},
"kernel-headers", {Ident("kernel-headers")},
}}, }},
}, },
{ {
@@ -304,21 +365,7 @@ func BenchmarkEvaluate(b *testing.B) {
s := []Frame{{ s := []Frame{{
Func: map[unique.Handle[Ident]]F{ Func: map[unique.Handle[Ident]]F{
unique.Make(Ident("gcc")): {F: func(
bool,
FArgs,
) (v any, set bool, err error) {
return
}, V: map[unique.Handle[Ident]]any{
unique.Make(Ident("binutils")): "binutils",
unique.Make(Ident("mpc")): "mpc",
unique.Make(Ident("zlib")): "zlib",
unique.Make(Ident("libucontext")): "libucontext",
unique.Make(Ident("kernel-headers")): "kernel-headers",
}},
unique.Make(Ident("remoteTar")): {F: func( unique.Make(Ident("remoteTar")): {F: func(
bool,
FArgs, FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
return return
@@ -327,21 +374,18 @@ func BenchmarkEvaluate(b *testing.B) {
}}, }},
unique.Make(Ident("make")): {F: func( unique.Make(Ident("make")): {F: func(
bool,
FArgs, FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
return return
}}, }},
unique.Make(Ident("arch")): {F: func( unique.Make(Ident("arch")): {F: func(
bool,
FArgs, FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
return return
}}, }},
unique.Make(Ident("noop")): {F: func( unique.Make(Ident("noop")): {F: func(
bool,
FArgs, FArgs,
) (v any, set bool, err error) { ) (v any, set bool, err error) {
return return
@@ -351,7 +395,12 @@ func BenchmarkEvaluate(b *testing.B) {
}, },
}} }}
for b.Loop() { for b.Loop() {
if _, _, err := Evaluate[string](s, gcc); err != nil { if _, _, err := Evaluate[string](func(
Ident,
FArgs,
) (v any, set bool, err error) {
return
}, s, gcc); err != nil {
b.Fatal(err) b.Fatal(err)
} }
} }

106
internal/rosa/builtins.go Normal file
View File

@@ -0,0 +1,106 @@
package rosa
import (
"path"
"slices"
"strconv"
"strings"
"hakurei.app/internal/pkg"
)
const (
// jobsE is expression for preferred job count set by [pkg].
jobsE = `"$` + pkg.EnvJobs + `"`
// jobsFlagE is expression for flag with preferred job count.
jobsFlagE = `"-j$` + pkg.EnvJobs + `"`
// jobsLE is expression for twice of preferred job count set by [pkg].
jobsLE = `"$(expr ` + jobsE + ` '*' 2)"`
// jobsLFlagE is expression for flag with double of preferred job count.
jobsLFlagE = `"-j$(expr ` + jobsE + ` '*' 2)"`
)
// newTar wraps [pkg.NewHTTPGetTar] with a simpler function signature.
func newTar(url, checksum string, compression uint32) pkg.Artifact {
return pkg.NewHTTPGetTar(nil, url, mustDecode(checksum), compression)
}
// newFromCPAN is a helper for downloading release from CPAN.
func newFromCPAN(author, name, version, checksum string) pkg.Artifact {
return newTar(
"https://cpan.metacpan.org/authors/id/"+
author[:1]+"/"+author[:2]+"/"+author+"/"+
name+"-"+version+".tar.gz",
checksum,
pkg.TarGzip,
)
}
// newFromGitLab is a helper for downloading source from GitLab.
func newFromGitLab(domain, suffix, ref, checksum string) pkg.Artifact {
return newTar(
"https://"+domain+"/"+suffix+"/-/archive/"+
ref+"/"+path.Base(suffix)+"-"+
strings.ReplaceAll(ref, "/", "-")+".tar.bz2",
checksum,
pkg.TarBzip2,
)
}
// newFromGitHub is a helper for downloading source from Microsoft Github.
func newFromGitHub(suffix, tag, checksum string) pkg.Artifact {
return newTar(
"https://github.com/"+suffix+
"/archive/refs/tags/"+tag+".tar.gz",
checksum,
pkg.TarGzip,
)
}
// newFromGitHubRelease is a helper for downloading release tarball from
// Microsoft Github.
func newFromGitHubRelease(
suffix, tag, name, checksum string,
compression uint32,
) pkg.Artifact {
return newTar(
"https://github.com/"+suffix+
"/releases/download/"+tag+"/"+name,
checksum,
compression,
)
}
// skipGNUTests generates a string for skipping specific tests by number in a
// GNU test suite. This is nontrivial because the test suite does not support
// excluding tests in any way, so ranges for all but the skipped tests have to
// be specified instead.
//
// For example, to skip test 764, ranges around the skipped test must be
// specified:
//
// 1-763 765-
//
// Tests are numbered starting from 1. The resulting string is unquoted.
func skipGNUTests(tests ...int64) string {
tests = slices.Clone(tests)
slices.Sort(tests)
var buf strings.Builder
if tests[0] != 1 {
buf.WriteString("1-")
}
for i, n := range tests {
if n != 1 && (i == 0 || tests[i-1] != n-1) {
buf.WriteString(strconv.Itoa(int(n - 1)))
buf.WriteString(" ")
}
if i == len(tests)-1 || tests[i+1] != n+1 {
buf.WriteString(strconv.Itoa(int(n + 1)))
buf.WriteString("-")
}
}
return buf.String()
}

View File

@@ -11,18 +11,18 @@ func TestSkipGNUTests(t *testing.T) {
t.Parallel() t.Parallel()
testCases := []struct { testCases := []struct {
tests []int tests []int64
want string want string
}{ }{
{[]int{764}, "1-763 765-"}, {[]int64{764}, "1-763 765-"},
{[]int{764, 0xcafe, 37, 9}, "1-8 10-36 38-763 765-51965 51967-"}, {[]int64{764, 0xcafe, 37, 9}, "1-8 10-36 38-763 765-51965 51967-"},
{[]int{1, 2, 0xbed}, "3-3052 3054-"}, {[]int64{1, 2, 0xbed}, "3-3052 3054-"},
{[]int{3, 4}, "1-2 5-"}, {[]int64{3, 4}, "1-2 5-"},
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(strings.Join(slices.Collect(func(yield func(string) bool) { t.Run(strings.Join(slices.Collect(func(yield func(string) bool) {
for _, n := range tc.tests { for _, n := range tc.tests {
yield(strconv.Itoa(n)) yield(strconv.Itoa(int(n)))
} }
}), ","), func(t *testing.T) { }), ","), func(t *testing.T) {
t.Parallel() t.Parallel()

View File

@@ -1,38 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newBzip2() (pkg.Artifact, string) {
const (
version = "1.0.8"
checksum = "cTLykcco7boom-s05H1JVsQi1AtChYL84nXkg_92Dm1Xt94Ob_qlMg_-NSguIK-c"
)
return t.NewPackage("bzip2", version, newTar(
"https://sourceware.org/pub/bzip2/bzip2-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Writable: true,
EnterSource: true,
}, &MakeHelper{
// uses source tree as scratch space
SkipConfigure: true,
SkipCheck: true,
InPlace: true,
Make: []string{
"CC=cc",
},
Install: "make PREFIX=/work/system install",
}), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newBzip2,
Name: "bzip2",
Description: "a freely available, patent free, high-quality data compressor",
Website: "https://sourceware.org/bzip2/",
ID: 237,
})
}

View File

@@ -4,118 +4,12 @@ import (
"path/filepath" "path/filepath"
"slices" "slices"
"strings" "strings"
"hakurei.app/internal/pkg"
) )
func (t Toolchain) newCMake() (pkg.Artifact, string) { var (
const ( _cmake = H("cmake")
version = "4.3.2" _ninja = H("ninja")
checksum = "6QylwRVKletndTSkZTV2YBRwgd_9rUVgav_QW23HpjUgV21AVYZOUOal8tdBDmO7"
) )
return t.NewPackage("cmake", version, newFromGitHubRelease(
"Kitware/CMake",
"v"+version,
"cmake-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
// test suite expects writable source tree
Writable: true,
// expected to be writable in the copy made during bootstrap
Chmod: true,
Patches: []KV{
{"bootstrap-test-no-openssl", `diff --git a/Tests/BootstrapTest.cmake b/Tests/BootstrapTest.cmake
index 137de78bc1..b4da52e664 100644
--- a/Tests/BootstrapTest.cmake
+++ b/Tests/BootstrapTest.cmake
@@ -9,7 +9,7 @@ if(NOT nproc EQUAL 0)
endif()
message(STATUS "running bootstrap: ${bootstrap} ${ninja_arg} ${parallel_arg}")
execute_process(
- COMMAND ${bootstrap} ${ninja_arg} ${parallel_arg}
+ COMMAND ${bootstrap} ${ninja_arg} ${parallel_arg} -- -DCMAKE_USE_OPENSSL=OFF
WORKING_DIRECTORY "${bin_dir}"
RESULT_VARIABLE result
)
`},
{"disable-broken-tests-musl", `diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 2ead810437..f85cbb8b1c 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -384,7 +384,6 @@ if(BUILD_TESTING)
add_subdirectory(CMakeLib)
endif()
add_subdirectory(CMakeOnly)
- add_subdirectory(RunCMake)
add_subdirectory(FindPackageModeMakefileTest)
@@ -528,9 +527,6 @@ if(BUILD_TESTING)
-DCMake_TEST_CUDA:BOOL=${CMake_TEST_CUDA}
-DCMake_INSTALL_NAME_TOOL_BUG:BOOL=${CMake_INSTALL_NAME_TOOL_BUG}
)
- ADD_TEST_MACRO(ExportImport ExportImport)
- set_property(TEST ExportImport APPEND
- PROPERTY LABELS "CUDA")
ADD_TEST_MACRO(Unset Unset)
ADD_TEST_MACRO(PolicyScope PolicyScope)
ADD_TEST_MACRO(EmptyLibrary EmptyLibrary)
@@ -624,7 +620,6 @@ if(BUILD_TESTING)
# run test for BundleUtilities on supported platforms/compilers
if((MSVC OR
MINGW OR
- CMAKE_SYSTEM_NAME MATCHES "Linux" OR
CMAKE_SYSTEM_NAME MATCHES "Darwin")
AND NOT CMAKE_GENERATOR STREQUAL "Watcom WMake")
@@ -3095,10 +3090,6 @@ if(BUILD_TESTING)
"${CMake_SOURCE_DIR}/Tests/CTestTestFdSetSize/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/test.cmake"
@ONLY ESCAPE_QUOTES)
- add_test(CTestTestFdSetSize ${CMAKE_CTEST_COMMAND}
- -S "${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/test.cmake" -j20 -V --timeout 120
- --output-log "${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/testOutput.log"
- )
if(CMAKE_TESTS_CDASH_SERVER)
set(regex "^([^:]+)://([^/]+)(.*)$")
`},
},
}, &MakeHelper{
OmitDefaults: true,
ConfigureName: "/usr/src/cmake/bootstrap",
Configure: []KV{
{"prefix", "/system"},
{"parallel", jobsE},
{"--"},
{"-DCMAKE_USE_OPENSSL", "OFF"},
{"-DCMake_TEST_NO_NETWORK", "ON"},
},
Check: []string{
"CTEST_OUTPUT_ON_FAILURE=1",
"CTEST_PARALLEL_LEVEL=128",
"test",
},
},
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newCMake,
Name: "cmake",
Description: "cross-platform, open-source build system",
Website: "https://cmake.org/",
ID: 306,
})
}
// CMakeHelper is the [CMake] build system helper. // CMakeHelper is the [CMake] build system helper.
type CMakeHelper struct { type CMakeHelper struct {
@@ -143,9 +37,9 @@ var _ Helper = new(CMakeHelper)
// extra returns a hardcoded slice of [CMake] and [Ninja]. // extra returns a hardcoded slice of [CMake] and [Ninja].
func (attr *CMakeHelper) extra(int) P { func (attr *CMakeHelper) extra(int) P {
if attr != nil && attr.Make { if attr != nil && attr.Make {
return P{CMake, Make} return P{_cmake, _make}
} }
return P{CMake, Ninja} return P{_cmake, _ninja}
} }
// wantsChmod returns false. // wantsChmod returns false.
@@ -157,14 +51,11 @@ func (*CMakeHelper) wantsWrite() bool { return false }
// scriptEarly returns the zero value. // scriptEarly returns the zero value.
func (*CMakeHelper) scriptEarly() string { return "" } func (*CMakeHelper) scriptEarly() string { return "" }
// createDir returns true.
func (*CMakeHelper) createDir() bool { return true }
// wantsDir returns a hardcoded, deterministic pathname. // wantsDir returns a hardcoded, deterministic pathname.
func (*CMakeHelper) wantsDir() string { return "/cure/" } func (*CMakeHelper) wantsDir() (string, bool) { return "/cure/", true }
// script generates the cure script. // script generates the cure script.
func (attr *CMakeHelper) script(s *S, name string) string { func (attr *CMakeHelper) script(t Toolchain, name string) string {
if attr == nil { if attr == nil {
attr = new(CMakeHelper) attr = new(CMakeHelper)
} }
@@ -180,7 +71,7 @@ func (attr *CMakeHelper) script(s *S, name string) string {
} }
script := attr.Script script := attr.Script
if !attr.SkipTest && s.opts&OptSkipCheck == 0 { if !attr.SkipTest && t.opts&OptSkipCheck == 0 {
script += "\n" + test script += "\n" + test
} }

View File

@@ -1,56 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newCurl() (pkg.Artifact, string) {
const (
version = "8.20.0"
checksum = "xyHXwrngIRGMasuzhn-I5MSCOhktwINbsWt1f_LuR-5jRVvyx_g6U1EQfDLEbr9r"
)
return t.NewPackage("curl", version, newTar(
"https://curl.se/download/curl-"+version+".tar.bz2",
checksum,
pkg.TarBzip2,
), &PackageAttr{
// remove broken test
Writable: true,
ScriptEarly: `
chmod +w tests/data && rm -f tests/data/test459
`,
}, &MakeHelper{
Configure: []KV{
{"with-openssl"},
{"with-ca-bundle", "/system/etc/ssl/certs/ca-bundle.crt"},
{"disable-smb"},
},
Check: []string{
"TFLAGS=" + jobsLFlagE,
"test-nonflaky",
},
},
Perl,
Python,
PkgConfig,
Diffutils,
Libpsl,
OpenSSL,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newCurl,
Name: "curl",
Description: "command line tool and library for transferring data with URLs",
Website: "https://curl.se/",
Dependencies: P{
Libpsl,
OpenSSL,
},
ID: 381,
})
}

View File

@@ -1,81 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newDBus() (pkg.Artifact, string) {
const (
version = "1.16.2"
checksum = "INwOuNdrDG7XW5ilW_vn8JSxEa444rRNc5ho97i84I1CNF09OmcFcV-gzbF4uCyg"
)
return t.NewPackage("dbus", version, newFromGitLab(
"gitlab.freedesktop.org",
"dbus/dbus",
"dbus-"+version,
checksum,
), &PackageAttr{
// OSError: [Errno 30] Read-only file system: '/usr/src/dbus/subprojects/packagecache'
Writable: true,
// PermissionError: [Errno 13] Permission denied: '/usr/src/dbus/subprojects/packagecache'
Chmod: true,
}, &MesonHelper{
Setup: []KV{
{"Depoll", "enabled"},
{"Dinotify", "enabled"},
{"Dx11_autolaunch", "disabled"},
},
},
GLib,
Libexpat,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newDBus,
Name: "dbus",
Description: "a message bus system",
Website: "https://www.freedesktop.org/wiki/Software/dbus/",
Dependencies: P{
GLib,
Libexpat,
},
ID: 5356,
})
}
func (t Toolchain) newXDGDBusProxy() (pkg.Artifact, string) {
const (
version = "0.1.7"
checksum = "UW5Pe-TP-XAaN-kTbxrkOQ7eYdmlAQlr2pdreLtPT0uwdAz-7rzDP8V_8PWuZBup"
)
return t.NewPackage("xdg-dbus-proxy", version, newFromGitHub(
"flatpak/xdg-dbus-proxy",
version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dman", "disabled"},
},
},
DBus,
GLib,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newXDGDBusProxy,
Name: "xdg-dbus-proxy",
Description: "a filtering proxy for D-Bus connections",
Website: "https://github.com/flatpak/xdg-dbus-proxy",
Dependencies: P{
GLib,
},
ID: 58434,
})
}

View File

@@ -1,43 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newDTC() (pkg.Artifact, string) {
const (
version = "1.7.2"
checksum = "vUoiRynPyYRexTpS6USweT5p4SVHvvVJs8uqFkkVD-YnFjwf6v3elQ0-Etrh00Dt"
)
return t.NewPackage("dtc", version, newTar(
"https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/"+
"dtc-v"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
// works around buggy test:
// fdtdump-runtest.sh /usr/src/dtc/tests/fdtdump.dts
Writable: true,
Chmod: true,
}, &MesonHelper{
Setup: []KV{
{"Dyaml", "disabled"},
{"Dstatic-build", "true"},
},
},
Flex,
Bison,
M4,
Coreutils,
Diffutils,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newDTC,
Name: "dtc",
Description: "The Device Tree Compiler",
Website: "https://git.kernel.org/pub/scm/utils/dtc/dtc.git/",
ID: 16911,
})
}

View File

@@ -1,59 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newElfutils() (pkg.Artifact, string) {
const (
version = "0.195"
checksum = "JrGnBD38w8Mj0ZxDw3fKlRBFcLvRKu8rcYnX35R9yTlUSYnzTazyLboG-a2CsJlu"
)
return t.NewPackage("elfutils", version, newTar(
"https://sourceware.org/elfutils/ftp/"+
version+"/elfutils-"+version+".tar.bz2",
checksum,
pkg.TarBzip2,
), &PackageAttr{
Env: []string{
"CC=cc" +
// nonstandard glibc extension
" -DFNM_EXTMATCH=0",
},
}, &MakeHelper{
// nonstandard glibc extension
SkipCheck: true,
Configure: []KV{
{"enable-deterministic-archives"},
},
},
M4,
PkgConfig,
Zlib,
Bzip2,
Zstd,
ArgpStandalone,
MuslFts,
MuslObstack,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newElfutils,
Name: "elfutils",
Description: "utilities and libraries to handle ELF files and DWARF data",
Website: "https://sourceware.org/elfutils/",
Dependencies: P{
Zlib,
Bzip2,
Zstd,
MuslFts,
MuslObstack,
},
ID: 5679,
})
}

View File

@@ -1,58 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newFakeroot() (pkg.Artifact, string) {
const (
version = "1.37.2"
checksum = "4ve-eDqVspzQ6VWDhPS0NjW3aSenBJcPAJq_BFT7OOFgUdrQzoTBxZWipDAGWxF8"
)
return t.NewPackage("fakeroot", version, newFromGitLab(
"salsa.debian.org",
"clint/fakeroot",
"upstream/"+version,
checksum,
), &PackageAttr{
Patches: []KV{
{"remove-broken-docs", `diff --git a/doc/Makefile.am b/doc/Makefile.am
index f135ad9..85c784c 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,5 +1,4 @@
AUTOMAKE_OPTIONS=foreign
-SUBDIRS = de es fr nl pt ro sv
man_MANS = faked.1 fakeroot.1
`},
},
Env: []string{
"CONFIG_SHELL=/bin/sh",
},
}, &MakeHelper{
Generate: "./bootstrap",
// makes assumptions about /etc/passwd
SkipCheck: true,
},
Automake,
Libtool,
PkgConfig,
Attr,
Libcap,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newFakeroot,
Name: "fakeroot",
Description: "tool for simulating superuser privileges",
Website: "https://salsa.debian.org/clint/fakeroot",
ID: 12048,
})
}

View File

@@ -1,32 +0,0 @@
package rosa
import (
"hakurei.app/internal/pkg"
)
func (t Toolchain) newFlex() (pkg.Artifact, string) {
const (
version = "2.6.4"
checksum = "p9POjQU7VhgOf3x5iFro8fjhy0NOanvA7CTeuWS_veSNgCixIJshTrWVkc5XLZkB"
)
return t.NewPackage("flex", version, newFromGitHubRelease(
"westes/flex",
"v"+version,
"flex-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil),
M4,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newFlex,
Name: "flex",
Description: "scanner generator for lexing in C and C++",
Website: "https://github.com/westes/flex/",
ID: 819,
})
}

View File

@@ -1,27 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newFreetype() (pkg.Artifact, string) {
const (
version = "2.14.3"
checksum = "-WfLv8fVJNyCHpP_lriiDzOcVbBL9ajdQ3tl8AzIIUa9-8sVpU9irxOmSMgRHWYz"
)
return t.NewPackage("freetype", version, newTar(
"https://download.savannah.gnu.org/releases/freetype/"+
"freetype-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil)), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newFreetype,
Name: "freetype",
Description: "a freely available software library to render fonts",
Website: "http://www.freetype.org/",
ID: 854,
})
}

View File

@@ -1,43 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newFuse() (pkg.Artifact, string) {
const (
version = "3.18.2"
checksum = "iL-7b7eUtmlVSf5cSq0dzow3UiqSjBmzV3cI_ENPs1tXcHdktkG45j1V12h-4jZe"
)
return t.NewPackage("fuse", version, newFromGitHubRelease(
"libfuse/libfuse",
"fuse-"+version,
"fuse-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, &MesonHelper{
Setup: []KV{
{"Ddefault_library", "both"},
{"Dtests", "true"},
{"Duseroot", "false"},
{"Dinitscriptdir", "/system/etc"},
},
ScriptCompiled: "python3 -m pytest test/",
// this project uses pytest
SkipTest: true,
},
PythonPyTest,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newFuse,
Name: "fuse",
Description: "the reference implementation of the Linux FUSE interface",
Website: "https://github.com/libfuse/libfuse/",
ID: 861,
})
}

View File

@@ -7,103 +7,10 @@ import (
"hakurei.app/internal/pkg" "hakurei.app/internal/pkg"
) )
func (t Toolchain) newGit() (pkg.Artifact, string) { var (
const ( _git = H("git")
version = "2.54.0" _nssCACert = H("nss-cacert")
checksum = "7vGKtFOJGqY8DO4e8UMRax7dLgImXKQz5MMalec6MlgYrsarffSJjgOughwRFpSH"
) )
return t.NewPackage("git", version, newTar(
"https://www.kernel.org/pub/software/scm/git/"+
"git-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
ScriptEarly: `
ln -s ../../system/bin/perl /usr/bin/ || true
# test suite assumes apache
rm -f /system/bin/httpd
`,
// uses source tree as scratch space
EnterSource: true,
}, &MakeHelper{
InPlace: true,
Generate: "make configure",
ScriptMakeEarly: `
function disable_test {
local test=$1 pattern=${2:-''}
if [ $# -eq 1 ]; then
rm "t/${test}.sh"
else
sed -i "t/${test}.sh" \
-e "/^\s*test_expect_.*$pattern/,/^\s*' *\$/{s/^/: #/}"
fi
}
disable_test t1800-hook
disable_test t5319-multi-pack-index
disable_test t1305-config-include
disable_test t3900-i18n-commit
disable_test t3507-cherry-pick-conflict
disable_test t4201-shortlog
disable_test t5303-pack-corruption-resilience
disable_test t4301-merge-tree-write-tree
disable_test t8005-blame-i18n
disable_test t9350-fast-export
disable_test t9300-fast-import
disable_test t0211-trace2-perf
disable_test t1517-outside-repo
disable_test t2200-add-update
disable_test t0027-auto-crlf
disable_test t7513-interpret-trailers
disable_test t7703-repack-geometric
disable_test t7002-mv-sparse-checkout
disable_test t1451-fsck-buffer
disable_test t4104-apply-boundary
disable_test t4200-rerere
disable_test t5515-fetch-merge-logic
`,
Check: []string{
"-C t",
`GIT_PROVE_OPTS="--jobs 32 --failures"`,
"prove",
},
Install: `make \
` + jobsFlagE + ` \
DESTDIR=/work \
NO_INSTALL_HARDLINKS=1 \
install`,
},
// test suite hangs on mksh
Bash,
Diffutils,
Autoconf,
Gettext,
Zlib,
Curl,
Libexpat,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newGit,
Name: "git",
Description: "distributed version control system",
Website: "https://www.git-scm.com/",
Dependencies: P{
Zlib,
Curl,
Libexpat,
},
ID: 5350,
})
}
// NewViaGit returns a [pkg.Artifact] for cloning a git repository. // NewViaGit returns a [pkg.Artifact] for cloning a git repository.
func (t Toolchain) NewViaGit( func (t Toolchain) NewViaGit(
@@ -114,8 +21,8 @@ func (t Toolchain) NewViaGit(
path.Base(url), path.Base(url),
".git", ".git",
)+"-src-"+path.Base(rev), THostNet, t.Append(nil, )+"-src-"+path.Base(rev), THostNet, t.Append(nil,
NSSCACert, _nssCACert,
Git, _git,
), &checksum, nil, ` ), &checksum, nil, `
git \ git \
-c advice.detachedHead=false \ -c advice.detachedHead=false \

View File

@@ -1,248 +0,0 @@
package rosa
import (
"slices"
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newSPIRVHeaders() (pkg.Artifact, string) {
const (
version = "1.4.341.0"
checksum = "0PL43-19Iaw4k7_D8J8BvoJ-iLgCVSYZ2ThgDPGfAJwIJFtre7l0cnQtLjcY-JvD"
)
return t.NewPackage("spirv-headers", version, newFromGitHub(
"KhronosGroup/SPIRV-Headers",
"vulkan-sdk-"+version,
checksum,
), nil, &CMakeHelper{
// upstream has no tests
SkipTest: true,
}), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newSPIRVHeaders,
Name: "spirv-headers",
Description: "machine-readable files for the SPIR-V Registry",
Website: "https://github.com/KhronosGroup/SPIRV-Headers",
ID: 230542,
// upstream changed version scheme, anitya incapable of filtering them
latest: func(v *Versions) string {
for _, s := range v.Stable {
fields := strings.SplitN(s, ".", 4)
if len(fields) != 4 {
continue
}
if slices.ContainsFunc(fields, func(f string) bool {
return slices.ContainsFunc([]byte(f), func(d byte) bool {
return d < '0' || d > '9'
})
}) {
continue
}
return s
}
return v.Latest
},
})
}
func (t Toolchain) newSPIRVTools() (pkg.Artifact, string) {
const (
version = "2026.1"
checksum = "ZSQPQx8NltCDzQLk4qlaVxyWRWeI_JtsjEpeFt3kezTanl9DTHfLixSUCezMFBjv"
)
return t.NewPackage("spirv-tools", version, newFromGitHub(
"KhronosGroup/SPIRV-Tools",
"v"+version,
checksum,
), nil, &CMakeHelper{
Cache: []KV{
{"SPIRV-Headers_SOURCE_DIR", "/system"},
},
},
Python,
SPIRVHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newSPIRVTools,
Name: "spirv-tools",
Description: "an API and commands for processing SPIR-V modules",
Website: "https://github.com/KhronosGroup/SPIRV-Tools",
Dependencies: P{
SPIRVHeaders,
},
ID: 14894,
latest: (*Versions).getStable,
})
}
func (t Toolchain) newGlslang() (pkg.Artifact, string) {
const (
version = "16.3.0"
checksum = "xyqDf8k3-D0_BXHGi0uLgMglnJ05Rf3j73QgbDs3sGtKNdBIQhY8JfqX1NcNoJQN"
)
return t.NewPackage("glslang", version, newFromGitHub(
"KhronosGroup/glslang",
version,
checksum,
), &PackageAttr{
// test suite writes to source
Writable: true,
Chmod: true,
}, &CMakeHelper{
Cache: []KV{
{"BUILD_SHARED_LIBS", "ON"},
{"ALLOW_EXTERNAL_SPIRV_TOOLS", "ON"},
},
},
Python,
Bash,
Diffutils,
SPIRVTools,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newGlslang,
Name: "glslang",
Description: "reference front end for GLSL/ESSL",
Website: "https://github.com/KhronosGroup/glslang",
ID: 205796,
})
}
func (t Toolchain) newSPIRVLLVMTranslator() (pkg.Artifact, string) {
const (
version = "22.1.2"
checksum = "JZAaV5ewYcm-35YA_U2BM2IcsQouZtX1BLZR0zh2vSlfEXMsT5OCtY4Gh5RJkcGy"
)
skipChecks := []string{
// error: line 13: OpTypeCooperativeMatrixKHR Scope is limited to Workgroup and Subgroup
"cooperative_matrix_constant_null.spvasm",
}
switch t.arch {
case "arm64":
skipChecks = append(skipChecks,
// LLVM ERROR: unsupported calling convention
"DebugInfo/COFF/no-cus.ll",
"DebugInfo/Generic/2009-11-05-DeadGlobalVariable.ll",
"DebugInfo/Generic/2009-11-10-CurrentFn.ll",
"DebugInfo/Generic/2010-01-05-DbgScope.ll",
"DebugInfo/Generic/2010-03-12-llc-crash.ll",
"DebugInfo/Generic/2010-03-24-MemberFn.ll",
"DebugInfo/Generic/2010-04-19-FramePtr.ll",
"DebugInfo/Generic/2010-06-29-InlinedFnLocalVar.ll",
"DebugInfo/Generic/2010-10-01-crash.ll",
"DebugInfo/Generic/PR20038.ll",
"DebugInfo/Generic/constant-pointers.ll",
"DebugInfo/Generic/dead-argument-order.ll",
"DebugInfo/Generic/debug-info-eis-option.ll",
"DebugInfo/Generic/def-line.ll",
"DebugInfo/Generic/discriminator.ll",
"DebugInfo/Generic/dwarf-public-names.ll",
"DebugInfo/Generic/enum.ll",
"DebugInfo/Generic/func-using-decl.ll",
"DebugInfo/Generic/global.ll",
"DebugInfo/Generic/imported-name-inlined.ll",
"DebugInfo/Generic/incorrect-variable-debugloc1.ll",
"DebugInfo/Generic/inline-scopes.ll",
"DebugInfo/Generic/inlined-arguments.ll",
"DebugInfo/Generic/inlined-vars.ll",
"DebugInfo/Generic/linear-dbg-value.ll",
"DebugInfo/Generic/linkage-name-abstract.ll",
"DebugInfo/Generic/member-order.ll",
"DebugInfo/Generic/missing-abstract-variable.ll",
"DebugInfo/Generic/multiline.ll",
"DebugInfo/Generic/namespace_function_definition.ll",
"DebugInfo/Generic/namespace_inline_function_definition.ll",
"DebugInfo/Generic/noscopes.ll",
"DebugInfo/Generic/ptrsize.ll",
"DebugInfo/Generic/restrict.ll",
"DebugInfo/Generic/two-cus-from-same-file.ll",
"DebugInfo/Generic/version.ll",
"DebugInfo/LocalAddressSpace.ll",
"DebugInfo/UnknownBaseType.ll",
"DebugInfo/expr-opcode.ll",
)
}
return t.NewPackage("spirv-llvm-translator", version, newFromGitHub(
"KhronosGroup/SPIRV-LLVM-Translator",
"v"+version, checksum,
), &PackageAttr{
Patches: []KV{
{"remove-early-prefix", `diff --git a/CMakeLists.txt b/CMakeLists.txt
index c000a77e..f18f3fde 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -164,7 +164,7 @@ install(
${LLVM_SPIRV_INCLUDE_DIRS}/LLVMSPIRVOpts.h
${LLVM_SPIRV_INCLUDE_DIRS}/LLVMSPIRVExtensions.inc
DESTINATION
- ${CMAKE_INSTALL_PREFIX}/include/LLVMSPIRVLib
+ include/LLVMSPIRVLib
)
configure_file(LLVMSPIRVLib.pc.in ${CMAKE_BINARY_DIR}/LLVMSPIRVLib.pc @ONLY)
@@ -172,5 +172,5 @@ install(
FILES
${CMAKE_BINARY_DIR}/LLVMSPIRVLib.pc
DESTINATION
- ${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}/pkgconfig
+ lib${LLVM_LIBDIR_SUFFIX}/pkgconfig
)
;`},
},
// litArgs emits shell syntax
ScriptEarly: `
export LIT_OPTS=` + litArgs(true, skipChecks...) + `
`,
}, &CMakeHelper{
Cache: []KV{
{"CMAKE_SKIP_BUILD_RPATH", "ON"},
{"BUILD_SHARED_LIBS", "ON"},
{"LLVM_SPIRV_ENABLE_LIBSPIRV_DIS", "ON"},
{"LLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR", "/system"},
{"LLVM_EXTERNAL_LIT", "/system/bin/lit"},
{"LLVM_INCLUDE_TESTS", "ON"},
},
},
Bash,
LIT,
SPIRVTools,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newSPIRVLLVMTranslator,
Name: "spirv-llvm-translator",
Description: "bi-directional translation between SPIR-V and LLVM IR",
Website: "https://github.com/KhronosGroup/SPIRV-LLVM-Translator",
Dependencies: P{
SPIRVTools,
},
ID: 227273,
})
}

File diff suppressed because it is too large Load Diff

View File

@@ -6,79 +6,103 @@ import (
"hakurei.app/internal/pkg" "hakurei.app/internal/pkg"
) )
// newGoBootstrap returns the Go bootstrap toolchain. var _go = H("go")
func (t Toolchain) newGoBootstrap() pkg.Artifact {
const checksum = "8o9JL_ToiQKadCTb04nvBDkp8O1xiWOolAxVEqaTGodieNe4lOFEjlOxN3bwwe23"
return t.New("go1.4-bootstrap", 0, t.Append(nil,
Bash,
), nil, []string{
"CGO_ENABLED=0",
}, `
mkdir -p /var/tmp/ /work/system/
cp -r /usr/src/go /work/system/
cd /work/system/go/src
chmod -R +w ..
./make.bash
`, pkg.Path(AbsUsrSrc.Append("go"), false, newTar(
"https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz",
checksum,
pkg.TarGzip,
)))
}
// newGo returns a specific version of the Go toolchain. // newGo returns a specific version of the Go toolchain.
func (t Toolchain) newGo( func (t Toolchain) newGo(
version, checksum string, version, checksum string,
env []string, env []string,
script string, script string,
extra ...pkg.Artifact, boot pkg.Artifact,
) pkg.Artifact { ) pkg.Artifact {
name := "all" return t.NewPackage("go", version, newTar(
if t.opts&OptSkipCheck != 0 { "https://go.dev/dl/go"+version+".src.tar.gz",
name = "make" checksum,
} pkg.TarGzip,
return t.New("go"+version, 0, t.Append(extra, ), &PackageAttr{
Bash, EnterSource: true,
), nil, slices.Concat([]string{ Env: slices.Concat([]string{
"CC=cc", "CC=cc",
"GOCACHE=/tmp/gocache", "GOCACHE=/tmp/gocache",
"GOROOT_BOOTSTRAP=/system/go", "GOROOT_BOOTSTRAP=/system/go",
"TMPDIR=/dev/shm/go", "TMPDIR=/dev/shm/go",
}, env), ` }, env),
mkdir /work/system "${TMPDIR}"
cp -r /usr/src/go /work/system Extra: []pkg.Artifact{boot},
cd /work/system/go/src }, &GenericHelper{
InPlace: true,
Build: `
mkdir /work/system/ "${TMPDIR}"
cp -r . /work/system/go
cd /work/system/go/src/
chmod -R +w .. chmod -R +w ..
` + script + ` ` + script + `
./`+name+`.bash set +u
. ./make.bash "$@" --no-banner
set -u
`,
Check: "bash run.bash --no-rebuild\n",
Install: `
../bin/go tool dist banner # print build info
mkdir /work/system/bin mkdir /work/system/bin
ln -s \ ln -s \
../go/bin/go \ ../go/bin/go \
../go/bin/gofmt \ ../go/bin/gofmt \
/work/system/bin /work/system/bin
`, pkg.Path(AbsUsrSrc.Append("go"), false, newTar( `,
"https://go.dev/dl/go"+version+".src.tar.gz", },
checksum, _bash,
pkg.TarGzip, )
)))
} }
func (t Toolchain) newGoLatest() (pkg.Artifact, string) { func init() {
const (
version = "1.26.3"
checksum = "lEiFocZFnN5fKvZzmwVdqc9pYUjAuhzqZGbuiOqxUP4XdcY8yECisKcqsQ_eNn1N"
)
meta := Metadata{
Name: "go",
Description: "the Go programming language toolchain",
Website: "https://go.dev",
Version: version,
ID: 1227,
}
native.MustRegister(meta.Name, func(t Toolchain) (*Metadata, pkg.Artifact) {
var ( var (
bootstrapEnv []string bootstrapEnv []string
bootstrapExtra []pkg.Artifact bootstrapEarly pkg.Artifact
finalEnv []string finalEnv []string
) )
switch t.arch { switch t.arch {
case "amd64": case "amd64":
bootstrapExtra = append(bootstrapExtra, t.newGoBootstrap()) bootstrapEarly = t.NewPackage("go", "1.4-bootstrap", newTar(
"https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz",
"8o9JL_ToiQKadCTb04nvBDkp8O1xiWOolAxVEqaTGodieNe4lOFEjlOxN3bwwe23",
pkg.TarGzip,
), &PackageAttr{
EnterSource: true,
Env: []string{
"CGO_ENABLED=0",
},
}, &GenericHelper{
InPlace: true,
Build: `
mkdir /work/system/
cp -r . /work/system/go
cd /work/system/go/src/
mkdir -p /var/tmp/
./make.bash
`,
},
_bash,
)
case "arm64", "riscv64": case "arm64", "riscv64":
bootstrapEnv = append(bootstrapEnv, "GOROOT_BOOTSTRAP=/system") bootstrapEnv = append(bootstrapEnv, "GOROOT_BOOTSTRAP=/system")
bootstrapExtra = t.Append(bootstrapExtra, gcc) _, bootstrapEarly = t.MustLoad(H("gcc"))
finalEnv = append(finalEnv, "CGO_ENABLED=0") finalEnv = append(finalEnv, "CGO_ENABLED=0")
default: default:
@@ -99,7 +123,7 @@ sed -i \
echo \ echo \
'type syscallDescriptor = int' >> \ 'type syscallDescriptor = int' >> \
os/rawconn_test.go os/rawconn_test.go
`, bootstrapExtra...) `, bootstrapEarly)
go121 := t.newGo( go121 := t.newGo(
"1.21.13", "1.21.13",
@@ -143,11 +167,7 @@ rm \
`, go123, `, go123,
) )
const ( return &meta, t.newGo(
version = "1.26.3"
checksum = "lEiFocZFnN5fKvZzmwVdqc9pYUjAuhzqZGbuiOqxUP4XdcY8yECisKcqsQ_eNn1N"
)
return t.newGo(
version, version,
checksum, checksum,
finalEnv, ` finalEnv, `
@@ -163,16 +183,7 @@ rm \
cmd/cgo/internal/testsanitizers/tsan_test.go \ cmd/cgo/internal/testsanitizers/tsan_test.go \
cmd/cgo/internal/testsanitizers/cshared_test.go cmd/cgo/internal/testsanitizers/cshared_test.go
`, go125, `, go125,
), version )
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newGoLatest,
Name: "go",
Description: "the Go programming language toolchain",
Website: "https://go.dev/",
ID: 1227,
}) })
} }

View File

@@ -1,60 +0,0 @@
package rosa
import (
"hakurei.app/fhs"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newGLib() (pkg.Artifact, string) {
const (
version = "2.88.1"
checksum = "Rkszn6W4RHjyspyqfXdVAVawdwDJCuS0Zu0f7qot7tbJhnw2fUDoUUJB40m-1MCX"
)
return t.NewPackage("glib", version, t.newTagRemote(
"https://gitlab.gnome.org/GNOME/glib.git",
version, checksum,
), &PackageAttr{
Paths: []pkg.ExecPath{
pkg.Path(fhs.AbsEtc.Append(
"machine-id",
), false, pkg.NewFile(
"glib-machine-id",
[]byte("ffffffffffffffffffffffffffffffff\n"),
)),
pkg.Path(AbsSystem.Append(
"var/lib/dbus/machine-id",
), false, pkg.NewFile(
"glib-machine-id",
[]byte("fefefefefefefefefefefefefefefefe\n"),
)),
},
}, &MesonHelper{
Setup: []KV{
{"Ddefault_library", "both"},
},
},
PythonPackaging,
Bash,
PCRE2,
Libffi,
Zlib,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newGLib,
Name: "glib",
Description: "the GNU library of miscellaneous stuff",
Website: "https://developer.gnome.org/glib/",
Dependencies: P{
PCRE2,
Libffi,
Zlib,
},
ID: 10024,
})
}

View File

@@ -1,113 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newHakurei(
suffix, script string,
withHostname bool,
) pkg.Artifact {
hostname := `
echo 'Building test helper (hostname).'
go build -o /bin/hostname /usr/src/hostname/main.go
`
if !withHostname {
hostname = ""
}
return t.New("hakurei"+suffix+"-"+hakureiVersion, 0, t.Append(nil,
Go,
PkgConfig,
// dist tarball
Gzip,
// statically linked
Libseccomp,
ACL,
Fuse,
XCB,
Wayland,
WaylandProtocols,
KernelHeaders,
), nil, []string{
"CGO_ENABLED=1",
"GOCACHE=/tmp/gocache",
"CC=clang -O3 -Werror",
}, hostname+`
cd /usr/src/hakurei
HAKUREI_VERSION='v`+hakureiVersion+`'
`+script, pkg.Path(AbsUsrSrc.Append("hakurei"), true, t.NewPatchedSource(
"hakurei", hakureiVersion, hakureiSource, false, hakureiPatches...,
)), pkg.Path(AbsUsrSrc.Append("hostname", "main.go"), false, pkg.NewFile(
"hostname.go",
[]byte(`
package main
import "os"
func main() {
if name, err := os.Hostname(); err != nil {
panic(err)
} else {
os.Stdout.WriteString(name)
}
}
`),
)))
}
func init() {
native.MustRegister(&Artifact{
f: func(t Toolchain) (pkg.Artifact, string) {
return t.newHakurei("", `
mkdir -p /work/system/libexec/hakurei/
echo "Building hakurei for $(go env GOOS)/$(go env GOARCH)."
go generate ./...
go build -trimpath -tags=rosa -o /work/system/libexec/hakurei -ldflags="-s -w
-buildid=
-linkmode external
-extldflags=-static
-X hakurei.app/internal/info.buildVersion=${HAKUREI_VERSION}
-X hakurei.app/internal/info.hakureiPath=/system/bin/hakurei
-X hakurei.app/internal/info.hsuPath=/system/bin/hsu
-X main.hakureiPath=/system/bin/hakurei
" ./...
echo
echo '##### Testing hakurei.'
go test -ldflags='-buildid= -linkmode external -extldflags=-static' ./...
echo
mkdir -p /work/system/bin/
(cd /work/system/libexec/hakurei && mv \
hakurei \
sharefs \
../../bin/)
`, true), hakureiVersion
},
Name: "hakurei",
Description: "low-level userspace tooling for Rosa OS",
Website: "https://hakurei.app/",
ID: 388834,
})
native.MustRegister(&Artifact{
f: func(t Toolchain) (pkg.Artifact, string) {
name := "all"
if t.opts&OptSkipCheck != 0 {
name = "make"
}
return t.newHakurei("-dist", `
export HAKUREI_VERSION
DESTDIR=/work /usr/src/hakurei/`+name+`.sh
`, true), hakureiVersion
},
Name: "hakurei-dist",
Description: "low-level userspace tooling for Rosa OS (distribution tarball)",
Website: "https://hakurei.app/",
})
}

View File

@@ -1,26 +0,0 @@
//go:build current
package rosa
import (
_ "embed"
"hakurei.app/internal/pkg"
)
const hakureiVersion = "1.0-current"
// hakureiSourceTarball is a compressed tarball of the hakurei source code.
//
//go:generate tar -zc -C ../.. --exclude .git --exclude *.tar.gz -f hakurei_current.tar.gz .
//go:embed hakurei_current.tar.gz
var hakureiSourceTarball []byte
// hakureiSource is the source code at the time this package is compiled.
var hakureiSource = pkg.NewTar(pkg.NewFile(
"hakurei-current.tar.gz",
hakureiSourceTarball,
), pkg.TarGzip)
// hakureiPatches are patches applied against the compile-time source tree.
var hakureiPatches []KV

View File

@@ -1,18 +0,0 @@
//go:build !current
package rosa
import "hakurei.app/internal/pkg"
const hakureiVersion = "0.4.2"
// hakureiSource is the source code of a hakurei release.
var hakureiSource = newTar(
"https://git.gensokyo.uk/rosa/hakurei/archive/"+
"v"+hakureiVersion+".tar.gz",
"jadgaOrxv5ABGvzQ_Rk0aPGz7U8K-427TbMhQNQ32scSizEnlR44Pu7NoWYWVZWq",
pkg.TarGzip,
)
// hakureiPatches are patches applied against a hakurei release.
var hakureiPatches []KV

View File

@@ -1,34 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newHwdata() (pkg.Artifact, string) {
const (
version = "0.407"
checksum = "6p1XD0CRuzt6hLfjv4ShKBW934BexmoPkRrmwxD4J63fBVCzVBRHyF8pVJdW_Xjm"
)
return t.NewPackage("hwdata", version, newFromGitHub(
"vcrhonek/hwdata",
"v"+version, checksum,
), &PackageAttr{
Writable: true,
EnterSource: true,
}, &MakeHelper{
// awk: fatal: cannot open file `hwdata.spec' for reading: No such file or directory
InPlace: true,
// lspci: Unknown option 'A' (see "lspci --help")
SkipCheck: true,
}), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newHwdata,
Name: "hwdata",
Description: "contains various hardware identification and configuration data",
Website: "https://github.com/vcrhonek/hwdata",
ID: 5387,
})
}

View File

@@ -6,54 +6,39 @@ import (
) )
func init() { func init() {
native.MustRegister(&Artifact{ meta := Metadata{
Name: "earlyinit", Name: "system-image",
Description: "Rosa OS initramfs init program", Description: "Rosa OS system image",
Version: Unversioned,
f: func(t Toolchain) (pkg.Artifact, string) {
return t.newHakurei("-early-init", `
mkdir -p /work/system/libexec/hakurei/
echo '# Building earlyinit.'
go build -trimpath -v -o /work/system/libexec/hakurei -ldflags="-s -w
-buildid=
-linkmode external
-extldflags=-static
-X hakurei.app/internal/info.buildVersion=${HAKUREI_VERSION}
" ./cmd/earlyinit
echo
`, false), Unversioned
},
})
} }
func (t Toolchain) newImageSystem() (pkg.Artifact, string) { native.MustRegister(meta.Name, func(t Toolchain) (*Metadata, pkg.Artifact) {
return t.New("system.img", TNoToolchain, t.Append(nil, return &meta, t.New("system.img", TNoToolchain, t.Append(nil,
SquashfsTools, H("squashfs-tools"),
), nil, nil, ` ), nil, nil, `
mksquashfs /mnt/system /work/system.img mksquashfs /mnt/system /work/system.img
`, pkg.Path(fhs.AbsRoot.Append("mnt"), false, t.Append(nil, `, pkg.Path(fhs.AbsRoot.Append("mnt"), false, t.Append(nil,
Musl, _musl,
Mksh, _mksh,
Toybox, _toybox,
Kmod, H("kmod"),
Kernel, H("kernel"),
Firmware, H("firmware"),
)...)), Unversioned )...))
}
func init() {
native.MustRegister(&Artifact{
Name: "system-image",
Description: "Rosa OS system image",
f: Toolchain.newImageSystem,
}) })
} }
func (t Toolchain) newImageInitramfs() (pkg.Artifact, string) {
return t.New("initramfs", TNoToolchain, t.Append(nil, func init() {
Zstd, meta := Metadata{
EarlyInit, Name: "initramfs-image",
GenInitCPIO, Description: "Rosa OS initramfs image",
Version: Unversioned,
}
native.MustRegister(meta.Name, func(t Toolchain) (*Metadata, pkg.Artifact) {
return &meta, t.New("initramfs", TNoToolchain, t.Append(nil,
_zstd,
H("earlyinit"),
H("gen_init_cpio"),
), nil, nil, ` ), nil, nil, `
gen_init_cpio -t 4294967295 -c /usr/src/initramfs | zstd > /work/initramfs.zst gen_init_cpio -t 4294967295 -c /usr/src/initramfs | zstd > /work/initramfs.zst
`, pkg.Path(AbsUsrSrc.Append("initramfs"), false, pkg.NewFile("initramfs", []byte(` `, pkg.Path(AbsUsrSrc.Append("initramfs"), false, pkg.NewFile("initramfs", []byte(`
@@ -61,13 +46,6 @@ dir /dev 0755 0 0
nod /dev/null 0666 0 0 c 1 3 nod /dev/null 0666 0 0 c 1 3
nod /dev/console 0600 0 0 c 5 1 nod /dev/console 0600 0 0 c 5 1
file /init /system/libexec/hakurei/earlyinit 0555 0 0 file /init /system/libexec/hakurei/earlyinit 0555 0 0
`)))), Unversioned `))))
}
func init() {
native.MustRegister(&Artifact{
Name: "initramfs-image",
Description: "Rosa OS initramfs image",
f: Toolchain.newImageInitramfs,
}) })
} }

View File

@@ -1,8 +0,0 @@
package rosa
import _ "embed"
//go:embed kernel_amd64.config
var kernelConfig []byte
const kernelName = "bzImage"

View File

@@ -1,8 +0,0 @@
package rosa
import _ "embed"
//go:embed kernel_arm64.config
var kernelConfig []byte
const kernelName = "vmlinuz.efi"

View File

@@ -1,8 +0,0 @@
package rosa
import _ "embed"
//go:embed kernel_riscv64.config
var kernelConfig []byte
const kernelName = "bzImage"

View File

@@ -1,50 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newKmod() (pkg.Artifact, string) {
const (
version = "34.2"
checksum = "0K7POeTKxMhExsaTsnKAC6LUNsRSfe6sSZxWONPbOu-GI_pXOw3toU_BIoqfBhJV"
)
return t.NewPackage("kmod", version, newTar(
"https://www.kernel.org/pub/linux/utils/kernel/"+
"kmod/kmod-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, &MesonHelper{
Setup: []KV{
{"Dmoduledir", "/system/lib/modules"},
{"Dsysconfdir", "/system/etc"},
{"Dbashcompletiondir", "no"},
{"Dfishcompletiondir", "no"},
{"Dxz", "disabled"},
{"Dmanpages", "false"},
},
// makes assumptions about the running kernel
SkipTest: true,
},
Zlib,
Zstd,
OpenSSL,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newKmod,
Name: "kmod",
Description: "a set of tools to handle common tasks with Linux kernel modules",
Website: "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git",
Dependencies: P{
Zlib,
Zstd,
OpenSSL,
},
ID: 1517,
})
}

View File

@@ -1,62 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibmd() (pkg.Artifact, string) {
const (
version = "1.2.0"
checksum = "1rJ6joAO0wwMZvSfnRNkc1MOhywyAq7SM8VmF92NvDtv7Qdl1LRbjm5fg_DFFtGj"
)
return t.NewPackage("libmd", version, t.newTagRemote(
"https://git.hadrons.org/git/libmd.git",
version, checksum,
), nil, &MakeHelper{
Generate: "echo '" + version + "' > .dist-version && ./autogen",
ScriptMakeEarly: `
install -D /usr/src/libmd/src/helper.c src/helper.c
`,
},
Automake,
Libtool,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibmd,
Name: "libmd",
Description: "Message Digest functions from BSD systems",
Website: "https://www.hadrons.org/software/libmd/",
ID: 15525,
})
}
func (t Toolchain) newLibbsd() (pkg.Artifact, string) {
const (
version = "0.12.2"
checksum = "NVS0xFLTwSP8JiElEftsZ-e1_C-IgJhHrHE77RwKt5178M7r087waO-zYx2_dfGX"
)
return t.NewPackage("libbsd", version, t.newTagRemote(
"https://gitlab.freedesktop.org/libbsd/libbsd.git",
version, checksum,
), nil, &MakeHelper{
Generate: "echo '" + version + "' > .dist-version && ./autogen",
},
Automake,
Libtool,
Libmd,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibbsd,
Name: "libbsd",
Description: "provides useful functions commonly found on BSD systems",
Website: "https://libbsd.freedesktop.org/",
ID: 1567,
})
}

View File

@@ -1,54 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibcap() (pkg.Artifact, string) {
const (
version = "2.78"
checksum = "wFdUkBhFMD9InPnrBZyegWrlPSAg_9JiTBC-eSFyWWlmbzL2qjh2mKxr9Kx2a8ut"
)
return t.NewPackage("libcap", version, newTar(
"https://git.kernel.org/pub/scm/libs/libcap/libcap.git/"+
"snapshot/libcap-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
// uses source tree as scratch space
Writable: true,
Chmod: true,
Env: []string{
"prefix=/system",
"lib=lib",
},
ScriptEarly: `
ln -s ../system/bin/bash /bin/
`,
}, &MakeHelper{
SkipConfigure: true,
InPlace: true,
Make: []string{
"CC=cc",
"all",
},
Check: []string{
"CC=cc",
"test",
},
},
Bash,
Diffutils,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibcap,
Name: "libcap",
Description: "a library for getting and setting POSIX.1e draft 15 capabilities",
Website: "https://sites.google.com/site/fullycapable/",
ID: 1569,
})
}

View File

@@ -1,30 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibdisplayInfo() (pkg.Artifact, string) {
const (
version = "0.3.0"
checksum = "yjOqPUHHYgRtpqGw5RI1n2Q1_hO5j0LiFNMbjcRWV4Nf71XwwoC9fZMlKBDeLchT"
)
return t.NewPackage("libdisplay-info", version, newFromGitLab(
"gitlab.freedesktop.org",
"emersion/libdisplay-info",
version, checksum,
), nil, (*MesonHelper)(nil),
Diffutils,
Hwdata,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibdisplayInfo,
Name: "libdisplay-info",
Description: "EDID and DisplayID library",
Website: "https://gitlab.freedesktop.org/emersion/libdisplay-info",
ID: 326668,
})
}

View File

@@ -1,33 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibepoxy() (pkg.Artifact, string) {
const (
version = "1.5.10"
checksum = "OHI8wshrlGw6BMGrmSyejJtwzM2gPhyFJrTsKxULyKMmYrfgcOe7Iw2ibVoUND_Q"
)
return t.NewPackage("libepoxy", version, newFromGitHub(
"anholt/libepoxy",
version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dglx", "no"},
{"Degl", "no"},
},
},
LibX11,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibepoxy,
Name: "libepoxy",
Description: "a library for handling OpenGL function pointer management",
Website: "https://github.com/anholt/libepoxy",
ID: 6090,
})
}

View File

@@ -1,26 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibev() (pkg.Artifact, string) {
const (
version = "4.33"
checksum = "774eSXV_4k8PySRprUDChbEwsw-kzjIFnJ3MpNOl5zDpamBRvC3BqPyRxvkwcL6_"
)
return t.NewPackage("libev", version, newTar(
"https://dist.schmorp.de/libev/Attic/libev-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil)), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibev,
Name: "libev",
Description: "a full-featured and high-performance event loop",
Website: "http://libev.schmorp.de/",
ID: 1605,
})
}

View File

@@ -1,34 +0,0 @@
package rosa
import (
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newLibexpat() (pkg.Artifact, string) {
const (
version = "2.8.1"
checksum = "iMEtbOJhQfGof2GxSlxffQSI1va_NDDQ9VIuqcPbNZ0291Dr8wttD5QecYyjIQap"
)
return t.NewPackage("libexpat", version, newFromGitHubRelease(
"libexpat/libexpat",
"R_"+strings.ReplaceAll(version, ".", "_"),
"expat-"+version+".tar.bz2",
checksum,
pkg.TarBzip2,
), nil, (*MakeHelper)(nil),
Bash,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibexpat,
Name: "libexpat",
Description: "a stream-oriented XML parser library",
Website: "https://libexpat.github.io/",
ID: 770,
})
}

View File

@@ -1,30 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibffi() (pkg.Artifact, string) {
const (
version = "3.5.2"
checksum = "2_Q-ZNBBbVhltfL5zEr0wljxPegUimTK4VeMSiwJEGksls3n4gj3lV0Ly3vviSFH"
)
return t.NewPackage("libffi", version, newFromGitHubRelease(
"libffi/libffi",
"v"+version,
"libffi-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil),
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibffi,
Name: "libffi",
Description: "a portable, high level programming interface to various calling conventions",
Website: "https://sourceware.org/libffi/",
ID: 1611,
})
}

View File

@@ -1,40 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibgd() (pkg.Artifact, string) {
const (
version = "2.3.3"
checksum = "8T-sh1_FJT9K9aajgxzh8ot6vWIF-xxjcKAHvTak9MgGUcsFfzP8cAvvv44u2r36"
)
return t.NewPackage("libgd", version, newFromGitHubRelease(
"libgd/libgd",
"gd-"+version,
"libgd-"+version+".tar.gz", checksum,
pkg.TarGzip,
), &PackageAttr{
Env: []string{
"TMPDIR=/dev/shm/gd",
},
ScriptEarly: `
mkdir /dev/shm/gd
`,
}, (*MakeHelper)(nil),
Zlib,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibgd,
Name: "libgd",
Description: "an open source code library for the dynamic creation of images",
Website: "https://libgd.github.io/",
Dependencies: P{
Zlib,
},
ID: 880,
})
}

View File

@@ -1,38 +0,0 @@
package rosa
import (
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newLibpng() (pkg.Artifact, string) {
const (
version = "1.6.58"
checksum = "m_a5lROJH7vmF3cMjqwTUqURuQLhV1JQx2ySPzcN3VPdgDB9pG3UINsIx_mtkr-t"
)
return t.NewPackage("libpng", version, newTar(
"https://downloads.sourceforge.net/project/libpng/libpng"+
strings.Join(strings.SplitN(version, ".", 3)[:2], "")+
"/"+version+"/libpng-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil),
Zlib,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibpng,
Name: "libpng",
Description: "the official PNG reference library",
Website: "https://www.libpng.org/pub/png/libpng.html",
Dependencies: P{
Zlib,
},
ID: 1705,
})
}

View File

@@ -1,37 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibpsl() (pkg.Artifact, string) {
const (
version = "0.21.5"
checksum = "XjfxSzh7peG2Vg4vJlL8z4JZJLcXqbuP6pLWkrGCmRxlnYUFTKNBqWGHCxEOlCad"
)
return t.NewPackage("libpsl", version, newFromGitHubRelease(
"rockdaboot/libpsl",
version,
"libpsl-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Writable: true,
ScriptEarly: `
test_disable() { chmod +w "$2" && echo "$1" > "$2"; }
test_disable 'int main(){return 0;}' tests/test-is-public-builtin.c
`,
}, (*MakeHelper)(nil),
Python,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibpsl,
Name: "libpsl",
Description: "provides functions to work with the Mozilla Public Suffix List",
Website: "https://rockdaboot.github.io/libpsl/",
ID: 7305,
})
}

View File

@@ -1,55 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibseccomp() (pkg.Artifact, string) {
const (
version = "2.6.0"
checksum = "mMu-iR71guPjFbb31u-YexBaanKE_nYPjPux-vuBiPfS_0kbwJdfCGlkofaUm-EY"
)
return t.NewPackage("libseccomp", version, newFromGitHubRelease(
"seccomp/libseccomp",
"v"+version,
"libseccomp-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
ScriptEarly: `
ln -s ../system/bin/bash /bin/
`,
Patches: []KV{
{"fix-export-oob-read", `diff --git a/src/api.c b/src/api.c
index adccef3..65a277a 100644
--- a/src/api.c
+++ b/src/api.c
@@ -786,7 +786,7 @@ API int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf,
if (BPF_PGM_SIZE(program) > *len)
rc = _rc_filter(-ERANGE);
else
- memcpy(buf, program->blks, *len);
+ memcpy(buf, program->blks, BPF_PGM_SIZE(program));
}
*len = BPF_PGM_SIZE(program);
`},
},
}, (*MakeHelper)(nil),
Bash,
Diffutils,
Gperf,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibseccomp,
Name: "libseccomp",
Description: "an interface to the Linux Kernel's syscall filtering mechanism",
Website: "https://github.com/seccomp/libseccomp/",
ID: 13823,
})
}

View File

@@ -1,44 +0,0 @@
package rosa
import (
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newLibtirpc() (pkg.Artifact, string) {
const (
version = "1.3.7"
checksum = "nzFfu7LNvnSNiNAryD1vtnNWnU-Xqee8KqfXUKoBf5yjb5-dkeRkYuRijdCoYLof"
)
return t.NewPackage("libtirpc", version, t.newTagRemote(
"git://linux-nfs.org/~steved/libtirpc",
"libtirpc-"+
strings.Join(strings.SplitN(version, ".", 3), "-"),
checksum,
), nil, &MakeHelper{
Generate: "sh -e ./bootstrap",
Configure: []KV{
{"CFLAGS", `"$(pkg-config --cflags libbsd-overlay) ${CFLAGS:-}"`},
{"disable-gssapi"},
},
},
Automake,
Libtool,
PkgConfig,
Libbsd,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibtirpc,
Name: "libtirpc",
Description: "a port of Suns Transport-Independent RPC library to Linux",
Website: "https://sourceforge.net/projects/libtirpc/",
ID: 1740,
})
}

View File

@@ -1,39 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibucontext() (pkg.Artifact, string) {
const (
version = "1.5.1"
checksum = "mUgeyJknjMxT-5fORzz-rqhZfP3Y7EZGBhOwvhuX7MsF4Pk9wkuwtrLf5IML-jWu"
)
return t.NewPackage("libucontext", version, newFromGitHub(
"kaniini/libucontext",
"libucontext-"+version,
checksum,
), &PackageAttr{
// uses source tree as scratch space
Writable: true,
Chmod: true,
EnterSource: true,
}, &MakeHelper{
OmitDefaults: true,
SkipConfigure: true,
InPlace: true,
Make: []string{
"ARCH=" + t.linuxArch(),
},
Install: "make prefix=/system DESTDIR=/work install",
}), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibucontext,
Name: "libucontext",
Description: "ucontext implementation featuring glibc-compatible ABI",
Website: "https://github.com/kaniini/libucontext/",
ID: 17085,
})
}

View File

@@ -1,32 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibxml2() (pkg.Artifact, string) {
const (
version = "2.15.3"
checksum = "oJy74htGlEpf70KPvpW18fYJo0RQQkCXZRwqUz6NoXborS3HCq3Nm4gsyaSeNmUH"
)
return t.NewPackage("libxml2", version, newFromGitLab(
"gitlab.gnome.org",
"GNOME/libxml2",
"v"+version, checksum,
), &PackageAttr{
// can't create shell.out: Read-only file system
Writable: true,
}, (*MesonHelper)(nil),
Git,
Diffutils,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibxml2,
Name: "libxml2",
Description: "an XML toolkit implemented in C",
Website: "https://gitlab.gnome.org/GNOME/libxml2/",
ID: 1783,
})
}

View File

@@ -1,42 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibxslt() (pkg.Artifact, string) {
const (
version = "1.1.45"
checksum = "67ks7v8od2oWaEGf23Sst_Xbn_8brQyolQjqxPoO-lK35k_WJhi2Px5JJgbk-nfn"
)
return t.NewPackage("libxslt", version, newFromGitLab(
"gitlab.gnome.org",
"GNOME/libxslt",
"v"+version, checksum,
), nil, &MakeHelper{
Generate: "NOCONFIGURE=1 ./autogen.sh",
// python libxml2 cyclic dependency
SkipCheck: true,
},
Automake,
Libtool,
Python,
PkgConfig,
Libxml2,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibxslt,
Name: "libxslt",
Description: "an XSLT processor based on libxml2",
Website: "https://gitlab.gnome.org/GNOME/libxslt/",
Dependencies: P{
Libxml2,
},
ID: 13301,
})
}

View File

@@ -1,14 +1,34 @@
package rosa package rosa
import ( import (
"io/fs"
"regexp" "regexp"
"slices" "slices"
"strings" "strings"
"unsafe"
"hakurei.app/internal/pkg" "hakurei.app/internal/pkg"
) )
// litArgs returns [LIT] arguments for optional verbosity and check skipping. var (
_llvmSource = H("llvm-project")
_muslHeaders = H("musl-headers")
_earlyCompilerRT = H("early-compiler-rt")
_earlyRuntimes = H("early-runtimes")
_musl = H("musl")
_bash = H("bash")
_gawk = H("gawk")
_coreutils = H("coreutils")
_diffutils = H("diffutils")
_findutils = H("findutils")
_zlib = H("zlib")
_zstd = H("zstd")
_kernelHeaders = H("kernel-headers")
)
// litArgs returns LIT arguments for optional verbosity and check skipping.
func litArgs(verbose bool, skipChecks ...string) string { func litArgs(verbose bool, skipChecks ...string) string {
args := []string{"-sv"} args := []string{"-sv"}
if verbose { if verbose {
@@ -29,10 +49,36 @@ func litArgs(verbose bool, skipChecks ...string) string {
return "'" + strings.Join(args, " ") + "'" return "'" + strings.Join(args, " ") + "'"
} }
func (t Toolchain) newEarlyCompilerRT() (pkg.Artifact, string) { func init() {
source, version := t.Load(llvmSource) var llvmPatches []KV
major, _, _ := strings.Cut(version, ".") for _, name := range [...]string{
return t.NewPackage("early-compiler-rt", version, source, &PackageAttr{ "increase-stack-size-unconditional",
"add-rosa-vendor",
"xfail-broken-tests",
"path-system-include",
"path-system-libraries",
} {
p, err := fs.ReadFile(nativeB, "package/llvm/"+name+".patch")
if err != nil {
panic(err)
}
llvmPatches = append(llvmPatches, KV{
name,
unsafe.String(unsafe.SliceData(p), len(p)),
})
}
native.MustRegister("early-compiler-rt", func(t Toolchain) (*Metadata, pkg.Artifact) {
meta := Metadata{
Name: "early-compiler-rt",
Description: "early LLVM runtime: compiler-rt",
Dependencies: P{_musl},
}
_meta, source := t.MustLoad(_llvmSource)
meta.Version = _meta.Version
major, _, _ := strings.Cut(meta.Version, ".")
return &meta, t.NewPackage("early-compiler-rt", meta.Version, source, &PackageAttr{
Flag: TExclusive, Flag: TExclusive,
}, &CMakeHelper{ }, &CMakeHelper{
Append: []string{"compiler-rt"}, Append: []string{"compiler-rt"},
@@ -78,28 +124,26 @@ ln -s \
"/work/system/lib/${ROSA_TRIPLE}/crtendS.o" "/work/system/lib/${ROSA_TRIPLE}/crtendS.o"
`, `,
}, },
Python, _python,
muslHeaders, _muslHeaders,
KernelHeaders, _kernelHeaders,
), version )
} })
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newEarlyCompilerRT,
Name: "early-compiler-rt", native.MustRegister("early-runtimes", func(t Toolchain) (*Metadata, pkg.Artifact) {
Description: "early LLVM runtime: compiler-rt", meta := Metadata{
Name: "early-runtimes",
Description: "early LLVM runtimes: libunwind, libcxx, libcxxabi",
Dependencies: P{ Dependencies: P{
Musl, _earlyCompilerRT,
}, },
})
} }
_meta, source := t.MustLoad(_llvmSource)
meta.Version = _meta.Version
func (t Toolchain) newEarlyRuntimes() (pkg.Artifact, string) { return &meta, t.NewPackage("early-runtimes", meta.Version, source, &PackageAttr{
source, version := t.Load(llvmSource)
return t.NewPackage("early-runtimes", version, source, &PackageAttr{
Flag: TExclusive, Flag: TExclusive,
}, &CMakeHelper{ }, &CMakeHelper{
Append: []string{"runtimes"}, Append: []string{"runtimes"},
@@ -136,36 +180,58 @@ func (t Toolchain) newEarlyRuntimes() (pkg.Artifact, string) {
}, },
SkipTest: true, SkipTest: true,
}, },
Python, _python,
Zlib, _zlib,
Zstd, _zstd,
earlyCompilerRT, _earlyCompilerRT,
KernelHeaders, _kernelHeaders,
), version )
})
const (
version = "22.1.6"
checksum = "vwMyqgc_09d__u49IlXGlxnp8eFlvpibhYQgVxQg-sGdoZlzyapMV4uX4UAjE7rA"
)
native.MustRegister("llvm-project", func(t Toolchain) (*Metadata, pkg.Artifact) {
meta := Metadata{
Name: "llvm-project",
Description: "LLVM monorepo with Rosa OS patches",
Version: version,
ID: 1830,
} }
func init() { return &meta, t.NewPatchedSource("llvm-"+version, newFromGitHub(
native.MustRegister(&Artifact{ "llvm/llvm-project",
f: Toolchain.newEarlyRuntimes, "llvmorg-"+version,
checksum,
), true, llvmPatches...)
})
Name: "early-runtimes", native.MustRegister("llvm", func(t Toolchain) (*Metadata, pkg.Artifact) {
Description: "early LLVM runtimes: libunwind, libcxx, libcxxabi", meta := Metadata{
Name: "llvm",
Description: "a collection of modular and reusable compiler and toolchain technologies",
Website: "https://llvm.org",
Dependencies: P{ Dependencies: P{
earlyCompilerRT, _zlib,
_zstd,
_musl,
}, },
})
} }
_meta, source := t.MustLoad(_llvmSource)
meta.Version = _meta.Version
func (t Toolchain) newLLVM() (pkg.Artifact, string) { early := _muslHeaders
early := muslHeaders
if t.stage.isStage0() { if t.stage.isStage0() {
// The LLVM build system uses the system installation when building with // The LLVM build system uses the system installation when building with
// LLVM_LINK_LLVM_DYLIB, since it builds runtimes after the fact, using // LLVM_LINK_LLVM_DYLIB, since it builds runtimes after the fact, using
// the just-built toolchain. This is unacceptable in stage0 due to the // the just-built toolchain. This is unacceptable in stage0 due to the
// potential version difference. Later stages bootstrap off of runtimes // potential version difference. Later stages bootstrap off of runtimes
// of its previous stage via 3-stage determinism. // of its previous stage via 3-stage determinism.
early = earlyRuntimes early = _earlyRuntimes
} }
cache := []KV{ cache := []KV{
@@ -273,8 +339,7 @@ func (t Toolchain) newLLVM() (pkg.Artifact, string) {
}...) }...)
} }
source, version := t.Load(llvmSource) return &meta, t.NewPackage("llvm", meta.Version, source, &PackageAttr{
return t.NewPackage("llvm", version, source, &PackageAttr{
Flag: TExclusive, Flag: TExclusive,
}, &CMakeHelper{ }, &CMakeHelper{
Append: []string{"llvm"}, Append: []string{"llvm"},
@@ -304,52 +369,19 @@ chmod +w /bin && ln -s \
ninja ` + jobsFlagE + ` check-all ninja ` + jobsFlagE + ` check-all
`, `,
}, },
Python, _python,
Perl, _perl,
Diffutils, _diffutils,
Bash, _bash,
Gawk, _gawk,
Coreutils, _coreutils,
Findutils, _findutils,
Zlib, _zlib,
Zstd, _zstd,
early, early,
KernelHeaders, _kernelHeaders,
), version
}
func init() {
const (
version = "22.1.5"
checksum = "32gOaLPHcUlo3hkdk5RbFumTE01XKeCAYZcpvn8IDHF95egXVfDFSl6eZL3ChMen"
) )
native.MustRegister(&Artifact{
f: func(t Toolchain) (pkg.Artifact, string) {
return t.NewPatchedSource("llvm", version, newFromGitHub(
"llvm/llvm-project",
"llvmorg-"+version,
checksum,
), true, llvmPatches...), version
},
Name: "llvm-project",
Description: "LLVM monorepo with Rosa OS patches",
ID: 1830,
})
native.MustRegister(&Artifact{
f: Toolchain.newLLVM,
Name: "llvm",
Description: "a collection of modular and reusable compiler and toolchain technologies",
Website: "https://llvm.org",
Dependencies: P{
Zlib,
Zstd,
Musl,
},
}) })
} }

View File

@@ -1,59 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLMSensors() (pkg.Artifact, string) {
const (
version = "3-6-2"
checksum = "7JYNutrihe-FP6r3ftf96uFZJJWPfxnBHL0ALSMA-vovaXVRr-sAjlLitw7WWpCI"
)
return t.NewPackage("lm_sensors", version, newFromGitHub(
"lm-sensors/lm-sensors",
"V"+version,
checksum,
), &PackageAttr{
Writable: true,
Chmod: true,
EnterSource: true,
ScriptEarly: `
ln -s \
../../system/bin/perl \
/usr/bin/
`,
}, &MakeHelper{
InPlace: true,
SkipConfigure: true,
Make: []string{
"CC=cc",
"ETCDIR=/system/etc",
"PREFIX=/system",
},
Check: []string{
"CC=cc",
"check",
},
Install: "make DESTDIR=/work PREFIX=/system install",
},
Perl,
PerlTestCmd,
M4,
Bison,
Flex,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLMSensors,
Name: "lm_sensors",
Description: "user-space support for hardware monitoring drivers",
Website: "https://hwmon.wiki.kernel.org/lm_sensors",
ID: 1831,
})
}

View File

@@ -3,40 +3,9 @@ package rosa
import ( import (
"slices" "slices"
"strings" "strings"
"hakurei.app/internal/pkg"
) )
func (t Toolchain) newMake() (pkg.Artifact, string) { var _make = H("make")
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
`, pkg.Path(AbsUsrSrc.Append("make"), false, newTar(
"https://ftpmirror.gnu.org/gnu/make/make-"+version+".tar.gz",
checksum,
pkg.TarGzip,
))), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMake,
Name: "make",
Description: "a tool which controls the generation of executables and other non-source files",
Website: "https://www.gnu.org/software/make/",
ID: 1877,
})
}
// MakeHelper is the [Make] build system helper. // MakeHelper is the [Make] build system helper.
type MakeHelper struct { type MakeHelper struct {
@@ -70,6 +39,8 @@ type MakeHelper struct {
Make []string Make []string
// Whether to skip the check target. // Whether to skip the check target.
SkipCheck bool SkipCheck bool
// Whether to skip the check target during stage0.
SkipCheckEarly bool
// Name of the check target, zero value is equivalent to "check". // Name of the check target, zero value is equivalent to "check".
Check []string Check []string
// Replaces the default install command. // Replaces the default install command.
@@ -80,11 +51,11 @@ var _ Helper = new(MakeHelper)
// extra returns make and other optional dependencies. // extra returns make and other optional dependencies.
func (attr *MakeHelper) extra(flag int) P { func (attr *MakeHelper) extra(flag int) P {
extra := P{Make} extra := P{_make}
if (attr == nil || !attr.OmitDefaults) && flag&TEarly == 0 { if (attr == nil || !attr.OmitDefaults) && flag&TEarly == 0 {
extra = append(extra, extra = append(extra,
Gawk, _gawk,
Coreutils, _coreutils,
) )
} }
return extra return extra
@@ -111,19 +82,16 @@ func (attr *MakeHelper) scriptEarly() string {
return generate return generate
} }
// createDir returns false.
func (*MakeHelper) createDir() bool { return false }
// wantsDir requests a new directory in TMPDIR, or omits the cd statement if InPlace. // wantsDir requests a new directory in TMPDIR, or omits the cd statement if InPlace.
func (attr *MakeHelper) wantsDir() string { func (attr *MakeHelper) wantsDir() (string, bool) {
if attr != nil && attr.InPlace { if attr != nil && attr.InPlace {
return helperInPlace return helperInPlace, false
} }
return `"$(mktemp -d)"` return `"$(mktemp -d)"`, false
} }
// script generates the cure script. // script generates the cure script.
func (attr *MakeHelper) script(s *S, name string) string { func (attr *MakeHelper) script(t Toolchain, name string) string {
if attr == nil { if attr == nil {
attr = new(MakeHelper) attr = new(MakeHelper)
} }
@@ -194,7 +162,8 @@ make \
} }
scriptMake += "\n" scriptMake += "\n"
if !attr.SkipCheck && s.opts&OptSkipCheck == 0 { if !attr.SkipCheck && t.opts&OptSkipCheck == 0 &&
(!attr.SkipCheckEarly || !t.stage.isStage0()) {
scriptMake += attr.ScriptCheckEarly + `make \ scriptMake += attr.ScriptCheckEarly + `make \
` + jobsFlagE + ` \ ` + jobsFlagE + ` \
` `

View File

@@ -1,265 +0,0 @@
package rosa
import (
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newLibglvnd() (pkg.Artifact, string) {
const (
version = "1.7.0"
checksum = "eIQJK2sgFQDHdeFkQO87TrSUaZRFG4y2DrwA8Ut-sGboI59uw1OOiIVqq2AIwnGY"
)
return t.NewPackage("libglvnd", version, newFromGitLab(
"gitlab.freedesktop.org",
"glvnd/libglvnd",
"v"+version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dx11", "enabled"},
{"Dglx", "enabled"},
},
ScriptCompiled: `
export DISPLAY=':0'
Xvfb &
XVFB_PID="$!"
trap 'kill $XVFB_PID && wait $XVFB_PID' EXIT
`,
},
Binutils, // symbols check fail with llvm nm
Xserver, // test suite wants X server
LibXext,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibglvnd,
Name: "libglvnd",
Description: "The GL Vendor-Neutral Dispatch library",
Website: "https://gitlab.freedesktop.org/glvnd/libglvnd",
Dependencies: P{
LibXext,
},
ID: 12098,
})
}
func (t Toolchain) newLibdrm() (pkg.Artifact, string) {
const (
version = "2.4.133"
checksum = "bfj296NcR9DndO11hqDbSRFPqaweSLMqRk3dlCPZpM6FONX1WZ9J4JdbTDMUd1rU"
)
return t.NewPackage("libdrm", version, newFromGitLab(
"gitlab.freedesktop.org",
"mesa/libdrm",
"libdrm-"+version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dintel", "enabled"},
},
},
Binutils, // symbols check fail with llvm nm
Libpciaccess,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibdrm,
Name: "libdrm",
Description: "a userspace library for accessing the DRM",
Website: "https://dri.freedesktop.org/",
Dependencies: P{
Libpciaccess,
},
ID: 1596,
})
}
func (t Toolchain) newLibva() (pkg.Artifact, string) {
const (
version = "2.23.0"
checksum = "UmF5tPyWIG_w5kiR3KFpoYbF7UUcaak5tyc-RhOheNTwQlLkPlifreFYCM9FQxbq"
)
return t.NewPackage("libva", version, newFromGitHub(
"intel/libva",
version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dwith_x11", "yes"},
{"Dwith_glx", "yes"},
{"Dwith_wayland", "yes"},
},
},
Libdrm,
LibXfixes,
Libglvnd,
Wayland,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibva,
Name: "libva",
Description: "an implementation for VA-API (Video Acceleration API)",
Website: "https://01.org/vaapi",
Dependencies: P{
Libdrm,
LibXfixes,
Libglvnd,
Wayland,
},
ID: 1752,
})
}
func (t Toolchain) newMesa() (pkg.Artifact, string) {
const (
version = "26.1.0"
checksum = "zU0fjqevySBaoi_5SLW3e2UffmGeBdxOuHmAHTH68n2hV-sjYoqg30koLqFXuk5y"
)
return t.NewPackage("mesa", version, newFromGitLab(
"gitlab.freedesktop.org",
"mesa/mesa",
"mesa-"+version,
checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dplatforms", "x11,wayland"},
{"Dvideo-codecs", "all"},
{"Dglvnd", "enabled"},
{"Dgbm", "enabled"},
{"Dgallium-drivers", strings.Join([]string{
"asahi", // Apple AGX
"crocus", // Intel legacy
"etnaviv", // Vivante GPU designs (mostly NXP/Marvell SoCs)
"freedreno", // Qualcomm Adreno (all Qualcomm SoCs)
"i915", // Intel extra legacy
"iris", // new Intel (Broadwell+)
"lima", // ARM Mali 4xx
"llvmpipe", // software renderer
"nouveau", // Nvidia
"panfrost", // ARM Mali Midgard and up (T/G series)
"r300", // very old AMD
"r600", // less old AMD
"radeonsi", // new AMD (GCN+)
"softpipe", // older software renderer
"svga", // VMWare virtualized GPU
"tegra", // Nvidia Tegra SoCs
"v3d", // Broadcom VC5 (Raspberry Pi 4)
"vc4", // Broadcom VC4 (Raspberry Pi 0-3)
"virgl", // QEMU virtualized GPU (aka VirGL)
"zink", // generic OpenGL over Vulkan, experimental
// d3d12: WSL emulated GPU (aka Dozen)
// ethosu: accelerator
// rocket: accelerator
}, ",")},
{"Dvulkan-drivers", strings.Join([]string{
"amd", // AMD (aka RADV)
"broadcom", // Broadcom VC5 (Raspberry Pi 4, aka V3D)
"freedreno", // Qualcomm Adreno (all Qualcomm SoCs)
"intel", // new Intel (aka ANV)
"intel_hasvk", // Intel Haswell/Broadwell, "legacy" Vulkan driver (https://www.phoronix.com/news/Intel-HasVK-Drop-Dead-Code)
"panfrost", // ARM Mali Midgard and up (T/G series)
"swrast", // software renderer (aka Lavapipe)
"virtio", // QEMU virtualized GPU (aka VirGL)
"imagination", // PowerVR Rogue
"asahi", // Apple AGX
"gfxstream", // Android virtualized GPU
// nouveau: Nouveau (aka NVK), requires rust
// microsoft-experimental: WSL virtualized GPU (aka DZN/Dozen)
// kosmickrisp: macOS-specific
}, ",")},
{"Dvulkan-layers", strings.Join([]string{
"device-select",
"intel-nullhw",
"overlay",
"screenshot",
"anti-lag",
"vram-report-limit",
}, ",")},
{"Dfreedreno-kmds", "msm,virtio"},
{"Damdgpu-virtio", "true"},
},
},
M4,
PythonPackaging,
PythonMako,
PythonPyYAML,
PythonPycparser,
Glslang,
SPIRVLLVMTranslator,
Zlib,
Zstd,
Gzip,
Ncurses,
Libglvnd,
Libexpat,
Libva,
Libdrm,
Elfutils,
Bison,
Flex,
LMSensors,
Libconfig,
LibdisplayInfo,
Wayland,
WaylandProtocols,
Libxshmfence,
LibXxf86vm,
LibXrandr,
LibxcbUtilKeysyms,
Libpng,
Libarchive,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMesa,
Name: "mesa",
Description: "open source implementations of OpenGL, OpenGL ES, Vulkan, OpenCL, and more",
Website: "https://mesa3d.org",
Dependencies: P{
Libdrm,
Elfutils,
LMSensors,
LibdisplayInfo,
Wayland,
Libxshmfence,
LibXxf86vm,
LibXrandr,
LibxcbUtilKeysyms,
Libpng,
},
ID: 1970,
latest: (*Versions).getStable,
})
}

View File

@@ -3,72 +3,9 @@ package rosa
import ( import (
"slices" "slices"
"strings" "strings"
"hakurei.app/internal/pkg"
) )
func (t Toolchain) newMeson() (pkg.Artifact, string) { var _meson = H("meson")
const (
version = "1.11.1"
checksum = "uvILRxdopwc6Dy17UbIeClcQr0qHqyTaqyk1M9OqWKN9PwB9N6UVAiyN8kSSz3r2"
)
return t.NewPackage("meson", version, newFromGitHub(
"mesonbuild/meson",
version,
checksum,
), &PackageAttr{
Env: []string{
"CMAKE_MAKE_PROGRAM=ninja",
},
}, &PipHelper{
EnterSource: true,
Check: `
cd 'test cases'
rm -rf \
'common/32 has header' \
'common/66 vcstag' \
'common/153 wrap file should not failed' \
'common/184 openmp' \
'common/189 check header' \
'linuxlike/6 subdir include order' \
'linuxlike/9 compiler checks with dependencies' \
'linuxlike/13 cmake dependency' \
'frameworks/15 llvm' \
'frameworks/29 blocks'
cd ..
python3 ./run_project_tests.py \
-v \
` + jobsFlagE + ` \
--failfast \
--backend=ninja
`,
},
PythonSetuptools,
PkgConfig,
CMake,
Ninja,
PythonPyTest,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMeson,
Name: "meson",
Description: "an open source build system",
Website: "https://mesonbuild.com/",
Dependencies: P{
Python,
PkgConfig,
CMake,
Ninja,
},
ID: 6472,
})
}
// MesonHelper is the [Meson] build system helper. // MesonHelper is the [Meson] build system helper.
type MesonHelper struct { type MesonHelper struct {
@@ -88,7 +25,7 @@ type MesonHelper struct {
var _ Helper = new(MesonHelper) var _ Helper = new(MesonHelper)
// extra returns hardcoded meson runtime dependencies. // extra returns hardcoded meson runtime dependencies.
func (*MesonHelper) extra(int) P { return P{Meson} } func (*MesonHelper) extra(int) P { return P{_meson} }
// wantsChmod returns false. // wantsChmod returns false.
func (*MesonHelper) wantsChmod() bool { return false } func (*MesonHelper) wantsChmod() bool { return false }
@@ -99,14 +36,11 @@ func (*MesonHelper) wantsWrite() bool { return false }
// scriptEarly returns the zero value. // scriptEarly returns the zero value.
func (*MesonHelper) scriptEarly() string { return "" } func (*MesonHelper) scriptEarly() string { return "" }
// createDir returns false.
func (*MesonHelper) createDir() bool { return false }
// wantsDir requests a new directory in TMPDIR. // wantsDir requests a new directory in TMPDIR.
func (*MesonHelper) wantsDir() string { return `"$(mktemp -d)"` } func (*MesonHelper) wantsDir() (string, bool) { return `"$(mktemp -d)"`, false }
// script generates the cure script. // script generates the cure script.
func (attr *MesonHelper) script(s *S, name string) string { func (attr *MesonHelper) script(t Toolchain, name string) string {
if attr == nil { if attr == nil {
attr = new(MesonHelper) attr = new(MesonHelper)
} }
@@ -117,7 +51,7 @@ func (attr *MesonHelper) script(s *S, name string) string {
} }
var scriptTest string var scriptTest string
if !attr.SkipTest && s.opts&OptSkipCheck == 0 { if !attr.SkipTest && t.opts&OptSkipCheck == 0 {
scriptTest = ` scriptTest = `
meson test \ meson test \
--print-errorlogs` --print-errorlogs`

View File

@@ -1,48 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newMksh() (pkg.Artifact, string) {
const (
version = "59c"
checksum = "0Zj-k4nXEu3IuJY4lvwD2OrC2t27GdZj8SPy4DoaeuBRH1padWb7oREpYgwY8JNq"
)
scriptTest := "./test.sh -C regress:no-ctty\n"
if t.opts&OptSkipCheck != 0 {
scriptTest = ""
}
return t.New("mksh-"+version, 0, t.Append(nil,
Perl,
Coreutils,
), nil, []string{
"LDSTATIC=-static",
"CPPFLAGS=-DMKSH_DEFAULT_PROFILEDIR=\\\"/system/etc\\\"",
}, `
cd "$(mktemp -d)"
sh /usr/src/mksh/Build.sh -r
CPPFLAGS="${CPPFLAGS} -DMKSH_BINSHPOSIX -DMKSH_BINSHREDUCED" \
sh /usr/src/mksh/Build.sh -r -L
`+scriptTest+`
mkdir -p /work/system/bin/
cp -v mksh /work/system/bin/
cp -v lksh /work/system/bin/sh
mkdir -p /work/bin/
ln -vs ../system/bin/sh /work/bin/
`, pkg.Path(AbsUsrSrc.Append("mksh"), false, newTar(
"https://mbsd.evolvis.org/MirOS/dist/mir/mksh/mksh-R"+version+".tgz",
checksum,
pkg.TarGzip,
))), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMksh,
Name: "mksh",
Description: "MirBSD Korn Shell",
Website: "https://www.mirbsd.org/mksh",
ID: 5590,
})
}

View File

@@ -1,36 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newMuslFts() (pkg.Artifact, string) {
const (
version = "1.2.7"
checksum = "N_p_ZApX3eHt7xoDCw1hLf6XdJOw7ZSx7xPvpvAP0knG2zgU0zeN5w8tt5Pg60XJ"
)
return t.NewPackage("musl-fts", version, newFromGitHub(
"void-linux/musl-fts",
"v"+version,
checksum,
), &PackageAttr{
Env: []string{
"CC=cc -fPIC",
},
}, &MakeHelper{
Generate: "./bootstrap.sh",
},
Automake,
Libtool,
PkgConfig,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMuslFts,
Name: "musl-fts",
Description: "implementation of fts(3) functions which are missing in musl libc",
Website: "https://github.com/void-linux/musl-fts",
ID: 26980,
})
}

View File

@@ -1,36 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newMuslObstack() (pkg.Artifact, string) {
const (
version = "1.2.3"
checksum = "tVRY_KjIlkkMszcaRlkKdBVQHIXTT_T_TiMxbwErlILXrOBosocg8KklppZhNdCG"
)
return t.NewPackage("musl-obstack", version, newFromGitHub(
"void-linux/musl-obstack",
"v"+version,
checksum,
), &PackageAttr{
Env: []string{
"CC=cc -fPIC",
},
}, &MakeHelper{
Generate: "./bootstrap.sh",
},
Automake,
Libtool,
PkgConfig,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newMuslObstack,
Name: "musl-obstack",
Description: "obstack functions and macros separated from glibc",
Website: "https://github.com/void-linux/musl-obstack",
ID: 146206,
})
}

View File

@@ -1,98 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newMusl(headers bool) (pkg.Artifact, string) {
const (
version = "1.2.6"
checksum = "WtWb_OV_XxLDAB5NerOL9loLlHVadV00MmGk65PPBU1evaolagoMHfvpZp_vxEzS"
)
name := "musl"
helper := MakeHelper{
OmitDefaults: true,
SkipCheck: true,
Script: `
mkdir -p /work/system/bin
COMPAT_LINKER_NAME="ld-musl-` + t.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 headers {
name += "-headers"
helper.Make = []string{
"DESTDIR=/work",
"install-headers",
}
helper.Install = "# headers installed during make"
helper.Script = ""
}
env := []string{
"LDFLAGS=" + t.earlyLDFLAGS(false),
}
if t.stage.isStage0() {
env = append(env,
"CC=clang",
"AR=ar",
"RANLIB=ranlib",
)
}
return t.NewPackage(name, version, newTar(
"https://musl.libc.org/releases/musl-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
// expected to be writable in copies
Chmod: true,
Env: env,
Patches: []KV{
{"ldso-rosa", `diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 715948f4..c2fece68 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -1157,7 +1157,7 @@ static struct dso *load_library(const char *name, struct dso *needed_by)
sys_path = "";
}
}
- if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
+ if (!sys_path) sys_path = "/system/lib:/system/lib/" LDSO_ARCH "-rosa-linux-musl:/lib:/usr/local/lib:/usr/lib";
fd = path_open(name, sys_path, buf, sizeof buf);
}
pathname = buf;
`},
},
}, &helper,
Coreutils,
), version
}
func init() {
native.MustRegister(&Artifact{
f: func(t Toolchain) (pkg.Artifact, string) {
return t.newMusl(false)
},
Name: "musl",
Description: "an implementation of the C standard library",
Website: "https://musl.libc.org/",
ID: 11688,
})
native.MustRegister(&Artifact{
f: func(t Toolchain) (pkg.Artifact, string) {
return t.newMusl(true)
},
Name: "musl-headers",
Description: "system installation of musl headers",
})
}

View File

@@ -1,38 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newNcurses() (pkg.Artifact, string) {
const (
version = "6.6"
checksum = "XvWp4xi6hR_hH8XUoGY26L_pqBSDapJYulhzZqPuR0KNklqypqNc1yNXU-nOjf5w"
)
return t.NewPackage("ncurses", version, newTar(
"https://ftpmirror.gnu.org/gnu/ncurses/ncurses-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, &MakeHelper{
// "tests" are actual demo programs, not a test suite.
SkipCheck: true,
Configure: []KV{
{"with-pkg-config"},
{"enable-pc-files"},
{"with-shared"},
{"with-cxx-shared"},
},
},
PkgConfig,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNcurses,
Name: "ncurses",
Description: "a free software emulation of curses in System V Release 4.0 (SVr4)",
Website: "https://invisible-island.net/ncurses/",
ID: 373226,
})
}

View File

@@ -1,147 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newLibmnl() (pkg.Artifact, string) {
const (
version = "1.0.5"
checksum = "DN-vbbvQDpxXJm0TJ6xlluILvfrB86avrCTX50XyE9SEFSAZ_o8nuKc5Gu0Am7-u"
)
return t.NewPackage("libmnl", version, newTar(
"https://www.netfilter.org/projects/libmnl/files/"+
"libmnl-"+version+".tar.bz2",
checksum,
pkg.TarBzip2,
), &PackageAttr{
Patches: []KV{
{"libbsd-sys-queue", `diff --git a/examples/netfilter/nfct-daemon.c b/examples/netfilter/nfct-daemon.c
index d223ac2..a7878d0 100644
--- a/examples/netfilter/nfct-daemon.c
+++ b/examples/netfilter/nfct-daemon.c
@@ -20,7 +20,7 @@
#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/nfnetlink_conntrack.h>
-#include <sys/queue.h>
+#include <bsd/sys/queue.h>
struct nstats {
LIST_ENTRY(nstats) list;
`},
},
}, &MakeHelper{
Configure: []KV{
{"enable-static"},
},
},
Libbsd,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibmnl,
Name: "libmnl",
Description: "a minimalistic user-space library oriented to Netlink developers",
Website: "https://www.netfilter.org/projects/libmnl/",
ID: 1663,
})
}
func (t Toolchain) newLibnftnl() (pkg.Artifact, string) {
const (
version = "1.3.1"
checksum = "91ou66K-I17iX6DB6hiQkhhC_v4DFW5iDGzwjVRNbJNEmKqowLZBlh3FY-ZDO0r9"
)
return t.NewPackage("libnftnl", version, t.newTagRemote(
"https://git.netfilter.org/libnftnl",
"libnftnl-"+version, checksum,
), &PackageAttr{
Env: []string{
"CFLAGS=-D_GNU_SOURCE",
},
}, &MakeHelper{
Generate: "./autogen.sh",
Configure: []KV{
{"enable-static"},
},
},
Automake,
Libtool,
PkgConfig,
Libmnl,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newLibnftnl,
Name: "libnftnl",
Description: "a userspace library providing a low-level netlink API to the in-kernel nf_tables subsystem",
Website: "https://www.netfilter.org/projects/libnftnl/",
Dependencies: P{
Libmnl,
},
ID: 1681,
})
}
func (t Toolchain) newIPTables() (pkg.Artifact, string) {
const (
version = "1.8.13"
checksum = "TUA-cFIAsiMvtRR-XzQvXzoIhJUOc9J2gQDJCbBRjmgmVfGfPTCf58wL7e-cUKVQ"
)
return t.NewPackage("iptables", version, t.newTagRemote(
"https://git.netfilter.org/iptables",
"v"+version, checksum,
), &PackageAttr{
ScriptEarly: `
rm \
extensions/libxt_connlabel.txlate \
extensions/libxt_conntrack.txlate
sed -i \
's/de:ad:0:be:ee:ff/DE:AD:00:BE:EE:FF/g' \
extensions/libebt_dnat.txlate \
extensions/libebt_snat.txlate
`,
}, &MakeHelper{
Generate: "./autogen.sh",
Configure: []KV{
{"enable-static"},
},
ScriptCheckEarly: `
ln -s ../system/bin/bash /bin/
chmod +w /etc/ && ln -s ../usr/src/iptables/etc/ethertypes /etc/
`,
},
Automake,
Libtool,
PkgConfig,
Bash,
Python,
Libnftnl,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newIPTables,
Name: "iptables",
Description: "the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset",
Website: "https://www.netfilter.org/projects/iptables/",
Dependencies: P{
Libnftnl,
},
ID: 1394,
})
}

View File

@@ -1,35 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newNettle() (pkg.Artifact, string) {
const (
version = "4.0"
checksum = "6agC-vHzzoqAlaX3K9tX8yHgrm03HLqPZzVzq8jh_ePbuPMIvpxereu_uRJFmQK7"
)
return t.NewPackage("nettle", version, newTar(
"https://ftpmirror.gnu.org/gnu/nettle/nettle-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil),
M4,
Diffutils,
GMP,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNettle,
Name: "nettle",
Description: "a low-level cryptographic library",
Website: "https://www.lysator.liu.se/~nisse/nettle/",
Dependencies: P{
GMP,
},
ID: 2073,
})
}

View File

@@ -1,33 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newNettle3() (pkg.Artifact, string) {
const (
version = "3.10.2"
checksum = "07aXlj10X5llf67jIqRQAA1pgLSgb0w_JYggZVPuKNoc-B-_usb5Kr8FrfBe7g1S"
)
return t.NewPackage("nettle", version, newTar(
"https://ftpmirror.gnu.org/gnu/nettle/nettle-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), nil, (*MakeHelper)(nil),
M4,
Diffutils,
GMP,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNettle3,
Name: "nettle3",
Description: "a low-level cryptographic library",
Website: "https://www.lysator.liu.se/~nisse/nettle/",
Dependencies: P{
GMP,
},
})
}

View File

@@ -1,51 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newNinja() (pkg.Artifact, string) {
const (
version = "1.13.2"
checksum = "ygKWMa0YV2lWKiFro5hnL-vcKbc_-RACZuPu0Io8qDvgQlZ0dxv7hPNSFkt4214v"
)
python, _ := t.Load(Python)
bash, _ := t.Load(Bash)
return t.New("ninja-"+version, 0, []pkg.Artifact{
python,
bash,
}, nil, nil, `
cd "$(mktemp -d)"
python3 /usr/src/ninja/configure.py \
--verbose \
--bootstrap \
--gtest-source-dir=/usr/src/googletest
./ninja `+jobsFlagE+` all
./ninja_test
mkdir -p /work/system/bin/
cp ninja /work/system/bin/
`, pkg.Path(AbsUsrSrc.Append("googletest"), false,
newFromGitHubRelease(
"google/googletest",
"v1.16.0",
"googletest-1.16.0.tar.gz",
"NjLGvSbgPy_B-y-o1hdanlzEzaYeStFcvFGxpYV3KYlhrWWFRcugYhM3ZMzOA9B_",
pkg.TarGzip,
)), pkg.Path(AbsUsrSrc.Append("ninja"), true, t.NewPatchedSource(
"ninja", version, newFromGitHub(
"ninja-build/ninja",
"v"+version,
checksum,
), false,
))), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNinja,
Name: "ninja",
Description: "a small build system with a focus on speed",
Website: "https://ninja-build.org/",
ID: 2089,
})
}

View File

@@ -1,130 +0,0 @@
package rosa
import (
"strings"
"hakurei.app/internal/pkg"
)
func (t Toolchain) newNSS() (pkg.Artifact, string) {
const (
version = "3.123.1"
checksum = "g811Z_fc74ssg-s6BeXRG-ipSfJggD6hrxjVJxrOBIz98CE7piv0OLwzIRLMQpwR"
version0 = "4_38_2"
checksum0 = "25x2uJeQnOHIiq_zj17b4sYqKgeoU8-IsySUptoPcdHZ52PohFZfGuIisBreWzx0"
)
return t.NewPackage("nss", version, newFromGitHub(
"nss-dev/nss",
"NSS_"+strings.Join(strings.SplitN(version, ".", 3), "_")+"_RTM",
checksum,
), &PackageAttr{
Paths: []pkg.ExecPath{
pkg.Path(AbsUsrSrc.Append("nspr.zip"), false, pkg.NewHTTPGet(
nil, "https://hg-edge.mozilla.org/projects/nspr/archive/"+
"NSPR_"+version0+"_RTM.zip",
mustDecode(checksum0),
)),
},
// uses source tree as scratch space
Writable: true,
Chmod: true,
ScriptEarly: `
unzip /usr/src/nspr.zip -d /usr/src
mv '/usr/src/nspr-NSPR_` + version0 + `_RTM' /usr/src/nspr
`,
}, &MakeHelper{
OmitDefaults: true,
SkipConfigure: true,
InPlace: true,
SkipCheck: true,
Make: []string{
"CCC=clang++",
"NSDISTMODE=copy",
"BUILD_OPT=1",
"USE_64=1",
"nss_build_all",
},
Install: `
mkdir -p /work/system/nss
cp -r \
/usr/src/dist/. \
lib/ckfw/builtins/certdata.txt \
/work/system/nss
`,
},
Perl,
Python,
Unzip,
Gawk,
Coreutils,
Zlib,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNSS,
Name: "nss",
Description: "Network Security Services",
Website: "https://firefox-source-docs.mozilla.org/security/nss/index.html",
Dependencies: P{
Zlib,
},
ID: 2503,
})
}
func init() {
const (
version = "0.5.1"
checksum = "oxjnuIrPVMPvD6x8VFLqB7EdbfuhouGQdtPuHDpEHGzoyH5nkxqtYN9UthMY9noA"
)
native.newPythonPackage(
"buildcatrust", 233988,
"transform certificate stores between formats",
"https://github.com/nix-community/buildcatrust",
version, newFromGitHub(
"nix-community/buildcatrust",
"v"+version, checksum,
), &PackageAttr{
ScriptEarly: `
rm buildcatrust/tests/test_nonhermetic.py
`,
}, nil, P{PythonFlitCore},
)
}
func (t Toolchain) newNSSCACert() (pkg.Artifact, string) {
return t.New("nss-cacert", 0, t.Append(nil,
Bash,
NSS,
buildcatrust,
), nil, nil, `
mkdir -p /work/system/etc/ssl/{certs/unbundled,certs/hashed,trust-source}
buildcatrust \
--certdata_input /system/nss/certdata.txt \
--ca_bundle_output /work/system/etc/ssl/certs/ca-bundle.crt \
--ca_standard_bundle_output /work/system/etc/ssl/certs/ca-no-trust-rules-bundle.crt \
--ca_unpacked_output /work/system/etc/ssl/certs/unbundled \
--ca_hashed_unpacked_output /work/system/etc/ssl/certs/hashed \
--p11kit_output /work/system/etc/ssl/trust-source/ca-bundle.trust.p11-kit
`), Unversioned
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newNSSCACert,
Name: "nss-cacert",
Description: "bundle of X.509 certificates of public Certificate Authorities",
Website: "https://curl.se/docs/caextract.html",
})
}

View File

@@ -1,55 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newOpenSSL() (pkg.Artifact, string) {
const (
version = "3.6.2"
checksum = "jH004dXTiE01Hp0kyShkWXwrSHEksZi4i_3v47D9H9Uz9LQ1aMwF7mrl2Tb4t_XA"
)
return t.NewPackage("openssl", version, newFromGitHubRelease(
"openssl/openssl",
"openssl-"+version,
"openssl-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Env: []string{
"CC=cc",
},
}, &MakeHelper{
OmitDefaults: true,
ConfigureName: "/usr/src/openssl/Configure",
Configure: []KV{
{"prefix", "/system"},
{"libdir", "lib"},
{"openssldir", "etc/ssl"},
{"", "no-docs"},
},
Check: []string{
"HARNESS_JOBS=" + jobsE,
"test",
},
},
Perl,
Coreutils,
Zlib,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newOpenSSL,
Name: "openssl",
Description: "TLS/SSL and crypto library",
Website: "https://www.openssl.org/",
ID: 2566,
// strange malformed tags treated as pre-releases in Anitya
latest: (*Versions).getStable,
})
}

View File

@@ -1,40 +0,0 @@
package rosa
import "hakurei.app/internal/pkg"
func (t Toolchain) newP11Kit() (pkg.Artifact, string) {
const (
version = "0.26.2"
checksum = "3ei-6DUVtYzrRVe-SubtNgRlweXd6H2qHmUu-_5qVyIn6gSTvZbGS2u79Y8IFb2N"
)
return t.NewPackage("p11-kit", version, t.newTagRemote(
"https://github.com/p11-glue/p11-kit.git",
version, checksum,
), nil, &MesonHelper{
Setup: []KV{
{"Dsystemd", "disabled"},
{"Dlibffi", "enabled"},
},
},
Coreutils,
Diffutils,
Libtasn1,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newP11Kit,
Name: "p11-kit",
Description: "provides a way to load and enumerate PKCS#11 modules",
Website: "https://p11-glue.freedesktop.org/p11-kit.html",
Dependencies: P{
Libffi,
Libtasn1,
},
ID: 2582,
})
}

View File

@@ -0,0 +1,26 @@
From 8a80d895dfd779373363c3a4b62ecce5a549efb2 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sat, 30 Mar 2024 10:17:10 +0100
Subject: tools/attr.c: Add missing libgen.h include for basename(3)
Fixes compilation issue with musl and modern C99 compilers.
See: https://bugs.gentoo.org/926294
---
tools/attr.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/attr.c b/tools/attr.c
index f12e4af..6a3c1e9 100644
--- a/tools/attr.c
+++ b/tools/attr.c
@@ -28,6 +28,7 @@
#include <errno.h>
#include <string.h>
#include <locale.h>
+#include <libgen.h>
#include <attr/attributes.h>
--
cgit v1.1

View File

@@ -0,0 +1,13 @@
diff --git a/test/attr.test b/test/attr.test
index 6ce2f9b..e9bde92 100644
--- a/test/attr.test
+++ b/test/attr.test
@@ -11,7 +11,7 @@ Try various valid and invalid names
$ touch f
$ setfattr -n user -v value f
- > setfattr: f: Operation not supported
+ > setfattr: f: Not supported
$ setfattr -n user. -v value f
> setfattr: f: Invalid argument

View File

@@ -0,0 +1,47 @@
package attr {
description = "Commands for Manipulating Filesystem Extended Attributes";
website = "https://savannah.nongnu.org/projects/attr";
anitya = 137;
version* = "2.5.2";
source = remoteTar {
url = "https://download.savannah.nongnu.org/releases/attr/"+
"attr-"+version+".tar.gz";
checksum = "YWEphrz6vg1sUMmHHVr1CRo53pFXRhq_pjN-AlG8UgwZK1y6m7zuDhxqJhD0SV0l";
compress = gzip;
};
patches = [
"libgen-basename.patch",
"musl-errno.patch",
];
early = `
ln -s ../../system/bin/perl /usr/bin
`;
exec = make {};
inputs = [ perl ];
}
package acl {
description = "Commands for Manipulating POSIX Access Control Lists";
website = "https://savannah.nongnu.org/projects/acl";
anitya = 16;
version* = "2.3.2";
source = remoteTar {
url = "https://download.savannah.nongnu.org/releases/acl/"+
"acl-"+version+".tar.gz";
checksum = "-fY5nwH4K8ZHBCRXrzLdguPkqjKI6WIiGu4dBtrZ1o0t6AIU73w8wwJz_UyjIS0P";
compress = gzip;
};
exec = make {
// makes assumptions about uid_map/gid_map
skipCheck = true;
};
inputs = [ attr ];
runtime = [ attr ];
}

View File

@@ -0,0 +1,25 @@
package argp-standalone {
description = "hierarchical argument parsing library broken out from glibc";
website = "http://www.lysator.liu.se/~nisse/misc";
version* = "1.3";
source = remoteTar {
url = "http://www.lysator.liu.se/~nisse/misc/"+
"argp-standalone-"+version+".tar.gz";
checksum = "vtW0VyO2pJ-hPyYmDI2zwSLS8QL0sPAUKC1t3zNYbwN2TmsaE-fADhaVtNd3eNFl";
compress = gzip;
};
env = [
"CC=cc -std=gnu89 -fPIC",
];
exec = make {
install = `
install -D -m644 /usr/src/argp-standalone/argp.h /work/system/include/argp.h
install -D -m755 libargp.a /work/system/lib/libargp.a
`;
};
inputs = [ diffutils ];
}

View File

@@ -0,0 +1,30 @@
package bison {
description = "a general-purpose parser generator";
website = "https://www.gnu.org/software/bison";
anitya = 193;
version* = "3.8.2";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/bison/bison-"+version+".tar.gz";
checksum = "BhRM6K7URj1LNOkIDCFDctSErLS-Xo5d9ba9seg10o6ACrgC1uNhED7CQPgIY29Y";
compress = gzip;
};
exec = make {
check = [
"TESTSUITEFLAGS=" + jobsFlagE + "' " + skipGNUTests {
tests = [
// clang miscompiles (SIGILL)
764,
];
} + "'",
"check",
];
};
inputs = [
m4,
diffutils,
sed,
];
}

View File

@@ -0,0 +1,19 @@
package buildcatrust {
description = "transform certificate stores between formats";
website = "https://github.com/nix-community/buildcatrust";
anitya = 233988;
version* = "0.5.1";
source = remoteGitHub {
suffix = "nix-community/buildcatrust";
tag = "v"+version;
checksum = "oxjnuIrPVMPvD6x8VFLqB7EdbfuhouGQdtPuHDpEHGzoyH5nkxqtYN9UthMY9noA";
};
early = "\nrm buildcatrust/tests/test_nonhermetic.py\n";
exec = pip {};
inputs = [ python-flit-core ];
runtime = [ python ];
}

View File

@@ -0,0 +1,27 @@
package bzip2 {
description = "a freely available, patent free, high-quality data compressor";
website = "https://sourceware.org/bzip2";
anitya = 237;
version* = "1.0.8";
source = remoteTar {
url = "https://sourceware.org/pub/bzip2/bzip2-"+version+".tar.gz";
checksum = "cTLykcco7boom-s05H1JVsQi1AtChYL84nXkg_92Dm1Xt94Ob_qlMg_-NSguIK-c";
compress = gzip;
};
// uses source tree as scratch space
writable = true;
enterSource = true;
exec = make {
skipConfigure = true;
skipCheck = true;
inPlace = true;
make = [
"CC=cc",
];
install = "make PREFIX=/work/system install";
};
}

View File

@@ -0,0 +1,13 @@
diff --git a/Tests/BootstrapTest.cmake b/Tests/BootstrapTest.cmake
index 137de78bc1..b4da52e664 100644
--- a/Tests/BootstrapTest.cmake
+++ b/Tests/BootstrapTest.cmake
@@ -9,7 +9,7 @@ if(NOT nproc EQUAL 0)
endif()
message(STATUS "running bootstrap: ${bootstrap} ${ninja_arg} ${parallel_arg}")
execute_process(
- COMMAND ${bootstrap} ${ninja_arg} ${parallel_arg}
+ COMMAND ${bootstrap} ${ninja_arg} ${parallel_arg} -- -DCMAKE_USE_OPENSSL=OFF
WORKING_DIRECTORY "${bin_dir}"
RESULT_VARIABLE result
)

View File

@@ -0,0 +1,41 @@
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 2ead810437..f85cbb8b1c 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -384,7 +384,6 @@ if(BUILD_TESTING)
add_subdirectory(CMakeLib)
endif()
add_subdirectory(CMakeOnly)
- add_subdirectory(RunCMake)
add_subdirectory(FindPackageModeMakefileTest)
@@ -528,9 +527,6 @@ if(BUILD_TESTING)
-DCMake_TEST_CUDA:BOOL=${CMake_TEST_CUDA}
-DCMake_INSTALL_NAME_TOOL_BUG:BOOL=${CMake_INSTALL_NAME_TOOL_BUG}
)
- ADD_TEST_MACRO(ExportImport ExportImport)
- set_property(TEST ExportImport APPEND
- PROPERTY LABELS "CUDA")
ADD_TEST_MACRO(Unset Unset)
ADD_TEST_MACRO(PolicyScope PolicyScope)
ADD_TEST_MACRO(EmptyLibrary EmptyLibrary)
@@ -624,7 +620,6 @@ if(BUILD_TESTING)
# run test for BundleUtilities on supported platforms/compilers
if((MSVC OR
MINGW OR
- CMAKE_SYSTEM_NAME MATCHES "Linux" OR
CMAKE_SYSTEM_NAME MATCHES "Darwin")
AND NOT CMAKE_GENERATOR STREQUAL "Watcom WMake")
@@ -3095,10 +3090,6 @@ if(BUILD_TESTING)
"${CMake_SOURCE_DIR}/Tests/CTestTestFdSetSize/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/test.cmake"
@ONLY ESCAPE_QUOTES)
- add_test(CTestTestFdSetSize ${CMAKE_CTEST_COMMAND}
- -S "${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/test.cmake" -j20 -V --timeout 120
- --output-log "${CMake_BINARY_DIR}/Tests/CTestTestFdSetSize/testOutput.log"
- )
if(CMAKE_TESTS_CDASH_SERVER)
set(regex "^([^:]+)://([^/]+)(.*)$")

View File

@@ -0,0 +1,45 @@
package cmake {
description = "cross-platform, open-source build system";
website = "https://cmake.org";
anitya = 306;
version* = "4.3.2";
source = remoteGitHubRelease {
suffix = "Kitware/CMake";
tag = "v"+version;
name = "cmake-"+version+".tar.gz";
checksum = "6QylwRVKletndTSkZTV2YBRwgd_9rUVgav_QW23HpjUgV21AVYZOUOal8tdBDmO7";
compress = gzip;
};
patches = [
"bootstrap-test-no-openssl.patch",
"disable-broken-tests-musl.patch",
];
// test suite expects writable source tree
writable = true;
// expected to be writable in the copy made during bootstrap
chmod = true;
exec = make {
omitDefaults = true;
configureName = "/usr/src/cmake/bootstrap";
configure = {
"prefix": "/system";
"parallel": jobsE;
"--";
"-DCMAKE_USE_OPENSSL": "OFF";
"-DCMake_TEST_NO_NETWORK": "ON";
};
check = [
"CTEST_OUTPUT_ON_FAILURE=1",
"CTEST_PARALLEL_LEVEL=128",
"test",
];
};
inputs = [ kernel-headers ];
}

View File

@@ -1,20 +1,4 @@
package rosa musl does not implement res_ninit
import "hakurei.app/internal/pkg"
func (t Toolchain) newConnman() (pkg.Artifact, string) {
const (
version = "2.0"
checksum = "MhVTdJOhndnZn2SWd8URKo_Pj7Zvc14tntEbrVOf9L3yVWJvpb3v3Q6104tWJgtW"
)
return t.NewPackage("connman", version, newTar(
"https://git.kernel.org/pub/scm/network/connman/connman.git/"+
"snapshot/connman-"+version+".tar.gz",
checksum,
pkg.TarGzip,
), &PackageAttr{
Patches: []KV{
{"alpine-musl-res", `musl does not implement res_ninit
--- a/gweb/gresolv.c --- a/gweb/gresolv.c
+++ b/gweb/gresolv.c +++ b/gweb/gresolv.c
@@ -73,37 +57,3 @@ func (t Toolchain) newConnman() (pkg.Artifact, string) {
} }
if (!resolv->nameserver_list) if (!resolv->nameserver_list)
`},
},
}, &MakeHelper{
Generate: "./bootstrap",
},
Automake,
Libtool,
PkgConfig,
DBus,
IPTables,
GnuTLS,
Readline,
KernelHeaders,
), version
}
func init() {
native.MustRegister(&Artifact{
f: Toolchain.newConnman,
Name: "connman",
Description: "a daemon for managing Internet connections",
Website: "https://git.kernel.org/pub/scm/network/connman/connman.git/",
Dependencies: P{
DBus,
IPTables,
GnuTLS,
Readline,
},
ID: 337,
})
}

View File

@@ -0,0 +1,37 @@
package connman {
description = "a daemon for managing Internet connections";
website = "https://git.kernel.org/pub/scm/network/connman/connman.git";
anitya = 337;
version* = "2.0";
source = remoteTar {
url = "https://git.kernel.org/pub/scm/network/connman/connman.git/"+
"snapshot/connman-"+version+".tar.gz";
checksum = "MhVTdJOhndnZn2SWd8URKo_Pj7Zvc14tntEbrVOf9L3yVWJvpb3v3Q6104tWJgtW";
compress = gzip;
};
patches = [ "alpine-musl-res.patch" ];
exec = make {
generate = "./bootstrap";
};
inputs = [
automake,
libtool,
pkg-config,
dbus,
iptables,
gnutls,
readline,
kernel-headers,
];
runtime = [
dbus,
iptables,
gnutls,
readline,
];
}

View File

@@ -0,0 +1,47 @@
package curl {
description = "command line tool and library for transferring data with URLs";
website = "https://curl.se";
anitya = 381;
version* = "8.20.0";
source = remoteTar {
url = "https://curl.se/download/curl-"+version+".tar.bz2";
checksum = "xyHXwrngIRGMasuzhn-I5MSCOhktwINbsWt1f_LuR-5jRVvyx_g6U1EQfDLEbr9r";
compress = bzip2;
};
// remove broken test
writable = true;
early = "\nchmod +w tests/data && rm -f tests/data/test459\n";
exec = make {
configure = {
"with-openssl";
"with-ca-bundle": "/system/etc/ssl/certs/ca-bundle.crt";
"disable-smb";
};
check = [
"TFLAGS=" + jobsLFlagE,
"test-nonflaky",
];
};
inputs = [
perl,
python,
pkg-config,
diffutils,
libpsl,
openssl,
];
runtime = [
zlib,
zstd,
libpsl,
openssl,
];
}

View File

@@ -0,0 +1,63 @@
package dbus {
description = "a message bus system";
website = "https://www.freedesktop.org/wiki/Software/dbus";
anitya = 5356;
version* = "1.16.2";
source = remoteGitLab {
domain = "gitlab.freedesktop.org";
suffix = "dbus/dbus";
ref = "dbus-"+version;
checksum = "INwOuNdrDG7XW5ilW_vn8JSxEa444rRNc5ho97i84I1CNF09OmcFcV-gzbF4uCyg";
};
// OSError: [Errno 30] Read-only file system: '/usr/src/dbus/subprojects/packagecache'
writable = true;
// PermissionError: [Errno 13] Permission denied: '/usr/src/dbus/subprojects/packagecache'
chmod = true;
exec = meson {
setup = {
"Depoll": "enabled";
"Dinotify": "enabled";
"Dx11_autolaunch": "disabled";
};
};
inputs = [
glib,
libexpat,
];
runtime = [
glib,
libexpat,
];
}
package xdg-dbus-proxy {
description = "a filtering proxy for D-Bus connections";
website = "https://github.com/flatpak/xdg-dbus-proxy";
anitya = 58434;
version* = "0.1.7";
source = remoteGitHub {
suffix = "flatpak/xdg-dbus-proxy";
tag = version;
checksum = "UW5Pe-TP-XAaN-kTbxrkOQ7eYdmlAQlr2pdreLtPT0uwdAz-7rzDP8V_8PWuZBup";
};
exec = meson {
setup = {
"Dman": "disabled";
};
};
inputs = [
dbus,
glib,
];
runtime = [ glib ];
}

View File

@@ -0,0 +1,33 @@
package dtc {
description = "The Device Tree Compiler";
website = "https://git.kernel.org/pub/scm/utils/dtc/dtc.git";
anitya = 16911;
version* = "1.7.2";
source = remoteTar {
url = "https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/"+
"dtc-v"+version+".tar.gz";
checksum = "vUoiRynPyYRexTpS6USweT5p4SVHvvVJs8uqFkkVD-YnFjwf6v3elQ0-Etrh00Dt";
compress = gzip;
};
// works around buggy test:
// fdtdump-runtest.sh /usr/src/dtc/tests/fdtdump.dts
writable = true;
chmod = true;
exec = meson {
setup = {
"Dyaml": "disabled";
"Dstatic-build": "true";
};
};
inputs = [
flex,
bison,
m4,
coreutils,
diffutils,
];
}

View File

@@ -0,0 +1,49 @@
package elfutils {
description = "utilities and libraries to handle ELF files and DWARF data";
website = "https://sourceware.org/elfutils";
anitya = 5679;
version* = "0.195";
source = remoteTar {
url = "https://sourceware.org/elfutils/ftp/"+
version+"/elfutils-"+version+".tar.bz2";
checksum = "JrGnBD38w8Mj0ZxDw3fKlRBFcLvRKu8rcYnX35R9yTlUSYnzTazyLboG-a2CsJlu";
compress = bzip2;
};
env = [
"CC=cc" +
// nonstandard glibc extension
" -DFNM_EXTMATCH=0",
];
exec = make {
// nonstandard glibc extension
skipCheck = true;
configure = {
"enable-deterministic-archives";
};
};
inputs = [
m4,
pkg-config,
zlib,
bzip2,
zstd,
argp-standalone,
musl-fts,
musl-obstack,
kernel-headers,
];
runtime = [
zlib,
bzip2,
zstd,
musl-fts,
musl-obstack,
];
}

View File

@@ -0,0 +1,47 @@
package firmware {
description = "firmware blobs for use with the Linux kernel";
website = "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git";
anitya = 141464;
version* = "20260410";
source = remoteGitLab {
domain = "gitlab.com";
suffix = "kernel-firmware/linux-firmware";
ref = version;
checksum = "J8PdQlGqwrivpskPzbL6xacqR6mlKtXpe5RpzFfVzKPAgG81ZRXsc3qrxwdGJbil";
};
// dedup creates temporary file
writable = true;
// does not use configure
enterSource = true;
env = [
"HOME=/proc/nonexistent",
];
exec = make {
omitDefaults = true;
skipConfigure = true;
inPlace = true;
make = [
"DESTDIR=/work/system",
"install-zst",
];
// requires pre-commit
skipCheck = true;
install = "make " + jobsFlagE + " DESTDIR=/work/system dedup";
};
inputs = [
parallel,
rdfind,
zstd,
findutils,
coreutils,
];
}

View File

@@ -0,0 +1,18 @@
package flex {
description = "scanner generator for lexing in C and C++";
website = "https://github.com/westes/flex";
anitya = 819;
version* = "2.6.4";
source = remoteGitHubRelease {
suffix = "westes/flex";
tag = "v"+version;
name = "flex-"+version+".tar.gz";
checksum = "p9POjQU7VhgOf3x5iFro8fjhy0NOanvA7CTeuWS_veSNgCixIJshTrWVkc5XLZkB";
compress = gzip;
};
exec = make {};
inputs = [ m4 ];
}

View File

@@ -0,0 +1,15 @@
package freetype {
description = "a freely available software library to render fonts";
website = "http://www.freetype.org";
anitya = 854;
version* = "2.14.3";
source = remoteTar {
url = "https://download.savannah.gnu.org/releases/freetype/"+
"freetype-"+version+".tar.gz";
checksum = "-WfLv8fVJNyCHpP_lriiDzOcVbBL9ajdQ3tl8AzIIUa9-8sVpU9irxOmSMgRHWYz";
compress = gzip;
};
exec = make {};
}

View File

@@ -0,0 +1,33 @@
package fuse {
description = "the reference implementation of the Linux FUSE interface";
website = "https://github.com/libfuse/libfuse";
anitya = 861;
version* = "3.18.2";
source = remoteGitHubRelease {
suffix = "libfuse/libfuse";
tag = "fuse-"+version;
name = "fuse-"+version+".tar.gz";
checksum = "iL-7b7eUtmlVSf5cSq0dzow3UiqSjBmzV3cI_ENPs1tXcHdktkG45j1V12h-4jZe";
compress = gzip;
};
exec = meson {
setup = {
"Ddefault_library": "both";
"Dtests": "true";
"Duseroot": "false";
"Dinitscriptdir": "/system/etc";
};
postCompile = "python3 -m pytest test/";
// this project uses pytest
skipTest = true;
};
inputs = [
python-pytest,
kernel-headers,
];
}

View File

@@ -0,0 +1,128 @@
diff --git a/libgo/go/internal/syscall/unix/at_largefile.go b/libgo/go/internal/syscall/unix/at_largefile.go
index 82e0dcfd074..16151ecad1b 100644
--- a/libgo/go/internal/syscall/unix/at_largefile.go
+++ b/libgo/go/internal/syscall/unix/at_largefile.go
@@ -10,5 +10,5 @@ import (
"syscall"
)
-//extern fstatat64
+//extern fstatat
func fstatat(int32, *byte, *syscall.Stat_t, int32) int32
diff --git a/libgo/go/os/dir_largefile.go b/libgo/go/os/dir_largefile.go
index 1fc5ee0771f..0c6dffe1a75 100644
--- a/libgo/go/os/dir_largefile.go
+++ b/libgo/go/os/dir_largefile.go
@@ -11,5 +11,5 @@ package os
import "syscall"
-//extern readdir64
+//extern readdir
func libc_readdir(*syscall.DIR) *syscall.Dirent
diff --git a/libgo/go/syscall/libcall_glibc.go b/libgo/go/syscall/libcall_glibc.go
index 5c1ec483c75..5a1245ed44b 100644
--- a/libgo/go/syscall/libcall_glibc.go
+++ b/libgo/go/syscall/libcall_glibc.go
@@ -114,7 +114,7 @@ func Pipe2(p []int, flags int) (err error) {
}
//sys sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
-//sendfile64(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
+//sendfile(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
if race.Enabled {
diff --git a/libgo/go/syscall/libcall_linux.go b/libgo/go/syscall/libcall_linux.go
index 03ca7261b59..ad21fd0b3ac 100644
--- a/libgo/go/syscall/libcall_linux.go
+++ b/libgo/go/syscall/libcall_linux.go
@@ -158,7 +158,7 @@ func Reboot(cmd int) (err error) {
//adjtimex(buf *Timex) _C_int
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
-//fstatfs64(fd _C_int, buf *Statfs_t) _C_int
+//fstatfs(fd _C_int, buf *Statfs_t) _C_int
func Gettid() (tid int) {
r1, _, _ := Syscall(SYS_GETTID, 0, 0, 0)
@@ -245,7 +245,7 @@ func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n i
}
//sys Statfs(path string, buf *Statfs_t) (err error)
-//statfs64(path *byte, buf *Statfs_t) _C_int
+//statfs(path *byte, buf *Statfs_t) _C_int
//sysnb Sysinfo(info *Sysinfo_t) (err error)
//sysinfo(info *Sysinfo_t) _C_int
diff --git a/libgo/go/syscall/libcall_posix_largefile.go b/libgo/go/syscall/libcall_posix_largefile.go
index f90055bb29a..334212f0af1 100644
--- a/libgo/go/syscall/libcall_posix_largefile.go
+++ b/libgo/go/syscall/libcall_posix_largefile.go
@@ -10,40 +10,40 @@
package syscall
//sys Creat(path string, mode uint32) (fd int, err error)
-//creat64(path *byte, mode Mode_t) _C_int
+//creat(path *byte, mode Mode_t) _C_int
//sys Fstat(fd int, stat *Stat_t) (err error)
-//fstat64(fd _C_int, stat *Stat_t) _C_int
+//fstat(fd _C_int, stat *Stat_t) _C_int
//sys Ftruncate(fd int, length int64) (err error)
-//ftruncate64(fd _C_int, length Offset_t) _C_int
+//ftruncate(fd _C_int, length Offset_t) _C_int
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
-//getrlimit64(resource _C_int, rlim *Rlimit) _C_int
+//getrlimit(resource _C_int, rlim *Rlimit) _C_int
//sys Lstat(path string, stat *Stat_t) (err error)
-//lstat64(path *byte, stat *Stat_t) _C_int
+//lstat(path *byte, stat *Stat_t) _C_int
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
-//mmap64(addr *byte, length Size_t, prot _C_int, flags _C_int, fd _C_int, offset Offset_t) *byte
+//mmap(addr *byte, length Size_t, prot _C_int, flags _C_int, fd _C_int, offset Offset_t) *byte
//sys Open(path string, mode int, perm uint32) (fd int, err error)
-//__go_open64(path *byte, mode _C_int, perm Mode_t) _C_int
+//__go_open(path *byte, mode _C_int, perm Mode_t) _C_int
//sys Pread(fd int, p []byte, offset int64) (n int, err error)
-//pread64(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
+//pread(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
-//pwrite64(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
+//pwrite(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
//sys Seek(fd int, offset int64, whence int) (off int64, err error)
-//lseek64(fd _C_int, offset Offset_t, whence _C_int) Offset_t
+//lseek(fd _C_int, offset Offset_t, whence _C_int) Offset_t
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
-//setrlimit64(resource int, rlim *Rlimit) _C_int
+//setrlimit(resource int, rlim *Rlimit) _C_int
//sys Stat(path string, stat *Stat_t) (err error)
-//stat64(path *byte, stat *Stat_t) _C_int
+//stat(path *byte, stat *Stat_t) _C_int
//sys Truncate(path string, length int64) (err error)
-//truncate64(path *byte, length Offset_t) _C_int
+//truncate(path *byte, length Offset_t) _C_int
diff --git a/libgo/runtime/go-varargs.c b/libgo/runtime/go-varargs.c
index f84860891e6..7efc9615985 100644
--- a/libgo/runtime/go-varargs.c
+++ b/libgo/runtime/go-varargs.c
@@ -84,7 +84,7 @@ __go_ioctl_ptr (int d, int request, void *arg)
int
__go_open64 (char *path, int mode, mode_t perm)
{
- return open64 (path, mode, perm);
+ return open (path, mode, perm);
}
#endif

View File

@@ -0,0 +1,16 @@
diff --git a/libgo/sysinfo.c b/libgo/sysinfo.c
index 180f5c31d74..44d7ea73f7d 100644
--- a/libgo/sysinfo.c
+++ b/libgo/sysinfo.c
@@ -365,11 +365,7 @@ enum {
typedef loff_t libgo_loff_t_type;
#endif
-#if defined(HAVE_OFF64_T)
-typedef off64_t libgo_off_t_type;
-#else
typedef off_t libgo_off_t_type;
-#endif
// The following section introduces explicit references to types and
// constants of interest to support bootstrapping libgo using a

View File

@@ -0,0 +1,87 @@
package binutils {
description = "a collection of binary tools";
website = "https://www.gnu.org/software/binutils";
anitya = 7981;
version* = "2.46.0";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/binutils/binutils-"+version+".tar.bz2";
checksum = "4kK1_EXQipxSqqyvwD4LbiMLFKCUApjq6PeG4XJP4dzxYGqDeqXfh8zLuTyOuOVR";
compress = bzip2;
};
exec = make {};
inputs = [ bash ];
}
package gcc {
description = "The GNU Compiler Collection";
website = "https://www.gnu.org/software/gcc";
anitya = 6502;
version* = "16.1.0";
source = remoteTar {
url = "https://ftp.tsukuba.wide.ad.jp/software/gcc/releases/"+
"gcc-"+version+"/gcc-"+version+".tar.gz";
checksum = "4ASoWbxaA2FW7PAB0zzHDPC5XnNhyaAyjtDPpGzceSLeYnEIXsNYZR3PA_Zu5P0K";
compress = gzip;
};
patches = [
"musl-off64_t-loff_t.patch",
"musl-legacy-lfs.patch",
];
// GCC spends most of its time in its many configure scripts, however
// it also saturates the CPU for a consequential amount of time.
exclusive = true;
early = `
ln -s system/lib /
ln -s system/lib /work/
`;
exec = make {
configure = {
"disable-multilib";
"enable-default-pie";
"disable-nls";
"with-gnu-as";
"with-gnu-ld";
"with-system-zlib";
"enable-languages": "c,c++,go";
"with-native-system-header-dir": "/system/include";
"with-multilib-list": arch {
amd64, arm64 = "''";
};
};
make = [
"BOOT_CFLAGS='-O2 -g'",
"bootstrap",
];
// This toolchain is hacked to pieces, it is not expected to ever work
// well in its current state. That does not matter as long as the
// toolchain it produces passes its own test suite.
skipCheck = true;
};
inputs = [
binutils,
mpc,
zlib,
libucontext,
kernel-headers,
];
runtime = [
binutils,
mpc,
zlib,
libucontext,
];
}

View File

@@ -0,0 +1,95 @@
package git {
description = "distributed version control system";
website = "https://www.git-scm.com";
anitya = 5350;
version* = "2.54.0";
source = remoteTar {
url = "https://www.kernel.org/pub/software/scm/git/"+
"git-"+version+".tar.gz";
checksum = "7vGKtFOJGqY8DO4e8UMRax7dLgImXKQz5MMalec6MlgYrsarffSJjgOughwRFpSH";
compress = gzip;
};
early = `
ln -s ../../system/bin/perl /usr/bin/ || true
# test suite assumes apache
rm -f /system/bin/httpd
`;
// uses source tree as scratch space
enterSource = true;
exec = make {
inPlace = true;
generate = "make configure";
preMake = `
function disable_test {
local test=$1 pattern=${2:-''}
if [ $# -eq 1 ]; then
rm "t/${test}.sh"
else
sed -i "t/${test}.sh" \
-e "/^\s*test_expect_.*$pattern/,/^\s*' *\$/{s/^/: #/}"
fi
}
disable_test t1800-hook
disable_test t5319-multi-pack-index
disable_test t1305-config-include
disable_test t3900-i18n-commit
disable_test t3507-cherry-pick-conflict
disable_test t4201-shortlog
disable_test t5303-pack-corruption-resilience
disable_test t4301-merge-tree-write-tree
disable_test t8005-blame-i18n
disable_test t9350-fast-export
disable_test t9300-fast-import
disable_test t0211-trace2-perf
disable_test t1517-outside-repo
disable_test t2200-add-update
disable_test t0027-auto-crlf
disable_test t7513-interpret-trailers
disable_test t7703-repack-geometric
disable_test t3705-add-sparse-checkout
disable_test t7002-mv-sparse-checkout
disable_test t1451-fsck-buffer
disable_test t4104-apply-boundary
disable_test t4200-rerere
disable_test t5515-fetch-merge-logic
`;
check = [
"-C t",
`GIT_PROVE_OPTS="--jobs 32 --failures"`,
"prove",
];
install = `make \
` + jobsFlagE + ` \
DESTDIR=/work \
NO_INSTALL_HARDLINKS=1 \
install`;
};
inputs = [
// test suite hangs on mksh
bash,
diffutils,
autoconf,
gettext,
zlib,
curl,
libexpat,
];
runtime = [
zlib,
curl,
libexpat,
];
}

Some files were not shown because too many files have changed in this diff Show More