diff --git a/internal/rosa/bzip2.go b/internal/rosa/bzip2.go index e4ba4c8..569d7d8 100644 --- a/internal/rosa/bzip2.go +++ b/internal/rosa/bzip2.go @@ -7,16 +7,21 @@ func (t Toolchain) newBzip2() pkg.Artifact { version = "1.0.8" checksum = "cTLykcco7boom-s05H1JVsQi1AtChYL84nXkg_92Dm1Xt94Ob_qlMg_-NSguIK-c" ) - return t.New("bzip2-"+version, 0, []pkg.Artifact{ - t.Load(Make), - }, nil, nil, ` -cd /usr/src/bzip2 -make CC=cc -make PREFIX=/work/system install -`, pkg.Path(AbsUsrSrc.Append("bzip2"), true, pkg.NewHTTPGetTar( + return t.NewViaMake("bzip2", version, pkg.NewHTTPGetTar( nil, "https://sourceware.org/pub/bzip2/bzip2-"+version+".tar.gz", mustDecode(checksum), pkg.TarGzip, - ))) + ), &MakeAttr{ + Writable: true, + SkipConfigure: true, + SkipCheck: true, + InPlace: true, + + ScriptEarly: "cd /usr/src/bzip2", + Make: []string{ + "CC=cc", + }, + ScriptInstall: "make PREFIX=/work/system install", + }) } func init() { artifactsF[Bzip2] = Toolchain.newBzip2 } diff --git a/internal/rosa/cmake.go b/internal/rosa/cmake.go index 8d7129a..986f84d 100644 --- a/internal/rosa/cmake.go +++ b/internal/rosa/cmake.go @@ -13,19 +13,7 @@ func (t Toolchain) newCMake() pkg.Artifact { version = "4.2.1" checksum = "Y3OdbMsob6Xk2y1DCME6z4Fryb5_TkFD7knRT8dTNIRtSqbiCJyyDN9AxggN_I75" ) - return t.New("cmake-"+version, 0, []pkg.Artifact{ - t.Load(Make), - t.Load(KernelHeaders), - }, nil, nil, ` -cd "$(mktemp -d)" -/usr/src/cmake/bootstrap \ - --prefix=/system \ - --parallel="$(nproc)" \ - -- \ - -DCMAKE_USE_OPENSSL=OFF -make "-j$(nproc)" -make DESTDIR=/work install -`, pkg.Path(AbsUsrSrc.Append("cmake"), true, t.NewPatchedSource( + return t.NewViaMake("cmake", version, t.NewPatchedSource( // expected to be writable in the copy made during bootstrap "cmake", version, pkg.NewHTTPGetTar( nil, "https://github.com/Kitware/CMake/releases/download/"+ @@ -33,7 +21,21 @@ make DESTDIR=/work install mustDecode(checksum), pkg.TarGzip, ), false, - ))) + ), &MakeAttr{ + OmitDefaults: true, + + SkipConfigure: true, + ScriptConfigured: ` +/usr/src/cmake/bootstrap \ + --prefix=/system \ + --parallel="$(nproc)" \ + -- \ + -DCMAKE_USE_OPENSSL=OFF +`, + SkipCheck: true, + }, + t.Load(KernelHeaders), + ) } func init() { artifactsF[CMake] = Toolchain.newCMake } diff --git a/internal/rosa/libucontext.go b/internal/rosa/libucontext.go index 0dccbf6..838c2e4 100644 --- a/internal/rosa/libucontext.go +++ b/internal/rosa/libucontext.go @@ -7,34 +7,24 @@ func (t Toolchain) newLibucontext() pkg.Artifact { version = "1.5" checksum = "Ggk7FMmDNBdCx1Z9PcNWWW6LSpjGYssn2vU0GK5BLXJYw7ZxZbA2m_eSgT9TFnIG" ) - return t.New("libucontext", 0, []pkg.Artifact{ - t.Load(Make), - }, nil, []string{ - "ARCH=" + linuxArch(), - }, ` -cd /usr/src/libucontext -make check -make DESTDIR=/work install -`, pkg.Path(AbsUsrSrc.Append("libucontext"), true, - t.NewPatchedSource("libucontext", version, pkg.NewHTTPGetTar( + return t.NewViaMake("libucontext", version, t.NewPatchedSource( + "libucontext", version, pkg.NewHTTPGetTar( nil, "https://github.com/kaniini/libucontext/archive/refs/tags/"+ "libucontext-"+version+".tar.gz", mustDecode(checksum), pkg.TarGzip, - ), true, [2]string{"rosa-prefix", `diff --git a/Makefile b/Makefile -index c80e574..4a8c1d3 100644 ---- a/Makefile -+++ b/Makefile -@@ -17,7 +17,7 @@ ifeq ($(ARCH),$(filter $(ARCH),arm64)) - override ARCH = aarch64 - endif + ), false, + ), &MakeAttr{ + Writable: true, + OmitDefaults: true, + SkipConfigure: true, + InPlace: true, --prefix = /usr -+prefix = /system - libdir = ${prefix}/lib - shared_libdir = ${libdir} - static_libdir = ${libdir} -`}), - )) + ScriptEarly: "cd /usr/src/libucontext", + Make: []string{ + "ARCH=" + linuxArch(), + }, + ScriptInstall: "make prefix=/system DESTDIR=/work install", + }) } func init() { artifactsF[Libucontext] = Toolchain.newLibucontext } diff --git a/internal/rosa/make.go b/internal/rosa/make.go index f330a0a..63f6541 100644 --- a/internal/rosa/make.go +++ b/internal/rosa/make.go @@ -51,6 +51,8 @@ type MakeAttr struct { // Remain in working directory set up during ScriptEarly. InPlace bool + // Whether to skip running the configure script. + SkipConfigure bool // Flags passed to the configure script. Configure [][2]string // Extra make targets. @@ -61,10 +63,14 @@ type MakeAttr struct { SkipCheck bool // Name of the check target, zero value is equivalent to "check". CheckName string + // Replaces the default install command. + ScriptInstall string // Suffix appended to the source pathname. SourceSuffix string + // Passed through to [Toolchain.New], before source. + Paths []pkg.ExecPath // Passed through to [Toolchain.New]. Flag int } @@ -87,34 +93,39 @@ func (t Toolchain) NewViaMake( build = attr.Build } - var configureFlags string - if len(attr.Configure) > 0 { - const sep = " \\\n\t" - configureFlags += sep + strings.Join( - slices.Collect(func(yield func(string) bool) { - for _, v := range attr.Configure { - s := v[0] - if v[1] == "" || (v[0] != "" && - v[0][0] >= 'a' && - v[0][0] <= 'z') { - s = "--" + s - } - if v[1] != "" { - s += "=" + v[1] - } - if !yield(s) { - return - } - } - }), - sep, - ) - } + var configure string + if !attr.SkipConfigure { + configure += ` +/usr/src/` + name + `/configure \ + --prefix=/system` - var buildFlag string - if attr.Build != `""` { - buildFlag = ` \ + if attr.Build != `""` { + configure += ` \ --build=` + build + } + + if len(attr.Configure) > 0 { + const sep = " \\\n\t" + configure += sep + strings.Join( + slices.Collect(func(yield func(string) bool) { + for _, v := range attr.Configure { + s := v[0] + if v[1] == "" || (v[0] != "" && + v[0][0] >= 'a' && + v[0][0] <= 'z') { + s = "--" + s + } + if v[1] != "" { + s += "=" + v[1] + } + if !yield(s) { + return + } + } + }), + sep, + ) + } } makeTargets := make([]string, 1, 2+len(attr.Make)) @@ -148,15 +159,20 @@ func (t Toolchain) NewViaMake( panic("cannot remain in root") } + scriptInstall := attr.ScriptInstall + if scriptInstall == "" { + scriptInstall = "make DESTDIR=/work install" + } + scriptInstall += "\n" + return t.New(name+"-"+version, attr.Flag, stage0Concat(t, attr.NonStage0, finalExtra..., - ), nil, attr.Env, scriptEarly+` -/usr/src/`+name+`/configure \ - --prefix=/system`+buildFlag+configureFlags+attr.ScriptConfigured+` + ), nil, attr.Env, scriptEarly+configure+attr.ScriptConfigured+` make "-j$(nproc)"`+strings.Join(makeTargets, " ")+` -make DESTDIR=/work install -`+attr.Script, pkg.Path(AbsUsrSrc.Append( - name+attr.SourceSuffix, - ), attr.Writable, source)) +`+scriptInstall+attr.Script, slices.Concat(attr.Paths, []pkg.ExecPath{ + pkg.Path(AbsUsrSrc.Append( + name+attr.SourceSuffix, + ), attr.Writable, source), + })...) } diff --git a/internal/rosa/openssl.go b/internal/rosa/openssl.go index 783a2f0..c218e8a 100644 --- a/internal/rosa/openssl.go +++ b/internal/rosa/openssl.go @@ -7,30 +7,33 @@ func (t Toolchain) newOpenSSL() pkg.Artifact { version = "3.5.5" checksum = "I2Hp1LxcTR8j4G6LFEQMVy6EJH-Na1byI9Ti-ThBot6EMLNRnjGXGq-WXrim3Fkz" ) - return t.New("openssl-"+version, 0, []pkg.Artifact{ - t.Load(Perl), - t.Load(Make), - - t.Load(Zlib), - t.Load(KernelHeaders), - }, nil, []string{ - "CC=cc", - }, ` -cd "$(mktemp -d)" -/usr/src/openssl/Configure \ - --prefix=/system \ - --libdir=lib \ - --openssldir=etc/ssl -make \ - "-j$(nproc)" \ - HARNESS_JOBS=256 \ - test -make DESTDIR=/work install -`, pkg.Path(AbsUsrSrc.Append("openssl"), false, pkg.NewHTTPGetTar( + return t.NewViaMake("openssl", version, pkg.NewHTTPGetTar( nil, "https://github.com/openssl/openssl/releases/download/"+ "openssl-"+version+"/openssl-"+version+".tar.gz", mustDecode(checksum), pkg.TarGzip, - ))) + ), &MakeAttr{ + OmitDefaults: true, + SkipConfigure: true, + + Env: []string{ + "CC=cc", + }, + ScriptConfigured: ` +/usr/src/openssl/Configure \ + --prefix=/system \ + --libdir=lib \ + --openssldir=etc/ssl +`, + CheckName: "test", + Make: []string{ + "HARNESS_JOBS=256", + }, + }, + t.Load(Perl), + + t.Load(Zlib), + t.Load(KernelHeaders), + ) } func init() { artifactsF[OpenSSL] = Toolchain.newOpenSSL } diff --git a/internal/rosa/ssl.go b/internal/rosa/ssl.go index 997411c..28b0197 100644 --- a/internal/rosa/ssl.go +++ b/internal/rosa/ssl.go @@ -12,45 +12,57 @@ func (t Toolchain) newNSS() pkg.Artifact { version0 = "4_38_2" checksum0 = "25x2uJeQnOHIiq_zj17b4sYqKgeoU8-IsySUptoPcdHZ52PohFZfGuIisBreWzx0" ) - return t.New("nss-"+version, 0, []pkg.Artifact{ - t.Load(Perl), - t.Load(Python), - t.Load(Unzip), - t.Load(Make), - t.Load(Gawk), - t.Load(Coreutils), - - t.Load(Zlib), - t.Load(KernelHeaders), - }, nil, nil, ` -unzip /usr/src/nspr.zip -d /usr/src -mv '/usr/src/nspr-NSPR_`+version0+`_RTM' /usr/src/nspr -cd /usr/src/nss - -make \ - "-j$(nproc)" \ - CCC="clang++" \ - NSDISTMODE=copy \ - BUILD_OPT=1 \ - USE_64=1 \ - nss_build_all -mkdir -p /work/system/nss -cp -r \ - /usr/src/dist/. \ - lib/ckfw/builtins/certdata.txt \ - /work/system/nss -`, pkg.Path(AbsUsrSrc.Append("nss"), true, t.NewPatchedSource( + return t.NewViaMake("nss", version, t.NewPatchedSource( "nss", version, pkg.NewHTTPGetTar( nil, "https://github.com/nss-dev/nss/archive/refs/tags/"+ "NSS_"+version+"_RTM.tar.gz", mustDecode(checksum), pkg.TarGzip, ), false, - )), pkg.Path(AbsUsrSrc.Append("nspr.zip"), false, pkg.NewHTTPGet( - nil, "https://hg-edge.mozilla.org/projects/nspr/archive/"+ - "NSPR_"+version0+"_RTM.zip", - mustDecode(checksum0), - ))) + ), &MakeAttr{ + 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), + )), + }, + + Writable: true, + OmitDefaults: true, + SkipConfigure: true, + InPlace: true, + + ScriptEarly: ` +unzip /usr/src/nspr.zip -d /usr/src +mv '/usr/src/nspr-NSPR_` + version0 + `_RTM' /usr/src/nspr +cd /usr/src/nss +`, + SkipCheck: true, + Make: []string{ + "CCC=clang++", + "NSDISTMODE=copy", + "BUILD_OPT=1", + "USE_64=1", + "nss_build_all", + }, + ScriptInstall: ` +mkdir -p /work/system/nss +cp -r \ + /usr/src/dist/. \ + lib/ckfw/builtins/certdata.txt \ + /work/system/nss +`, + }, + t.Load(Perl), + t.Load(Python), + t.Load(Unzip), + t.Load(Gawk), + t.Load(Coreutils), + + t.Load(Zlib), + t.Load(KernelHeaders), + ) } func init() { artifactsF[NSS] = Toolchain.newNSS }