diff options
Diffstat (limited to 'internal/rosa/rosa.go')
| -rw-r--r-- | internal/rosa/rosa.go | 100 |
1 files changed, 76 insertions, 24 deletions
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index c1f71cfa..e83d7097 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -268,11 +268,10 @@ function apply { return t.New(name+"-src", Unversioned, nil, &PackageAttr{ Paths: paths, + Tools: P{_patch}, }, &GenericHelper{ Build: buf.String(), - }, - _patch, - ) + }) } // helperInPlace is a special directory value for omitting the cd statement. @@ -338,6 +337,8 @@ type PackageAttr struct { // Whether to create [pkg.KindExecNet] instead of [pkg.KindExec]. HostNet bool + // Inputs added only during cross-compilation. + Cross P // Native utilities used by the build process. Tools P // Unregistered extras. @@ -419,9 +420,16 @@ func (t Toolchain) New( root := make([]pkg.Artifact, 0, 1<<3+ len(attr.Extra)+ len(attr.Tools)+ + len(attr.Cross)+ len(inputs)) root = append(root, attr.Extra...) + cross := t.cross() + var rootCross []pkg.Artifact + if cross { + rootCross = make([]pkg.Artifact, 0, len(inputs)+len(attr.Cross)) + } + const lcMessages = "LC_MESSAGES=C.UTF-8" srn := rn env := slices.Clone(attr.Env) @@ -490,24 +498,51 @@ func (t Toolchain) New( wantsChmod, wantsWrite := helper.wantsChmod(), helper.wantsWrite() { + native := t.native() pv := paGet() + spv := pv + if cross { + spv = paGet() + } for _, p := range helper.tools() { - root = t.appendHandle(root, pv, p) + root = native.appendHandle(root, pv, p) } - for _, p := range helper.inputs() { - root = t.appendHandle(root, pv, p) + + if !cross { + for _, p := range helper.inputs() { + root = t.appendHandle(root, spv, p) + } + } else { + for _, p := range helper.inputs() { + rootCross = t.appendHandle(rootCross, spv, p) + } } + for _, p := range attr.Tools { - root = t.appendHandle(root, pv, p) + root = native.appendHandle(root, pv, p) } - for _, p := range inputs { - root = t.appendHandle(root, pv, p) + + if !cross { + for _, p := range inputs { + root = t.appendHandle(root, spv, p) + } + } else { + for _, p := range inputs { + rootCross = t.appendHandle(rootCross, spv, p) + } + for _, p := range attr.Cross { + rootCross = t.appendHandle(rootCross, spv, p) + } } - boot := t.S.New(t.stage - 1) + + boot := native.S.New(t.stage - 1) for _, p := range extraBoot { root = boot.appendHandle(root, pv, p) } paPut(pv) + if cross { + paPut(spv) + } } if t.stage == stageGentoo { @@ -569,37 +604,51 @@ ln -s ../bin /usr/` scriptEarly += " /bin/)\n" } + arch := t.Arch() + sys := []pkg.ExecPath{pkg.Path( + fhs.AbsRoot, true, + root..., + ), pkg.Path( + absCureScript, false, + pkg.NewFile(scriptName, []byte( + "#!/system/bin/sh\n"+ + "set -eu -o pipefail\n"+ + scriptEarly+helper.script(t, name), + )), + )} + if cross { + var _arch string + _arch, arch = arch, t.S.native.Arch() + if len(rootCross) > 0 { + sys = append(sys, pkg.Path( + AbsSystem.Append(_arch), true, + rootCross..., + )) + } + srn += "-cross-" + _arch + } + return pkg.NewExec( - srn, t.arch, attr.KnownChecksum, pkg.ExecTimeoutMax, + srn, arch, attr.KnownChecksum, pkg.ExecTimeoutMax, attr.HostNet, attr.Exclusive, fhs.AbsRoot, env, absCureScript, nil, - slices.Concat([]pkg.ExecPath{pkg.Path( - fhs.AbsRoot, true, - root..., - ), pkg.Path( - absCureScript, false, - pkg.NewFile(scriptName, []byte( - "#!/system/bin/sh\n"+ - "set -eu -o pipefail\n"+ - scriptEarly+helper.script(t, name), - )), - )}, paths)..., + slices.Concat(sys, paths)..., ) } // GenericHelper directly passes build script segments for invocations of // one-off build scripts too specific to fit into any other [Helper] -// implementation, but can still benefit from [Toolchain.NewPackage]. +// implementation, but can still benefit from [Toolchain.New]. type GenericHelper struct { // Remain in current directory. InPlace bool // Concatenated for [Toolchain]. - Build, Check, Install string + Cross, Build, Check, Install string } var _ Helper = new(GenericHelper) @@ -634,6 +683,9 @@ func (attr *GenericHelper) script(t Toolchain, _ string) string { } script := attr.Build + if t.cross() { + script = attr.Cross + script + } if t.opts&OptSkipCheck == 0 { script += attr.Check } |
