aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/perl.go
blob: 6482d8dd99b219d5e0b8c1e782ca4984984c8026 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package rosa

import (
	"slices"

	"hakurei.app/internal/pkg"
)

// Perl is the perl interpreter used by [MakeMakerHelper].
var Perl = H("perl")

func init() {
	const (
		version  = "0.4234"
		checksum = "ZKxEFG4hE1rqZt52zBL2LRZBMkYzhjb5-cTBXcsyA52EbPeeYyVxU176yAea8-Di"
	)
	meta := Metadata{
		Name:        "perl-Module::Build",
		Description: "build and install Perl modules",
		Website:     "https://metacpan.org/release/Module-Build",
		Version:     version,

		Dependencies: P{
			Perl,
		},
	}
	native.MustRegister(meta.Name, func(t Toolchain) (*Metadata, pkg.Artifact) {
		return &meta, t.New(meta.Name, 0, t.Append(nil,
			Perl,
		), nil, nil, `
cd /usr/src/Module-Build
perl Build.PL --prefix=/system
./Build build
./Build test
./Build install --destdir=/work
`, pkg.Path(AbsUsrSrc.Append("Module-Build"), true, t.NewPatchedSource(
			meta.Name, version, newFromCPAN(
				"LEONT",
				"Module-Build",
				version,
				checksum,
			), false,
		)))
	})
}

// MakeMakerHelper is the [Perl] MakeMaker helper.
type MakeMakerHelper struct {
	// Whether to skip the check target.
	SkipCheck bool
}

// extra returns perl.
func (*MakeMakerHelper) extra(int) P { return P{Perl, Make} }

// wantsChmod returns true.
func (*MakeMakerHelper) wantsChmod() bool { return true }

// wantsWrite returns true.
func (*MakeMakerHelper) wantsWrite() bool { return true }

// scriptEarly is a noop.
func (*MakeMakerHelper) scriptEarly() string { return "" }

// createDir returns false.
func (*MakeMakerHelper) createDir() bool { return false }

// wantsDir returns the zero value.
func (*MakeMakerHelper) wantsDir() string { return "" }

// script generates Makefile.PL-based build and test commands.
func (attr *MakeMakerHelper) script(t Toolchain, _ string) string {
	if attr == nil {
		attr = new(MakeMakerHelper)
	}

	script := `perl Makefile.PL \
	PREFIX=/system
make \
	` + jobsFlagE
	if !attr.SkipCheck && t.opts&OptSkipCheck == 0 {
		script += `
make \
	` + jobsFlagE + ` \
	test
`
	}
	script += "make DESTDIR=/work install\n"
	return script
}

// newViaPerlMakeMaker installs a perl module via Makefile.PL.
func (t Toolchain) newViaPerlMakeMaker(
	name, version string,
	source pkg.Artifact,
	patches []KV,
	extra ...ArtifactH,
) pkg.Artifact {
	return t.NewPackage("perl-"+name, version, source, &PackageAttr{
		Patches: patches,
	}, (*MakeMakerHelper)(nil), slices.Concat(extra, P{
		Perl,
	})...)
}