aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/bison.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-05-18 22:21:36 +0900
committerOphestra <cat@gensokyo.uk>2026-05-18 22:29:53 +0900
commiteb2b53307a195cfdb46187771f137eef93b8c4ba (patch)
treea0581bee80cbabb1fee6f67002f457253dc0da74 /internal/rosa/bison.go
parent682b3a2ce53252b2bd0c0da86c89c392f74f68e0 (diff)
internal/rosa/package: migrate gcc
The azalea implementation used an adaptation of this as testdata. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/bison.go')
-rw-r--r--internal/rosa/bison.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/internal/rosa/bison.go b/internal/rosa/bison.go
new file mode 100644
index 00000000..b79ed9e1
--- /dev/null
+++ b/internal/rosa/bison.go
@@ -0,0 +1,78 @@
+package rosa
+
+import (
+ "slices"
+ "strconv"
+ "strings"
+
+ "hakurei.app/internal/pkg"
+)
+
+// 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 ...int) 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(n - 1))
+ buf.WriteString(" ")
+ }
+ if i == len(tests)-1 || tests[i+1] != n+1 {
+ buf.WriteString(strconv.Itoa(n + 1))
+ buf.WriteString("-")
+ }
+ }
+ return buf.String()
+}
+
+func (t Toolchain) newBison() (pkg.Artifact, string) {
+ const (
+ version = "3.8.2"
+ checksum = "BhRM6K7URj1LNOkIDCFDctSErLS-Xo5d9ba9seg10o6ACrgC1uNhED7CQPgIY29Y"
+ )
+ return t.NewPackage("bison", version, newTar(
+ "https://ftpmirror.gnu.org/gnu/bison/bison-"+version+".tar.gz",
+ checksum,
+ pkg.TarGzip,
+ ), nil, &MakeHelper{
+ Check: []string{
+ "TESTSUITEFLAGS=" + jobsFlagE + "' " + skipGNUTests(
+ // clang miscompiles (SIGILL)
+ 764,
+ ) + "'",
+ "check",
+ },
+ },
+ M4,
+ Diffutils,
+ Sed,
+ ), version
+}
+func init() {
+ native.MustRegister(&Artifact{
+ f: Toolchain.newBison,
+
+ Name: "bison",
+ Description: "a general-purpose parser generator",
+ Website: "https://www.gnu.org/software/bison/",
+
+ ID: 193,
+ })
+}