aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-11-01 00:28:47 +0900
committerOphestra <cat@gensokyo.uk>2026-11-01 00:28:47 +0900
commitaaeefb7be7a6b59810be514d6c40159f40761f0d (patch)
treeda562f44eeb25adf837d0bfccaaf7bfc02d56cdf
parent6b88f9afb9f8cd6312e0313e51e23d35dc23310b (diff)
internal/rosa: enable checks for cross-compilation
This uses QEMU to run checks when supported. Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--internal/rosa/cmake.go32
-rw-r--r--internal/rosa/llvm.go1
-rw-r--r--internal/rosa/make.go3
-rw-r--r--internal/rosa/package/fuse/package.az5
-rw-r--r--internal/rosa/package/glib/package.az5
-rw-r--r--internal/rosa/package/hakurei.az5
-rw-r--r--internal/rosa/package/kernel/package.az7
-rw-r--r--internal/rosa/package/libarchive/package.az7
-rw-r--r--internal/rosa/package/libdisplay-info.az8
-rw-r--r--internal/rosa/package/libdrm.az5
-rw-r--r--internal/rosa/package/libxml2.az8
-rw-r--r--internal/rosa/package/llvm/package.az3
-rw-r--r--internal/rosa/package/pcre2.az6
-rw-r--r--internal/rosa/package/spirv.az12
-rw-r--r--internal/rosa/package/wayland.az7
-rw-r--r--internal/rosa/package/zstd.az6
-rw-r--r--internal/rosa/state.go7
17 files changed, 103 insertions, 24 deletions
diff --git a/internal/rosa/cmake.go b/internal/rosa/cmake.go
index 049688e5..b22c124f 100644
--- a/internal/rosa/cmake.go
+++ b/internal/rosa/cmake.go
@@ -20,6 +20,8 @@ type CMakeHelper struct {
// Use the bootstrap minimal [MakeHelper] CMake.
Early bool
+ // Omit CMAKE_CROSSCOMPILING_EMULATOR, because qemu is not yet available.
+ SkipEmulator bool
// Value of CMAKE_BUILD_TYPE. The zero value is equivalent to "Release".
BuildType string
@@ -40,16 +42,22 @@ type CMakeHelper struct {
var _ Helper = new(CMakeHelper)
// tools returns the cmake handle alongside either ninja or make.
-func (attr *CMakeHelper) tools(Toolchain) P {
- h := _cmake
- if attr != nil && attr.Early {
- h = _cmakeEarly
- }
+func (attr *CMakeHelper) tools(t Toolchain) P {
+ tools := P{_cmake, _ninja, _qemu}
+ if attr != nil {
+ if attr.Early {
+ tools[0] = _cmakeEarly
+ }
+
+ if attr.Make {
+ tools[1] = _make
+ }
- if attr != nil && attr.Make {
- return P{h, _make}
+ if !t.cross() || attr.SkipEmulator {
+ tools = tools[:2]
+ }
}
- return P{h, _ninja}
+ return tools
}
// inputs is a noop.
@@ -85,7 +93,8 @@ func (attr *CMakeHelper) script(t Toolchain, name string) string {
}
script := attr.Script
- if !attr.SkipTest && t.opts&OptSkipCheck == 0 {
+ if !attr.SkipTest && t.opts&OptSkipCheck == 0 &&
+ !(t.cross() && attr.SkipEmulator) {
script += "\n" + test
}
@@ -108,6 +117,11 @@ func (attr *CMakeHelper) script(t Toolchain, name string) string {
-DCMAKE_CXX_FLAGS='--target=` + target + ` --sysroot=` + sysroot + `' \
-DCMAKE_ASM_COMPILER=` + Prefix + `/bin/clang \
-DCMAKE_ASM_FLAGS='--target=` + target + ` --sysroot=` + sysroot + `' \`
+
+ if !attr.SkipEmulator {
+ cross += `
+ -DCMAKE_CROSSCOMPILING_EMULATOR='qemu-` + t.linuxArch() + `;-L;` + sysroot + `' \`
+ }
}
return `
diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go
index dacb9098..b214fd83 100644
--- a/internal/rosa/llvm.go
+++ b/internal/rosa/llvm.go
@@ -293,6 +293,7 @@ cat << EOF > /work` + Prefix + `/bin/clang++.cfg
EOF
`,
+ SkipEmulator: true,
// LLVM_LINK_LLVM_DYLIB causes llvm test suite to leak system
// installation into test environment, and the tests end up testing the
// system installation instead. Tests are disabled on stage0 and relies
diff --git a/internal/rosa/make.go b/internal/rosa/make.go
index 7a8bdec9..6f3d7526 100644
--- a/internal/rosa/make.go
+++ b/internal/rosa/make.go
@@ -222,7 +222,8 @@ make \
scriptMake += "\n"
if !attr.SkipCheck && t.opts&OptSkipCheck == 0 &&
- (!attr.SkipCheckEarly || !t.stage.isStage0()) {
+ (!attr.SkipCheckEarly || !t.stage.isStage0()) &&
+ !t.cross() {
scriptMake += attr.ScriptCheckEarly + `make \
` + jobsFlagE + ` \
` + loadFlagE + ` \
diff --git a/internal/rosa/package/fuse/package.az b/internal/rosa/package/fuse/package.az
index b73432a3..f7fce8a6 100644
--- a/internal/rosa/package/fuse/package.az
+++ b/internal/rosa/package/fuse/package.az
@@ -20,6 +20,11 @@ package fuse {
"useroot": "false";
"initscriptdir": prefix+"/etc";
};
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper
+ cross = false;
+ };
};
tools = [ bash ];
diff --git a/internal/rosa/package/glib/package.az b/internal/rosa/package/glib/package.az
index 9c531283..4e46d93f 100644
--- a/internal/rosa/package/glib/package.az
+++ b/internal/rosa/package/glib/package.az
@@ -22,6 +22,11 @@ package glib {
};
// fails with ipv6 disabled
skipTests = [ "gio" ];
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper
+ cross = false;
+ };
};
tools = [
diff --git a/internal/rosa/package/hakurei.az b/internal/rosa/package/hakurei.az
index 14faef32..1a7e953f 100644
--- a/internal/rosa/package/hakurei.az
+++ b/internal/rosa/package/hakurei.az
@@ -53,11 +53,14 @@ GOARCH='`+arch+`' CGO_ENABLED=0 go build -trimpath -tags=rosa -o /work`+prefix+`
-buildid=
-X main.hakureiPath=`+prefix+`/bin/hakurei
" ./cmd/hsu`;
- check = `
+ check = arch {
+ default = `
echo
echo '##### Testing hakurei.'
go test -ldflags='-buildid= -linkmode external -extldflags=-static' ./...
echo`;
+ cross = unset;
+ };
install = `
mkdir -p /work`+prefix+`/bin/
(cd /work`+prefix+`/libexec/hakurei && mv \
diff --git a/internal/rosa/package/kernel/package.az b/internal/rosa/package/kernel/package.az
index 10aeb63f..741d4c6e 100644
--- a/internal/rosa/package/kernel/package.az
+++ b/internal/rosa/package/kernel/package.az
@@ -91,12 +91,7 @@ package kernel {
source = kernel-source;
files = {
- ".config": arch {
- amd64 = "amd64.config";
- arm64 = "arm64.config";
- ppc64le = "ppc64le.config";
- riscv64 = "riscv64.config";
- };
+ ".config": arch+".config";
"/sbin/installkernel": "installkernel";
// kernel is not aware of kmod moduledir
diff --git a/internal/rosa/package/libarchive/package.az b/internal/rosa/package/libarchive/package.az
index bd57a860..da21f4ff 100644
--- a/internal/rosa/package/libarchive/package.az
+++ b/internal/rosa/package/libarchive/package.az
@@ -15,7 +15,12 @@ package libarchive {
writable = true;
early = "\ninstall -Dv /usr/src/CTestCustom.cmake /cure/\n";
- exec = cmake {};
+ exec = cmake {
+ test = arch {
+ default = unset;
+ cross = nil;
+ };
+ };
inputs = [
zlib,
diff --git a/internal/rosa/package/libdisplay-info.az b/internal/rosa/package/libdisplay-info.az
index b953203b..99d4e419 100644
--- a/internal/rosa/package/libdisplay-info.az
+++ b/internal/rosa/package/libdisplay-info.az
@@ -11,7 +11,13 @@ package libdisplay-info {
checksum = "CSa7niSNG6xpUiV5bhDIPp6PU239fzY3SShaneY0rhhuFYSxZFzKGTiE16-k6sSA";
};
- exec = meson {};
+ exec = meson {
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper
+ cross = false;
+ };
+ };
tools = [
diffutils,
hwdata,
diff --git a/internal/rosa/package/libdrm.az b/internal/rosa/package/libdrm.az
index 6491da28..3ae9a8e5 100644
--- a/internal/rosa/package/libdrm.az
+++ b/internal/rosa/package/libdrm.az
@@ -15,6 +15,11 @@ package libdrm {
setup = {
"intel": "enabled";
};
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper
+ cross = false;
+ };
};
tools = [
diff --git a/internal/rosa/package/libxml2.az b/internal/rosa/package/libxml2.az
index a169c0e4..b0843081 100644
--- a/internal/rosa/package/libxml2.az
+++ b/internal/rosa/package/libxml2.az
@@ -14,7 +14,13 @@ package libxml2 {
// can't create shell.out: Read-only file system
writable = true;
- exec = meson {};
+ exec = meson {
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper
+ cross = false;
+ };
+ };
tools = [
git,
diff --git a/internal/rosa/package/llvm/package.az b/internal/rosa/package/llvm/package.az
index 007b94c3..7a047b74 100644
--- a/internal/rosa/package/llvm/package.az
+++ b/internal/rosa/package/llvm/package.az
@@ -33,6 +33,7 @@ package early-builtins {
"COMPILER_RT_DEFAULT_TARGET_ONLY": "ON";
};
+ qemu = false;
test = nil;
};
@@ -85,6 +86,7 @@ message(NOTICE "${LLVM_VERSION_MAJOR}")
"COMPILER_RT_BUILD_XRAY": "OFF";
"COMPILER_RT_BUILD_ORC": "OFF";
};
+ qemu = false;
test = nil;
postInstall = `
mkdir -p "/work`+prefix+`/lib/clang/$LLVM_VERSION_MAJOR/lib/"
@@ -139,6 +141,7 @@ package early-runtimes {
"LLVM_ENABLE_ZSTD": "FORCE_ON";
"LLVM_ENABLE_LIBXML2": "OFF";
};
+ qemu = false;
test = nil;
};
diff --git a/internal/rosa/package/pcre2.az b/internal/rosa/package/pcre2.az
index e964ced0..74649dfd 100644
--- a/internal/rosa/package/pcre2.az
+++ b/internal/rosa/package/pcre2.az
@@ -18,6 +18,12 @@ package pcre2 {
cache = {
"PCRE2_SUPPORT_JIT": "ON";
};
+
+ test = arch {
+ default = unset;
+ // test suite bypasses ctest
+ cross = nil;
+ };
};
tools = [
diff --git a/internal/rosa/package/spirv.az b/internal/rosa/package/spirv.az
index 33a4816a..d2d4ad99 100644
--- a/internal/rosa/package/spirv.az
+++ b/internal/rosa/package/spirv.az
@@ -37,6 +37,12 @@ package spirv-tools {
cross = prefix+"/"+arch;
}+prefix;
};
+
+ test = arch {
+ default = unset;
+ // attempts to invoke python through qemu
+ cross = nil;
+ };
};
tools = [ python ];
@@ -156,6 +162,12 @@ package spirv-llvm-translator {
"LLVM_EXTERNAL_LIT": prefix+"/bin/lit";
"LLVM_INCLUDE_TESTS": "ON";
};
+
+ test = arch {
+ default = unset;
+ // lit does not use emulator specified for CMake
+ cross = nil;
+ };
};
tools = [
diff --git a/internal/rosa/package/wayland.az b/internal/rosa/package/wayland.az
index 25f0c680..a51f502b 100644
--- a/internal/rosa/package/wayland.az
+++ b/internal/rosa/package/wayland.az
@@ -23,6 +23,13 @@ echo 'int main(){}' > tests/sanity-test.c
"documentation": "false";
"tests": "true";
};
+
+ test = arch {
+ default = unset;
+ // some tests bypass meson exe_wrapper, qemu sets off
+ // fd leak tests
+ cross = false;
+ };
};
tools = [
diff --git a/internal/rosa/package/zstd.az b/internal/rosa/package/zstd.az
index 29e2c51f..47974385 100644
--- a/internal/rosa/package/zstd.az
+++ b/internal/rosa/package/zstd.az
@@ -18,10 +18,14 @@ package zstd {
exec = cmake {
append = [ "build", "cmake" ];
- test = `
+ test = arch {
+ default = `
make -C /usr/src/zstd/tests datagen
ZSTD_BIN=/cure/programs/zstd /usr/src/zstd/tests/playTests.sh
`;
+ // does not use ctest
+ cross = nil;
+ };
};
tools = [
diff --git a/internal/rosa/state.go b/internal/rosa/state.go
index aa03b8ba..dc1b3109 100644
--- a/internal/rosa/state.go
+++ b/internal/rosa/state.go
@@ -226,15 +226,13 @@ type S struct {
// crosscompiling state for the native architecture.
var ErrInvalidCross = errors.New("invalid cross-compilation state")
-// NewCross returns a copy of s for cross-compilation. Testing is disabled in
-// the copy.
+// NewCross returns a copy of s for cross-compilation.
func (s *S) NewCross(arch string) *S {
if s.native != nil && arch == s.native.Arch() {
panic(ErrInvalidCross)
}
p := s.Clone()
- p.opts |= OptSkipCheck
p.native, p.arch = s, arch
return p
}
@@ -928,8 +926,10 @@ func (s *S) getFrame() azalea.Frame {
) (v any, set bool, err error) {
var attr CMakeHelper
var test azalea.AString
+ qemu := true
if err = args.Apply(map[unique.Handle[azalea.Ident]]any{
k("early"): &attr.Early,
+ k("qemu"): &qemu,
k("append"): &attr.Append,
k("buildType"): &attr.BuildType,
k("cache"): &attr.Cache,
@@ -939,6 +939,7 @@ func (s *S) getFrame() azalea.Frame {
}); err != nil {
return
}
+ attr.SkipEmulator = !qemu
attr.Test = test.V
attr.SkipTest = test.Nil