line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Perl::Dist::APPerl; |
2
|
|
|
|
|
|
|
# Copyright (c) 2022 Gavin Hayes, see LICENSE in the root of the project |
3
|
1
|
|
|
1
|
|
1245
|
use version 0.77; our $VERSION = qv(v0.2.0); |
|
1
|
|
|
|
|
2054
|
|
|
1
|
|
|
|
|
8
|
|
4
|
1
|
|
|
1
|
|
99
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
20
|
|
5
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
30
|
|
6
|
1
|
|
|
1
|
|
759
|
use JSON::PP 2.0104 qw(decode_json); |
|
1
|
|
|
|
|
17546
|
|
|
1
|
|
|
|
|
83
|
|
7
|
1
|
|
|
1
|
|
9
|
use File::Path 2.07 qw(make_path remove_tree); |
|
1
|
|
|
|
|
21
|
|
|
1
|
|
|
|
|
92
|
|
8
|
1
|
|
|
1
|
|
7
|
use Cwd qw(abs_path getcwd); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
57
|
|
9
|
1
|
|
|
1
|
|
627
|
use Data::Dumper qw(Dumper); |
|
1
|
|
|
|
|
6512
|
|
|
1
|
|
|
|
|
74
|
|
10
|
1
|
|
|
1
|
|
9
|
use File::Basename qw(basename dirname); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
121
|
|
11
|
1
|
|
|
1
|
|
563
|
use File::Copy qw(copy move cp); |
|
1
|
|
|
|
|
2421
|
|
|
1
|
|
|
|
|
67
|
|
12
|
1
|
|
|
1
|
|
1074
|
use Env qw(@PATH); |
|
1
|
|
|
|
|
4456
|
|
|
1
|
|
|
|
|
7
|
|
13
|
1
|
|
|
1
|
|
719
|
use FindBin qw(); |
|
1
|
|
|
|
|
1060
|
|
|
1
|
|
|
|
|
28
|
|
14
|
1
|
|
|
1
|
|
718
|
use Getopt::Long qw(GetOptionsFromArray); |
|
1
|
|
|
|
|
12479
|
|
|
1
|
|
|
|
|
3
|
|
15
|
|
|
|
|
|
|
Getopt::Long::Configure qw(gnu_getopt); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
use constant { |
18
|
1
|
|
|
|
|
85
|
START_WD => getcwd(), |
19
|
|
|
|
|
|
|
PROJECT_FILE => 'apperl-project.json', |
20
|
1
|
|
|
1
|
|
209
|
}; |
|
1
|
|
|
|
|
2
|
|
21
|
|
|
|
|
|
|
use constant { |
22
|
1
|
|
|
|
|
165
|
PROJECT_TMP_DIR => (START_WD.'/.apperl'), |
23
|
1
|
|
|
1
|
|
10
|
}; |
|
1
|
|
|
|
|
2
|
|
24
|
|
|
|
|
|
|
use constant { |
25
|
|
|
|
|
|
|
# DEFDATAROOT is used if the XDG base directories cannot be found |
26
|
|
|
|
|
|
|
DEFDATAROOT => defined($ENV{HOME}) ? $ENV{HOME} |
27
|
1
|
0
|
|
|
|
93
|
: defined($ENV{APPDATA}) ? $ENV{APPDATA} .'/apperl' |
|
|
50
|
|
|
|
|
|
28
|
|
|
|
|
|
|
: PROJECT_TMP_DIR.'/site', |
29
|
|
|
|
|
|
|
PROJECT_TMP_CONFIG_FILE => (PROJECT_TMP_DIR.'/user-project.json'), |
30
|
1
|
|
|
1
|
|
7
|
}; |
|
1
|
|
|
|
|
2
|
|
31
|
|
|
|
|
|
|
use constant { |
32
|
|
|
|
|
|
|
SITE_CONFIG_DIR => ($ENV{XDG_CONFIG_HOME} // (DEFDATAROOT.'/.config')) . '/apperl', |
33
|
1
|
|
50
|
|
|
68
|
SITE_REPO_DIR => ($ENV{XDG_DATA_HOME} // (DEFDATAROOT.'/.local/share')).'/apperl', |
|
|
|
50
|
|
|
|
|
34
|
1
|
|
|
1
|
|
6
|
}; |
|
1
|
|
|
|
|
2
|
|
35
|
|
|
|
|
|
|
use constant { |
36
|
1
|
|
|
|
|
2500
|
SITE_CONFIG_FILE => (SITE_CONFIG_DIR."/site.json"), |
37
|
1
|
|
|
1
|
|
5
|
}; |
|
1
|
|
|
|
|
2
|
|
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
sub _load_apperl_configs { |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
# https://packages.debian.org/experimental/amd64/perl-base/filelist with tweaks |
42
|
0
|
|
|
0
|
|
|
my @smallmanifest = ( |
43
|
|
|
|
|
|
|
'__perllib__/AutoLoader.pm', |
44
|
|
|
|
|
|
|
'__perllib__/Carp.pm', |
45
|
|
|
|
|
|
|
'__perllib__/Carp/Heavy.pm', |
46
|
|
|
|
|
|
|
'__perlarchlib__/Config.pm', |
47
|
|
|
|
|
|
|
'__perlarchlib__/Config_git.pl', |
48
|
|
|
|
|
|
|
'__perlarchlib__/Config_heavy.pl', |
49
|
|
|
|
|
|
|
'__perlarchlib__/Cwd.pm', |
50
|
|
|
|
|
|
|
'__perlarchlib__/DynaLoader.pm', |
51
|
|
|
|
|
|
|
'__perlarchlib__/Errno.pm', |
52
|
|
|
|
|
|
|
'__perllib__/Exporter.pm', |
53
|
|
|
|
|
|
|
'__perllib__/Exporter/Heavy.pm', |
54
|
|
|
|
|
|
|
'__perlarchlib__/Fcntl.pm', |
55
|
|
|
|
|
|
|
'__perllib__/File/Basename.pm', |
56
|
|
|
|
|
|
|
'__perlarchlib__/File/Glob.pm', |
57
|
|
|
|
|
|
|
'__perllib__/File/Path.pm', |
58
|
|
|
|
|
|
|
'__perlarchlib__/File/Spec.pm', |
59
|
|
|
|
|
|
|
'__perlarchlib__/File/Spec/Unix.pm', |
60
|
|
|
|
|
|
|
'__perllib__/File/Temp.pm', |
61
|
|
|
|
|
|
|
'__perllib__/FileHandle.pm', |
62
|
|
|
|
|
|
|
'__perllib__/Getopt/Long.pm', |
63
|
|
|
|
|
|
|
'__perlarchlib__/Hash/Util.pm', |
64
|
|
|
|
|
|
|
'__perlarchlib__/IO.pm', |
65
|
|
|
|
|
|
|
'__perlarchlib__/IO/File.pm', |
66
|
|
|
|
|
|
|
'__perlarchlib__/IO/Handle.pm', |
67
|
|
|
|
|
|
|
'__perlarchlib__/IO/Pipe.pm', |
68
|
|
|
|
|
|
|
'__perlarchlib__/IO/Seekable.pm', |
69
|
|
|
|
|
|
|
'__perlarchlib__/IO/Select.pm', |
70
|
|
|
|
|
|
|
'__perlarchlib__/IO/Socket.pm', |
71
|
|
|
|
|
|
|
'__perlarchlib__/IO/Socket/INET.pm', |
72
|
|
|
|
|
|
|
'__perllib__/IO/Socket/IP.pm', |
73
|
|
|
|
|
|
|
'__perlarchlib__/IO/Socket/UNIX.pm', |
74
|
|
|
|
|
|
|
'__perllib__/IPC/Open2.pm', |
75
|
|
|
|
|
|
|
'__perllib__/IPC/Open3.pm', |
76
|
|
|
|
|
|
|
'__perlarchlib__/List/Util.pm', |
77
|
|
|
|
|
|
|
'__perlarchlib__/POSIX.pm', |
78
|
|
|
|
|
|
|
'__perlarchlib__/Scalar/Util.pm', |
79
|
|
|
|
|
|
|
'__perllib__/SelectSaver.pm', |
80
|
|
|
|
|
|
|
'__perlarchlib__/Socket.pm', |
81
|
|
|
|
|
|
|
'__perllib__/Symbol.pm', |
82
|
|
|
|
|
|
|
'__perllib__/Text/ParseWords.pm', |
83
|
|
|
|
|
|
|
'__perllib__/Text/Tabs.pm', |
84
|
|
|
|
|
|
|
'__perllib__/Text/Wrap.pm', |
85
|
|
|
|
|
|
|
'__perllib__/Tie/Hash.pm', |
86
|
|
|
|
|
|
|
'__perllib__/XSLoader.pm', |
87
|
|
|
|
|
|
|
'__perlarchlib__/attributes.pm', |
88
|
|
|
|
|
|
|
'__perllib__/base.pm', |
89
|
|
|
|
|
|
|
'__perllib__/builtin.pm', |
90
|
|
|
|
|
|
|
'__perllib__/bytes.pm', |
91
|
|
|
|
|
|
|
'__perllib__/bytes_heavy.pl', |
92
|
|
|
|
|
|
|
'__perllib__/constant.pm', |
93
|
|
|
|
|
|
|
'__perllib__/feature.pm', |
94
|
|
|
|
|
|
|
'__perllib__/fields.pm', |
95
|
|
|
|
|
|
|
'__perllib__/integer.pm', |
96
|
|
|
|
|
|
|
'__perlarchlib__/lib.pm', |
97
|
|
|
|
|
|
|
'__perllib__/locale.pm', |
98
|
|
|
|
|
|
|
'__perllib__/overload.pm', |
99
|
|
|
|
|
|
|
'__perllib__/overloading.pm', |
100
|
|
|
|
|
|
|
'__perllib__/parent.pm', |
101
|
|
|
|
|
|
|
'__perlarchlib__/re.pm', |
102
|
|
|
|
|
|
|
'__perllib__/strict.pm', |
103
|
|
|
|
|
|
|
'__perllib__/unicore/To/Age.pl', |
104
|
|
|
|
|
|
|
'__perllib__/unicore/To/Bc.pl', |
105
|
|
|
|
|
|
|
'__perllib__/unicore/To/Bmg.pl', |
106
|
|
|
|
|
|
|
'__perllib__/unicore/To/Bpb.pl', |
107
|
|
|
|
|
|
|
'__perllib__/unicore/To/Bpt.pl', |
108
|
|
|
|
|
|
|
'__perllib__/unicore/To/Cf.pl', |
109
|
|
|
|
|
|
|
'__perllib__/unicore/To/Ea.pl', |
110
|
|
|
|
|
|
|
'__perllib__/unicore/To/EqUIdeo.pl', |
111
|
|
|
|
|
|
|
'__perllib__/unicore/To/GCB.pl', |
112
|
|
|
|
|
|
|
'__perllib__/unicore/To/Gc.pl', |
113
|
|
|
|
|
|
|
'__perllib__/unicore/To/Hst.pl', |
114
|
|
|
|
|
|
|
'__perllib__/unicore/To/Identif2.pl', |
115
|
|
|
|
|
|
|
'__perllib__/unicore/To/Identifi.pl', |
116
|
|
|
|
|
|
|
'__perllib__/unicore/To/InPC.pl', |
117
|
|
|
|
|
|
|
'__perllib__/unicore/To/InSC.pl', |
118
|
|
|
|
|
|
|
'__perllib__/unicore/To/Isc.pl', |
119
|
|
|
|
|
|
|
'__perllib__/unicore/To/Jg.pl', |
120
|
|
|
|
|
|
|
'__perllib__/unicore/To/Jt.pl', |
121
|
|
|
|
|
|
|
'__perllib__/unicore/To/Lb.pl', |
122
|
|
|
|
|
|
|
'__perllib__/unicore/To/Lc.pl', |
123
|
|
|
|
|
|
|
'__perllib__/unicore/To/NFCQC.pl', |
124
|
|
|
|
|
|
|
'__perllib__/unicore/To/NFDQC.pl', |
125
|
|
|
|
|
|
|
'__perllib__/unicore/To/NFKCCF.pl', |
126
|
|
|
|
|
|
|
'__perllib__/unicore/To/NFKCQC.pl', |
127
|
|
|
|
|
|
|
'__perllib__/unicore/To/NFKDQC.pl', |
128
|
|
|
|
|
|
|
'__perllib__/unicore/To/Na1.pl', |
129
|
|
|
|
|
|
|
'__perllib__/unicore/To/NameAlia.pl', |
130
|
|
|
|
|
|
|
'__perllib__/unicore/To/Nt.pl', |
131
|
|
|
|
|
|
|
'__perllib__/unicore/To/Nv.pl', |
132
|
|
|
|
|
|
|
'__perllib__/unicore/To/PerlDeci.pl', |
133
|
|
|
|
|
|
|
'__perllib__/unicore/To/SB.pl', |
134
|
|
|
|
|
|
|
'__perllib__/unicore/To/Sc.pl', |
135
|
|
|
|
|
|
|
'__perllib__/unicore/To/Scx.pl', |
136
|
|
|
|
|
|
|
'__perllib__/unicore/To/Tc.pl', |
137
|
|
|
|
|
|
|
'__perllib__/unicore/To/Uc.pl', |
138
|
|
|
|
|
|
|
'__perllib__/unicore/To/Vo.pl', |
139
|
|
|
|
|
|
|
'__perllib__/unicore/To/WB.pl', |
140
|
|
|
|
|
|
|
'__perllib__/unicore/To/_PerlLB.pl', |
141
|
|
|
|
|
|
|
'__perllib__/unicore/To/_PerlSCX.pl', |
142
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/NA.pl', |
143
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V100.pl', |
144
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V11.pl', |
145
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V110.pl', |
146
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V120.pl', |
147
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V130.pl', |
148
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V140.pl', |
149
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V20.pl', |
150
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V30.pl', |
151
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V31.pl', |
152
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V32.pl', |
153
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V40.pl', |
154
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V41.pl', |
155
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V50.pl', |
156
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V51.pl', |
157
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V52.pl', |
158
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V60.pl', |
159
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V61.pl', |
160
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V70.pl', |
161
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V80.pl', |
162
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Age/V90.pl', |
163
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Alpha/Y.pl', |
164
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/AL.pl', |
165
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/AN.pl', |
166
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/B.pl', |
167
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/BN.pl', |
168
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/CS.pl', |
169
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/EN.pl', |
170
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/ES.pl', |
171
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/ET.pl', |
172
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/L.pl', |
173
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/NSM.pl', |
174
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/ON.pl', |
175
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/R.pl', |
176
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bc/WS.pl', |
177
|
|
|
|
|
|
|
'__perllib__/unicore/lib/BidiC/Y.pl', |
178
|
|
|
|
|
|
|
'__perllib__/unicore/lib/BidiM/Y.pl', |
179
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Blk/NB.pl', |
180
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bpt/C.pl', |
181
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bpt/N.pl', |
182
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Bpt/O.pl', |
183
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CE/Y.pl', |
184
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CI/Y.pl', |
185
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWCF/Y.pl', |
186
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWCM/Y.pl', |
187
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWKCF/Y.pl', |
188
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWL/Y.pl', |
189
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWT/Y.pl', |
190
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CWU/Y.pl', |
191
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Cased/Y.pl', |
192
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/A.pl', |
193
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/AL.pl', |
194
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/AR.pl', |
195
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/ATAR.pl', |
196
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/B.pl', |
197
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/BR.pl', |
198
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/DB.pl', |
199
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/NK.pl', |
200
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/NR.pl', |
201
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/OV.pl', |
202
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ccc/VR.pl', |
203
|
|
|
|
|
|
|
'__perllib__/unicore/lib/CompEx/Y.pl', |
204
|
|
|
|
|
|
|
'__perllib__/unicore/lib/DI/Y.pl', |
205
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dash/Y.pl', |
206
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dep/Y.pl', |
207
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dia/Y.pl', |
208
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Com.pl', |
209
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Enc.pl', |
210
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Fin.pl', |
211
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Font.pl', |
212
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Init.pl', |
213
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Iso.pl', |
214
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Med.pl', |
215
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Nar.pl', |
216
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Nb.pl', |
217
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/NonCanon.pl', |
218
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Sqr.pl', |
219
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Sub.pl', |
220
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Sup.pl', |
221
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Dt/Vert.pl', |
222
|
|
|
|
|
|
|
'__perllib__/unicore/lib/EBase/Y.pl', |
223
|
|
|
|
|
|
|
'__perllib__/unicore/lib/EComp/Y.pl', |
224
|
|
|
|
|
|
|
'__perllib__/unicore/lib/EPres/Y.pl', |
225
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ea/A.pl', |
226
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ea/H.pl', |
227
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ea/N.pl', |
228
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ea/Na.pl', |
229
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ea/W.pl', |
230
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Emoji/Y.pl', |
231
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ext/Y.pl', |
232
|
|
|
|
|
|
|
'__perllib__/unicore/lib/ExtPict/Y.pl', |
233
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/CN.pl', |
234
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/EX.pl', |
235
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/LV.pl', |
236
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/LVT.pl', |
237
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/PP.pl', |
238
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/SM.pl', |
239
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GCB/XX.pl', |
240
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/C.pl', |
241
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Cf.pl', |
242
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Cn.pl', |
243
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/L.pl', |
244
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/LC.pl', |
245
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Ll.pl', |
246
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Lm.pl', |
247
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Lo.pl', |
248
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Lu.pl', |
249
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/M.pl', |
250
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Mc.pl', |
251
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Me.pl', |
252
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Mn.pl', |
253
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/N.pl', |
254
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Nd.pl', |
255
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Nl.pl', |
256
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/No.pl', |
257
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/P.pl', |
258
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Pc.pl', |
259
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Pd.pl', |
260
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Pe.pl', |
261
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Pf.pl', |
262
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Pi.pl', |
263
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Po.pl', |
264
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Ps.pl', |
265
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/S.pl', |
266
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Sc.pl', |
267
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Sk.pl', |
268
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Sm.pl', |
269
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/So.pl', |
270
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Z.pl', |
271
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Gc/Zs.pl', |
272
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GrBase/Y.pl', |
273
|
|
|
|
|
|
|
'__perllib__/unicore/lib/GrExt/Y.pl', |
274
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Hex/Y.pl', |
275
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Hst/NA.pl', |
276
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Hyphen/T.pl', |
277
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IDC/Y.pl', |
278
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IDS/Y.pl', |
279
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdStatus/Allowed.pl', |
280
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdStatus/Restrict.pl', |
281
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/DefaultI.pl', |
282
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Exclusio.pl', |
283
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Inclusio.pl', |
284
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/LimitedU.pl', |
285
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/NotChara.pl', |
286
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/NotNFKC.pl', |
287
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/NotXID.pl', |
288
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Obsolete.pl', |
289
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Recommen.pl', |
290
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Technica.pl', |
291
|
|
|
|
|
|
|
'__perllib__/unicore/lib/IdType/Uncommon.pl', |
292
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Ideo/Y.pl', |
293
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/10_0.pl', |
294
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/11_0.pl', |
295
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/12_0.pl', |
296
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/12_1.pl', |
297
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/13_0.pl', |
298
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/14_0.pl', |
299
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/2_0.pl', |
300
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/2_1.pl', |
301
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/3_0.pl', |
302
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/3_1.pl', |
303
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/3_2.pl', |
304
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/4_0.pl', |
305
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/4_1.pl', |
306
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/5_0.pl', |
307
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/5_1.pl', |
308
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/5_2.pl', |
309
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/6_0.pl', |
310
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/6_1.pl', |
311
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/6_2.pl', |
312
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/6_3.pl', |
313
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/7_0.pl', |
314
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/8_0.pl', |
315
|
|
|
|
|
|
|
'__perllib__/unicore/lib/In/9_0.pl', |
316
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/Bottom.pl', |
317
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/BottomAn.pl', |
318
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/Left.pl', |
319
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/LeftAndR.pl', |
320
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/NA.pl', |
321
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/Overstru.pl', |
322
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/Right.pl', |
323
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/Top.pl', |
324
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/TopAndBo.pl', |
325
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/TopAndL2.pl', |
326
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/TopAndLe.pl', |
327
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/TopAndRi.pl', |
328
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InPC/VisualOr.pl', |
329
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Avagraha.pl', |
330
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Bindu.pl', |
331
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Cantilla.pl', |
332
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona2.pl', |
333
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona3.pl', |
334
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona4.pl', |
335
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona5.pl', |
336
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona6.pl', |
337
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona7.pl', |
338
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consona8.pl', |
339
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Consonan.pl', |
340
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Invisibl.pl', |
341
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Nukta.pl', |
342
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Number.pl', |
343
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Other.pl', |
344
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/PureKill.pl', |
345
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Syllable.pl', |
346
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/ToneMark.pl', |
347
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Virama.pl', |
348
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Visarga.pl', |
349
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/Vowel.pl', |
350
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/VowelDep.pl', |
351
|
|
|
|
|
|
|
'__perllib__/unicore/lib/InSC/VowelInd.pl', |
352
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Ain.pl', |
353
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Alef.pl', |
354
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Beh.pl', |
355
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Dal.pl', |
356
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/FarsiYeh.pl', |
357
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Feh.pl', |
358
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Gaf.pl', |
359
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Hah.pl', |
360
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/HanifiRo.pl', |
361
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Kaf.pl', |
362
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Lam.pl', |
363
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/NoJoinin.pl', |
364
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Noon.pl', |
365
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Qaf.pl', |
366
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Reh.pl', |
367
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Sad.pl', |
368
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Seen.pl', |
369
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Tah.pl', |
370
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Waw.pl', |
371
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jg/Yeh.pl', |
372
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/C.pl', |
373
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/D.pl', |
374
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/L.pl', |
375
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/R.pl', |
376
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/T.pl', |
377
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Jt/U.pl', |
378
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/AI.pl', |
379
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/AL.pl', |
380
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/BA.pl', |
381
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/BB.pl', |
382
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/CJ.pl', |
383
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/CL.pl', |
384
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/CM.pl', |
385
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/EX.pl', |
386
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/GL.pl', |
387
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/ID.pl', |
388
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/IN.pl', |
389
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/IS.pl', |
390
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/NS.pl', |
391
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/NU.pl', |
392
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/OP.pl', |
393
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/PO.pl', |
394
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/PR.pl', |
395
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/QU.pl', |
396
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/SA.pl', |
397
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lb/XX.pl', |
398
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Lower/Y.pl', |
399
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Math/Y.pl', |
400
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFCQC/M.pl', |
401
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFCQC/Y.pl', |
402
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFDQC/N.pl', |
403
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFDQC/Y.pl', |
404
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFKCQC/N.pl', |
405
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFKCQC/Y.pl', |
406
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFKDQC/N.pl', |
407
|
|
|
|
|
|
|
'__perllib__/unicore/lib/NFKDQC/Y.pl', |
408
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nt/Di.pl', |
409
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nt/None.pl', |
410
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nt/Nu.pl', |
411
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/0.pl', |
412
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1.pl', |
413
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/10.pl', |
414
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/100.pl', |
415
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1000.pl', |
416
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/10000.pl', |
417
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/100000.pl', |
418
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/11.pl', |
419
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/12.pl', |
420
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/13.pl', |
421
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/14.pl', |
422
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/15.pl', |
423
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/16.pl', |
424
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/17.pl', |
425
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/18.pl', |
426
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/19.pl', |
427
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_16.pl', |
428
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_2.pl', |
429
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_3.pl', |
430
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_4.pl', |
431
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_6.pl', |
432
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/1_8.pl', |
433
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/2.pl', |
434
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/20.pl', |
435
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/200.pl', |
436
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/2000.pl', |
437
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/20000.pl', |
438
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/2_3.pl', |
439
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/3.pl', |
440
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/30.pl', |
441
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/300.pl', |
442
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/3000.pl', |
443
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/30000.pl', |
444
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/3_16.pl', |
445
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/3_4.pl', |
446
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/4.pl', |
447
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/40.pl', |
448
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/400.pl', |
449
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/4000.pl', |
450
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/40000.pl', |
451
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/5.pl', |
452
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/50.pl', |
453
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/500.pl', |
454
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/5000.pl', |
455
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/50000.pl', |
456
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/6.pl', |
457
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/60.pl', |
458
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/600.pl', |
459
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/6000.pl', |
460
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/60000.pl', |
461
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/7.pl', |
462
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/70.pl', |
463
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/700.pl', |
464
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/7000.pl', |
465
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/70000.pl', |
466
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/8.pl', |
467
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/80.pl', |
468
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/800.pl', |
469
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/8000.pl', |
470
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/80000.pl', |
471
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/9.pl', |
472
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/90.pl', |
473
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/900.pl', |
474
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/9000.pl', |
475
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Nv/90000.pl', |
476
|
|
|
|
|
|
|
'__perllib__/unicore/lib/PCM/Y.pl', |
477
|
|
|
|
|
|
|
'__perllib__/unicore/lib/PatSyn/Y.pl', |
478
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Alnum.pl', |
479
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Assigned.pl', |
480
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Blank.pl', |
481
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Graph.pl', |
482
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/PerlWord.pl', |
483
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/PosixPun.pl', |
484
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Print.pl', |
485
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/SpacePer.pl', |
486
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Title.pl', |
487
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/Word.pl', |
488
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/XPosixPu.pl', |
489
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlAny.pl', |
490
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlCh2.pl', |
491
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlCha.pl', |
492
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlFol.pl', |
493
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlIDC.pl', |
494
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlIDS.pl', |
495
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlIsI.pl', |
496
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlNch.pl', |
497
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlPat.pl', |
498
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlPr2.pl', |
499
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlPro.pl', |
500
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Perl/_PerlQuo.pl', |
501
|
|
|
|
|
|
|
'__perllib__/unicore/lib/QMark/Y.pl', |
502
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/AT.pl', |
503
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/CL.pl', |
504
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/EX.pl', |
505
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/FO.pl', |
506
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/LE.pl', |
507
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/LO.pl', |
508
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/NU.pl', |
509
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/SC.pl', |
510
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/ST.pl', |
511
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/Sp.pl', |
512
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/UP.pl', |
513
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SB/XX.pl', |
514
|
|
|
|
|
|
|
'__perllib__/unicore/lib/SD/Y.pl', |
515
|
|
|
|
|
|
|
'__perllib__/unicore/lib/STerm/Y.pl', |
516
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Arab.pl', |
517
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Beng.pl', |
518
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Cprt.pl', |
519
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Cyrl.pl', |
520
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Deva.pl', |
521
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Dupl.pl', |
522
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Geor.pl', |
523
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Glag.pl', |
524
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Gong.pl', |
525
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Gonm.pl', |
526
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Gran.pl', |
527
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Grek.pl', |
528
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Gujr.pl', |
529
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Guru.pl', |
530
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Han.pl', |
531
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Hang.pl', |
532
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Hira.pl', |
533
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Kana.pl', |
534
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Knda.pl', |
535
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Latn.pl', |
536
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Limb.pl', |
537
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Linb.pl', |
538
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Mlym.pl', |
539
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Mong.pl', |
540
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Mult.pl', |
541
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Orya.pl', |
542
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Sinh.pl', |
543
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Syrc.pl', |
544
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Taml.pl', |
545
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Telu.pl', |
546
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Zinh.pl', |
547
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Sc/Zyyy.pl', |
548
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Adlm.pl', |
549
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Arab.pl', |
550
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Armn.pl', |
551
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Beng.pl', |
552
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Bhks.pl', |
553
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Bopo.pl', |
554
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Cakm.pl', |
555
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Cham.pl', |
556
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Copt.pl', |
557
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Cprt.pl', |
558
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Cyrl.pl', |
559
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Deva.pl', |
560
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Diak.pl', |
561
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Dupl.pl', |
562
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Ethi.pl', |
563
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Geor.pl', |
564
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Glag.pl', |
565
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Gong.pl', |
566
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Gonm.pl', |
567
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Gran.pl', |
568
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Grek.pl', |
569
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Gujr.pl', |
570
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Guru.pl', |
571
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Han.pl', |
572
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Hang.pl', |
573
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Hebr.pl', |
574
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Hira.pl', |
575
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Hmng.pl', |
576
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Hmnp.pl', |
577
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Kana.pl', |
578
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Khar.pl', |
579
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Khmr.pl', |
580
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Khoj.pl', |
581
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Knda.pl', |
582
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Kthi.pl', |
583
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Lana.pl', |
584
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Lao.pl', |
585
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Latn.pl', |
586
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Limb.pl', |
587
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Lina.pl', |
588
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Linb.pl', |
589
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Mlym.pl', |
590
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Mong.pl', |
591
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Mult.pl', |
592
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Mymr.pl', |
593
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Nand.pl', |
594
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Nko.pl', |
595
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Orya.pl', |
596
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Phlp.pl', |
597
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Rohg.pl', |
598
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Shrd.pl', |
599
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Sind.pl', |
600
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Sinh.pl', |
601
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Syrc.pl', |
602
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Tagb.pl', |
603
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Takr.pl', |
604
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Talu.pl', |
605
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Taml.pl', |
606
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Tang.pl', |
607
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Telu.pl', |
608
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Thaa.pl', |
609
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Tibt.pl', |
610
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Tirh.pl', |
611
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Vith.pl', |
612
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Xsux.pl', |
613
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Yezi.pl', |
614
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Yi.pl', |
615
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Zinh.pl', |
616
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Zyyy.pl', |
617
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Scx/Zzzz.pl', |
618
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Term/Y.pl', |
619
|
|
|
|
|
|
|
'__perllib__/unicore/lib/UIdeo/Y.pl', |
620
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Upper/Y.pl', |
621
|
|
|
|
|
|
|
'__perllib__/unicore/lib/VS/Y.pl', |
622
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Vo/R.pl', |
623
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Vo/Tr.pl', |
624
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Vo/Tu.pl', |
625
|
|
|
|
|
|
|
'__perllib__/unicore/lib/Vo/U.pl', |
626
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/EX.pl', |
627
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/Extend.pl', |
628
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/FO.pl', |
629
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/HL.pl', |
630
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/KA.pl', |
631
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/LE.pl', |
632
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/MB.pl', |
633
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/ML.pl', |
634
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/MN.pl', |
635
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/NU.pl', |
636
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/WSegSpac.pl', |
637
|
|
|
|
|
|
|
'__perllib__/unicore/lib/WB/XX.pl', |
638
|
|
|
|
|
|
|
'__perllib__/unicore/lib/XIDC/Y.pl', |
639
|
|
|
|
|
|
|
'__perllib__/unicore/lib/XIDS/Y.pl', |
640
|
|
|
|
|
|
|
'__perllib__/utf8.pm', |
641
|
|
|
|
|
|
|
'__perllib__/vars.pm', |
642
|
|
|
|
|
|
|
'__perllib__/warnings.pm', |
643
|
|
|
|
|
|
|
'__perllib__/warnings/register.pm', |
644
|
|
|
|
|
|
|
); |
645
|
|
|
|
|
|
|
|
646
|
0
|
|
|
|
|
|
my %defconfig = ( |
647
|
|
|
|
|
|
|
cosmo_remotes => { |
648
|
|
|
|
|
|
|
origin => 'https://github.com/G4Vi/cosmopolitan', |
649
|
|
|
|
|
|
|
upstream => 'https://github.com/jart/cosmopolitan', |
650
|
|
|
|
|
|
|
}, |
651
|
|
|
|
|
|
|
perl_remotes => { |
652
|
|
|
|
|
|
|
origin => 'https://github.com/G4Vi/perl5', |
653
|
|
|
|
|
|
|
}, |
654
|
|
|
|
|
|
|
apperl_configs => { |
655
|
|
|
|
|
|
|
'nobuild-v0.1.0' => { |
656
|
|
|
|
|
|
|
desc => 'base nobuild config', |
657
|
|
|
|
|
|
|
dest => 'perl-nobuild.com', |
658
|
|
|
|
|
|
|
MANIFEST => ['lib', 'bin'], |
659
|
|
|
|
|
|
|
zip_extra_files => {}, |
660
|
|
|
|
|
|
|
nobuild_perl_bin => ['src/perl.com', $^X], |
661
|
|
|
|
|
|
|
}, |
662
|
|
|
|
|
|
|
'v5.36.0-full-v0.1.0' => { |
663
|
|
|
|
|
|
|
desc => 'Full perl v5.36.0 built with Cosmopolitan Libc 2.2', |
664
|
|
|
|
|
|
|
perl_id => 'b22da6b83c37604132694ead0bdcf61690f74a53', |
665
|
|
|
|
|
|
|
cosmo_id => '52f1db7220935cfcf2c8e583678f5ccc4b5bbacd', |
666
|
|
|
|
|
|
|
cosmo_mode => '', |
667
|
|
|
|
|
|
|
cosmo_ape_loader => 'ape-no-modify-self.o', |
668
|
|
|
|
|
|
|
perl_flags => ['-Dprefix=/zip', '-Uversiononly', '-Dmyhostname=cosmo', '-Dmydomain=invalid'], |
669
|
|
|
|
|
|
|
perl_extra_flags => ['-Doptimize=-Os', '-de'], |
670
|
|
|
|
|
|
|
dest => 'perl.com', |
671
|
|
|
|
|
|
|
MANIFEST => ['lib', 'bin'], |
672
|
|
|
|
|
|
|
'include_Perl-Dist-APPerl' => 1, |
673
|
|
|
|
|
|
|
perl_repo_files => {}, |
674
|
|
|
|
|
|
|
zip_extra_files => {}, |
675
|
|
|
|
|
|
|
}, |
676
|
|
|
|
|
|
|
'v5.36.0-full-v0.1.0-vista' => { |
677
|
|
|
|
|
|
|
desc => 'Full perl v5.36.0, but with non-standard Cosmopolitan Libc that still supports vista', |
678
|
|
|
|
|
|
|
base => 'v5.36.0-full-v0.1.0', |
679
|
|
|
|
|
|
|
cosmo_id => '9c5a7795add7add5a214afce27d896084e0861c5', |
680
|
|
|
|
|
|
|
dest => 'perl-vista.com', |
681
|
|
|
|
|
|
|
}, |
682
|
|
|
|
|
|
|
'v5.36.0-small-v0.1.0' => { |
683
|
|
|
|
|
|
|
desc => 'small perl v5.36.0 built with Cosmopolitan Libc 2.2', |
684
|
|
|
|
|
|
|
base => 'v5.36.0-full-v0.1.0', |
685
|
|
|
|
|
|
|
perl_onlyextensions => [qw(Cwd Fcntl File/Glob Hash/Util IO List/Util POSIX Socket attributes re)], |
686
|
|
|
|
|
|
|
perl_extra_flags => ['-Doptimize=-Os', '-de'], |
687
|
|
|
|
|
|
|
MANIFEST => \@smallmanifest, |
688
|
|
|
|
|
|
|
'include_Perl-Dist-APPerl' => 0, |
689
|
|
|
|
|
|
|
dest => 'perl-small.com', |
690
|
|
|
|
|
|
|
}, |
691
|
|
|
|
|
|
|
'v5.36.0-small-v0.1.0-vista' => { |
692
|
|
|
|
|
|
|
desc => 'small perl v5.36.0, but with non-standard Cosmopolitan Libc that still supports vista', |
693
|
|
|
|
|
|
|
base => 'v5.36.0-small-v0.1.0', |
694
|
|
|
|
|
|
|
cosmo_id => '9c5a7795add7add5a214afce27d896084e0861c5', |
695
|
|
|
|
|
|
|
dest => 'perl-small-vista.com', |
696
|
|
|
|
|
|
|
}, |
697
|
|
|
|
|
|
|
'full' => { desc => 'moving target: full', base => 'v5.36.0-full-v0.1.0' }, |
698
|
|
|
|
|
|
|
'full-vista' => { desc => 'moving target: full for vista', base => 'v5.36.0-full-v0.1.0-vista' }, |
699
|
|
|
|
|
|
|
'small' => { desc => 'moving target: small', base => 'v5.36.0-small-v0.1.0' }, |
700
|
|
|
|
|
|
|
'small-vista' => { desc => 'moving target: small for vista', base => 'v5.36.0-small-v0.1.0-vista' }, |
701
|
|
|
|
|
|
|
# development configs |
702
|
|
|
|
|
|
|
dontuse_threads => { |
703
|
|
|
|
|
|
|
desc => "not recommended, threaded build is buggy", |
704
|
|
|
|
|
|
|
base => 'v5.36.0-full-v0.1.0', |
705
|
|
|
|
|
|
|
perl_extra_flags => ['-Doptimize=-Os', '-Dusethreads', '-de'], |
706
|
|
|
|
|
|
|
perl_id => 'cosmo-apperl' |
707
|
|
|
|
|
|
|
}, |
708
|
|
|
|
|
|
|
perl_cosmo_dev => { |
709
|
|
|
|
|
|
|
desc => "For developing cosmo platform perl without apperl additions", |
710
|
|
|
|
|
|
|
base => 'v5.36.0-full-v0.1.0', |
711
|
|
|
|
|
|
|
perl_id => 'cosmo' |
712
|
|
|
|
|
|
|
}, |
713
|
|
|
|
|
|
|
perl_cosmo_dev_on_vista => { |
714
|
|
|
|
|
|
|
desc => "For developing cosmo platform perl without apperl additions on vista", |
715
|
|
|
|
|
|
|
base => "perl_cosmo_dev", |
716
|
|
|
|
|
|
|
cosmo_id => '9c5a7795add7add5a214afce27d896084e0861c5', |
717
|
|
|
|
|
|
|
}, |
718
|
|
|
|
|
|
|
perl_apperl_dev => { |
719
|
|
|
|
|
|
|
desc => "For developing apperl", |
720
|
|
|
|
|
|
|
base => 'v5.36.0-full-v0.1.0', |
721
|
|
|
|
|
|
|
perl_id => 'cosmo-apperl' |
722
|
|
|
|
|
|
|
} |
723
|
|
|
|
|
|
|
} |
724
|
|
|
|
|
|
|
); |
725
|
0
|
|
|
|
|
|
$defconfig{defaultconfig} = $defconfig{apperl_configs}{full}{base}; |
726
|
|
|
|
|
|
|
|
727
|
0
|
|
|
|
|
|
my $projectconfig = _load_json(PROJECT_FILE); |
728
|
0
|
0
|
|
|
|
|
if($projectconfig) { |
729
|
0
|
|
|
|
|
|
foreach my $projkey (keys %$projectconfig) { |
730
|
0
|
0
|
|
|
|
|
if($projkey ne 'apperl_configs') { |
731
|
0
|
|
|
|
|
|
$defconfig{$projkey} = $projectconfig->{$projkey}; |
732
|
|
|
|
|
|
|
} |
733
|
|
|
|
|
|
|
else { |
734
|
0
|
|
|
|
|
|
$defconfig{$projkey} = {%{$defconfig{$projkey}}, %{$projectconfig->{$projkey}}}; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
} |
736
|
|
|
|
|
|
|
} |
737
|
|
|
|
|
|
|
} |
738
|
0
|
|
|
|
|
|
return \%defconfig; |
739
|
|
|
|
|
|
|
} |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
sub _build_def_config { |
742
|
|
|
|
|
|
|
return { |
743
|
0
|
|
0
|
0
|
|
|
base => ($_[0] // 'nobuild-v0.1.0'), |
744
|
|
|
|
|
|
|
desc => 'description of this config', |
745
|
|
|
|
|
|
|
dest => 'perl.com' |
746
|
|
|
|
|
|
|
}; |
747
|
|
|
|
|
|
|
} |
748
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
sub Init { |
750
|
0
|
|
|
0
|
0
|
|
my ($defaultconfig, $base) = @_; |
751
|
|
|
|
|
|
|
# validate |
752
|
0
|
0
|
|
|
|
|
die "Cannot create project config, it already exists ".PROJECT_FILE if(-e PROJECT_FILE); |
753
|
0
|
|
|
|
|
|
my $Configs = _load_apperl_configs(); |
754
|
0
|
0
|
|
|
|
|
if(defined $base) { |
755
|
0
|
0
|
|
|
|
|
$defaultconfig or die "Cannot set base without name for new config"; |
756
|
0
|
0
|
|
|
|
|
if(exists $Configs->{apperl_configs}{$defaultconfig}) { |
757
|
0
|
|
|
|
|
|
die "Cannot set base for $defaultconfig, $defaultconfig already exists "; |
758
|
|
|
|
|
|
|
} |
759
|
0
|
0
|
|
|
|
|
exists $Configs->{apperl_configs}{$base} or die "base config $base does not exist"; |
760
|
|
|
|
|
|
|
} |
761
|
|
|
|
|
|
|
|
762
|
|
|
|
|
|
|
# create project config |
763
|
0
|
|
0
|
|
|
|
my %jsondata = ( 'defaultconfig' => ($defaultconfig // 'nobuild-v0.1.0')); |
764
|
0
|
0
|
0
|
|
|
|
if($defaultconfig && ! exists $Configs->{apperl_configs}{$defaultconfig}) { |
765
|
|
|
|
|
|
|
$jsondata{apperl_configs} = { |
766
|
0
|
|
|
|
|
|
$defaultconfig => _build_def_config($base), |
767
|
|
|
|
|
|
|
}; |
768
|
|
|
|
|
|
|
} |
769
|
0
|
|
|
|
|
|
print "writing new project\n"; |
770
|
0
|
|
|
|
|
|
_write_json(PROJECT_FILE, \%jsondata); |
771
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
# checkout default config |
773
|
0
|
|
|
|
|
|
Set($jsondata{defaultconfig}); |
774
|
|
|
|
|
|
|
} |
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
sub NewConfig { |
777
|
0
|
|
|
0
|
0
|
|
my ($name, $base) = @_; |
778
|
0
|
0
|
|
|
|
|
$name or die "Name required to add new config"; |
779
|
0
|
|
|
|
|
|
my $Configs = _load_apperl_configs(); |
780
|
0
|
0
|
|
|
|
|
! exists $Configs->{apperl_configs}{$name} or die "Cannot create already existing config"; |
781
|
0
|
0
|
|
|
|
|
if(defined $base) { |
782
|
0
|
0
|
|
|
|
|
exists $Configs->{apperl_configs}{$base} or die "base config $base does not exist"; |
783
|
|
|
|
|
|
|
} |
784
|
0
|
0
|
|
|
|
|
my $projectconfig = _load_json(PROJECT_FILE) or die "project file must already exist"; |
785
|
0
|
|
|
|
|
|
$projectconfig->{apperl_configs}{$name} = _build_def_config($base); |
786
|
0
|
|
|
|
|
|
print "rewriting project\n"; |
787
|
0
|
|
|
|
|
|
_write_json(PROJECT_FILE, $projectconfig); |
788
|
|
|
|
|
|
|
} |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
sub InstallBuildDeps { |
791
|
0
|
|
|
0
|
0
|
|
my ($perlrepo, $cosmorepo) = @_; |
792
|
0
|
|
|
|
|
|
my $SiteConfig = _load_json(SITE_CONFIG_FILE); |
793
|
|
|
|
|
|
|
# if a repo is not set, set one up by default |
794
|
0
|
0
|
0
|
|
|
|
if((!$SiteConfig || !exists $SiteConfig->{perl_repo}) && (!$perlrepo)) { |
|
|
|
0
|
|
|
|
|
795
|
0
|
|
|
|
|
|
$perlrepo = SITE_REPO_DIR."/perl5"; |
796
|
0
|
|
|
|
|
|
_setup_repo($perlrepo, _load_apperl_configs()->{perl_remotes}); |
797
|
0
|
|
|
|
|
|
print "apperlm install-build-deps: setup perl repo\n"; |
798
|
|
|
|
|
|
|
} |
799
|
0
|
0
|
0
|
|
|
|
if((!$SiteConfig || !exists $SiteConfig->{cosmo_repo}) && (!$cosmorepo)) { |
|
|
|
0
|
|
|
|
|
800
|
0
|
|
|
|
|
|
$cosmorepo = SITE_REPO_DIR."/cosmopolitan"; |
801
|
0
|
|
|
|
|
|
_setup_repo( $cosmorepo, _load_apperl_configs()->{cosmo_remotes}); |
802
|
0
|
|
|
|
|
|
print "apperlm install-build-deps: setup cosmo repo\n"; |
803
|
|
|
|
|
|
|
} |
804
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
# (re)write site config |
806
|
0
|
|
0
|
|
|
|
$perlrepo //= $SiteConfig->{perl_repo}; |
807
|
0
|
|
0
|
|
|
|
$cosmorepo //= $SiteConfig->{cosmo_repo}; |
808
|
0
|
|
|
|
|
|
my %siteconfig = ( |
809
|
|
|
|
|
|
|
perl_repo => abs_path($perlrepo), |
810
|
|
|
|
|
|
|
cosmo_repo => abs_path($cosmorepo) |
811
|
|
|
|
|
|
|
); |
812
|
0
|
|
|
|
|
|
$SiteConfig = \%siteconfig; |
813
|
0
|
|
|
|
|
|
make_path(SITE_CONFIG_DIR); |
814
|
0
|
|
|
|
|
|
_write_json(SITE_CONFIG_FILE, \%siteconfig); |
815
|
0
|
|
|
|
|
|
print "apperlm install-build-deps: wrote site config to ".SITE_CONFIG_FILE."\n"; |
816
|
|
|
|
|
|
|
} |
817
|
|
|
|
|
|
|
|
818
|
|
|
|
|
|
|
sub _remove_arr_items_from_arr { |
819
|
0
|
|
|
0
|
|
|
my ($src, $toremove) = @_; |
820
|
0
|
|
|
|
|
|
foreach my $item (@{$toremove}) { |
|
0
|
|
|
|
|
|
|
821
|
0
|
|
|
|
|
|
my $index = 0; |
822
|
0
|
|
|
|
|
|
$index++ until $src->[$index] eq $item; |
823
|
0
|
|
|
|
|
|
splice(@$src, $index, 1); |
824
|
|
|
|
|
|
|
} |
825
|
|
|
|
|
|
|
} |
826
|
|
|
|
|
|
|
|
827
|
|
|
|
|
|
|
sub Status { |
828
|
0
|
|
|
0
|
0
|
|
my $Configs = _load_apperl_configs(); |
829
|
0
|
|
|
|
|
|
my @configlist = sort(keys %{$Configs->{apperl_configs}}); |
|
0
|
|
|
|
|
|
|
830
|
0
|
|
|
|
|
|
my $UserProjectConfig = _load_user_project_config(); |
831
|
0
|
|
|
|
|
|
my $CurAPPerlName; |
832
|
0
|
0
|
|
|
|
|
if($UserProjectConfig) { |
833
|
0
|
0
|
|
|
|
|
if(exists $UserProjectConfig->{current_apperl}) { |
834
|
0
|
|
|
|
|
|
$CurAPPerlName = $UserProjectConfig->{current_apperl}; |
835
|
0
|
0
|
|
|
|
|
exists $Configs->{apperl_configs}{$CurAPPerlName} or die("non-existent apperl config $CurAPPerlName in user project config"); |
836
|
|
|
|
|
|
|
} |
837
|
|
|
|
|
|
|
} |
838
|
0
|
0
|
0
|
|
|
|
if(!defined $CurAPPerlName && exists $Configs->{'defaultconfig'}) { |
839
|
0
|
|
|
|
|
|
$CurAPPerlName = $Configs->{'defaultconfig'}; |
840
|
0
|
0
|
|
|
|
|
exists $Configs->{apperl_configs}{$CurAPPerlName} or die("non-existent default apperl config $CurAPPerlName"); |
841
|
|
|
|
|
|
|
} |
842
|
|
|
|
|
|
|
|
843
|
0
|
|
|
|
|
|
my @projectitems; |
844
|
0
|
|
|
|
|
|
my $projectconfig = _load_json(PROJECT_FILE); |
845
|
0
|
0
|
0
|
|
|
|
if($projectconfig && exists $projectconfig->{apperl_configs}) { |
846
|
0
|
|
|
|
|
|
@projectitems = sort (keys %{$projectconfig->{apperl_configs}}); |
|
0
|
|
|
|
|
|
|
847
|
|
|
|
|
|
|
} |
848
|
0
|
|
|
|
|
|
my @stable = grep( /v\d+\.\d+\.\d+(\-vista)?$/, @configlist); |
849
|
0
|
|
|
|
|
|
my @rolling = ('full', 'full-vista', 'small', 'small-vista'); |
850
|
0
|
|
|
|
|
|
my @internal = ('dontuse_threads', 'perl_cosmo_dev', 'perl_cosmo_dev_on_vista', 'perl_apperl_dev'); |
851
|
0
|
|
|
|
|
|
my @categories = ( |
852
|
|
|
|
|
|
|
['PROJECT', \@projectitems], |
853
|
|
|
|
|
|
|
['STABLE', \@stable], |
854
|
|
|
|
|
|
|
['ROLLING', \@rolling], |
855
|
|
|
|
|
|
|
['UNSTABLE/INTERNAL', \@internal], |
856
|
|
|
|
|
|
|
['UNKNOWN', \@configlist] |
857
|
|
|
|
|
|
|
); |
858
|
0
|
|
|
|
|
|
foreach my $cat (@categories) { |
859
|
0
|
|
|
|
|
|
foreach my $item (@{$cat->[1]}) { |
|
0
|
|
|
|
|
|
|
860
|
0
|
0
|
0
|
|
|
|
print (sprintf "%s %-30.30s | %-17.17s |%s\n", $CurAPPerlName && ($item eq $CurAPPerlName) ? '*' : ' ', $item, $cat->[0], ($Configs->{apperl_configs}{$item}{desc} // '')); |
|
|
|
0
|
|
|
|
|
861
|
|
|
|
|
|
|
} |
862
|
0
|
|
|
|
|
|
_remove_arr_items_from_arr(\@configlist, \@{$cat->[1]}); |
|
0
|
|
|
|
|
|
|
863
|
|
|
|
|
|
|
} |
864
|
|
|
|
|
|
|
} |
865
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
# unfortunately this needs to be called in several places to try to keep them in sync |
867
|
|
|
|
|
|
|
# as perl's make trips up when trying to build an symlinked extension |
868
|
|
|
|
|
|
|
sub _install_perl_repo_files { |
869
|
0
|
|
|
0
|
|
|
my ($itemconfig, $SiteConfig) = @_; |
870
|
0
|
|
|
|
|
|
foreach my $dest (keys %{$itemconfig->{perl_repo_files}}) { |
|
0
|
|
|
|
|
|
|
871
|
0
|
|
|
|
|
|
foreach my $file (@{$itemconfig->{perl_repo_files}{$dest}}) { |
|
0
|
|
|
|
|
|
|
872
|
|
|
|
|
|
|
#_command_or_die('ln', '-sf', START_WD."/$file", "$SiteConfig->{perl_repo}/$dest"); |
873
|
0
|
|
|
|
|
|
_copy_recursive(START_WD."/$file", "$SiteConfig->{perl_repo}/$dest"); |
874
|
|
|
|
|
|
|
} |
875
|
|
|
|
|
|
|
} |
876
|
|
|
|
|
|
|
} |
877
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
sub Set { |
879
|
0
|
|
|
0
|
0
|
|
my ($cfgname) = @_; |
880
|
0
|
|
|
|
|
|
my $UserProjectConfig = _load_user_project_config(); |
881
|
0
|
0
|
|
|
|
|
if($UserProjectConfig) { |
882
|
0
|
|
|
|
|
|
delete $UserProjectConfig->{nobuild_perl_bin}; |
883
|
|
|
|
|
|
|
} |
884
|
|
|
|
|
|
|
else { |
885
|
0
|
|
|
|
|
|
$UserProjectConfig = {}; |
886
|
|
|
|
|
|
|
} |
887
|
0
|
|
|
|
|
|
my $itemconfig = _load_apperl_config(_load_apperl_configs()->{apperl_configs}, $cfgname); |
888
|
0
|
|
|
|
|
|
print Dumper($itemconfig); |
889
|
0
|
0
|
|
|
|
|
if(! exists $itemconfig->{nobuild_perl_bin}) { |
890
|
0
|
0
|
|
|
|
|
my $SiteConfig = _load_json(SITE_CONFIG_FILE) or die "cannot set without build deps (run apperlm install-build-deps)"; |
891
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{cosmo_repo} or die $SiteConfig->{cosmo_repo} .' is not directory'; |
892
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{perl_repo} or die $SiteConfig->{perl_repo} .' is not directory'; |
893
|
0
|
|
|
|
|
|
print "cd ".$SiteConfig->{cosmo_repo}."\n"; |
894
|
0
|
0
|
|
|
|
|
chdir($SiteConfig->{cosmo_repo}) or die "Failed to enter cosmo repo"; |
895
|
0
|
|
|
|
|
|
_command_or_die('git', 'checkout', $itemconfig->{cosmo_id}); |
896
|
|
|
|
|
|
|
|
897
|
0
|
|
|
|
|
|
print "cd ".$SiteConfig->{perl_repo}."\n"; |
898
|
0
|
0
|
|
|
|
|
chdir($SiteConfig->{perl_repo}) or die "Failed to enter perl repo"; |
899
|
0
|
|
|
|
|
|
print "make veryclean\n"; |
900
|
0
|
|
|
|
|
|
system("make", "veryclean"); |
901
|
0
|
|
|
|
|
|
foreach my $todelete ('miniperl.com', 'perl.com', 'miniperl.elf', 'perl.elf') { |
902
|
0
|
|
|
|
|
|
print "rm $todelete\n"; |
903
|
1
|
0
|
0
|
1
|
|
540
|
unlink($todelete) || $!{ENOENT} or die "failed to delete $todelete"; |
|
1
|
|
|
|
|
1441
|
|
|
1
|
|
|
|
|
9
|
|
|
0
|
|
|
|
|
|
|
904
|
|
|
|
|
|
|
} |
905
|
0
|
|
|
|
|
|
_command_or_die('git', 'checkout', $itemconfig->{perl_id}); |
906
|
|
|
|
|
|
|
|
907
|
0
|
|
|
|
|
|
print "cd ".START_WD."\n"; |
908
|
0
|
0
|
|
|
|
|
chdir(START_WD) or die "Failed to restore cwd"; |
909
|
0
|
|
|
|
|
|
_install_perl_repo_files($itemconfig, $SiteConfig); |
910
|
|
|
|
|
|
|
} |
911
|
|
|
|
|
|
|
else { |
912
|
0
|
|
|
|
|
|
my $validperl; |
913
|
0
|
|
|
|
|
|
foreach my $perlbin (@{$itemconfig->{nobuild_perl_bin}}) { |
|
0
|
|
|
|
|
|
|
914
|
0
|
|
|
|
|
|
print "perlbin $perlbin\n"; |
915
|
0
|
0
|
|
|
|
|
if(-f $perlbin) { |
916
|
0
|
0
|
0
|
|
|
|
if(( $perlbin eq $^X) && (! -d '/zip')) { |
917
|
0
|
|
|
|
|
|
print "skipping $perlbin, it appears to not be APPerl\n"; |
918
|
0
|
|
|
|
|
|
next; |
919
|
|
|
|
|
|
|
} |
920
|
0
|
|
|
|
|
|
$validperl = $perlbin; |
921
|
0
|
|
|
|
|
|
last; |
922
|
|
|
|
|
|
|
} |
923
|
|
|
|
|
|
|
} |
924
|
0
|
0
|
|
|
|
|
$validperl or die "no valid perl found to use for nobuild config"; |
925
|
0
|
|
|
|
|
|
$validperl = abs_path($validperl); |
926
|
0
|
0
|
|
|
|
|
$validperl or die "no valid perl found to use for nobuild config"; |
927
|
0
|
|
|
|
|
|
$UserProjectConfig->{nobuild_perl_bin} = $validperl; |
928
|
0
|
|
|
|
|
|
print "Set UserProjectConfig to nobuild_perl-bin to $validperl\n"; |
929
|
|
|
|
|
|
|
} |
930
|
0
|
|
0
|
|
|
|
$UserProjectConfig->{apperl_output} //= PROJECT_TMP_DIR."/o"; |
931
|
0
|
|
|
|
|
|
$UserProjectConfig->{current_apperl} = $cfgname; |
932
|
0
|
|
|
|
|
|
_write_user_project_config($UserProjectConfig); |
933
|
0
|
|
|
|
|
|
print "$0: Successfully switched to $cfgname\n"; |
934
|
|
|
|
|
|
|
} |
935
|
|
|
|
|
|
|
|
936
|
|
|
|
|
|
|
sub Configure { |
937
|
0
|
|
|
0
|
0
|
|
my $Configs = _load_apperl_configs(); |
938
|
0
|
0
|
|
|
|
|
my $UserProjectConfig = _load_valid_user_project_config_with_default($Configs) or die "cannot Configure without valid UserProjectConfig"; |
939
|
0
|
|
|
|
|
|
my $CurAPPerlName = $UserProjectConfig->{current_apperl}; |
940
|
0
|
0
|
|
|
|
|
! exists $UserProjectConfig->{nobuild_perl_bin} or die "nobuild perl cannot be configured"; |
941
|
0
|
0
|
|
|
|
|
my $SiteConfig = _load_json(SITE_CONFIG_FILE) or die "cannot Configure without build deps (run apperlm install-build-deps)"; |
942
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{cosmo_repo} or die $SiteConfig->{cosmo_repo} .' is not directory'; |
943
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{perl_repo} or die $SiteConfig->{perl_repo} .' is not directory'; |
944
|
0
|
|
|
|
|
|
my $itemconfig = _load_apperl_config($Configs->{apperl_configs}, $CurAPPerlName); |
945
|
0
|
|
|
|
|
|
_install_perl_repo_files($itemconfig, $SiteConfig); |
946
|
|
|
|
|
|
|
# build cosmo |
947
|
0
|
|
|
|
|
|
print "$0: Building cosmo, COSMO_MODE=$itemconfig->{cosmo_mode} COSMO_APE_LOADER=$itemconfig->{cosmo_ape_loader}\n"; |
948
|
0
|
|
|
|
|
|
_command_or_die('make', '-C', $SiteConfig->{cosmo_repo}, '-j4', "MODE=$itemconfig->{cosmo_mode}", |
949
|
|
|
|
|
|
|
"o/$itemconfig->{cosmo_mode}/cosmopolitan.a", |
950
|
|
|
|
|
|
|
"o/$itemconfig->{cosmo_mode}/libc/crt/crt.o", |
951
|
|
|
|
|
|
|
"o/$itemconfig->{cosmo_mode}/ape/public/ape.lds", |
952
|
|
|
|
|
|
|
"o/$itemconfig->{cosmo_mode}/ape/$itemconfig->{cosmo_ape_loader}", |
953
|
|
|
|
|
|
|
); |
954
|
|
|
|
|
|
|
|
955
|
|
|
|
|
|
|
# Finally Configure perl |
956
|
0
|
|
|
|
|
|
print "cd ".$SiteConfig->{perl_repo}."\n"; |
957
|
0
|
0
|
|
|
|
|
chdir($SiteConfig->{perl_repo}) or die "Failed to enter perl repo"; |
958
|
0
|
|
|
|
|
|
$ENV{COSMO_REPO} = $SiteConfig->{cosmo_repo}; |
959
|
0
|
|
|
|
|
|
$ENV{COSMO_MODE} = $itemconfig->{cosmo_mode}; |
960
|
0
|
|
|
|
|
|
$ENV{COSMO_APE_LOADER} = $itemconfig->{cosmo_ape_loader}; |
961
|
0
|
|
|
|
|
|
my @onlyextensions = (); |
962
|
0
|
0
|
|
|
|
|
push @onlyextensions, ("-Donlyextensions= ".join(' ', sort @{$itemconfig->{perl_onlyextensions}}).' ') if(exists $itemconfig->{perl_onlyextensions}); |
|
0
|
|
|
|
|
|
|
963
|
0
|
|
|
|
|
|
_command_or_die('sh', 'Configure', @{$itemconfig->{perl_flags}}, @onlyextensions, @{$itemconfig->{perl_extra_flags}}, @_); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
964
|
0
|
|
|
|
|
|
print "$0: Configure successful, time for apperlm build\n"; |
965
|
|
|
|
|
|
|
} |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
sub _fix_bases { |
968
|
0
|
|
|
0
|
|
|
my ($in, $PERL_VERSION, $PERL_ARCHNAME) = @_; |
969
|
0
|
|
|
|
|
|
$in =~ s/^__perllib__/lib\/perl5\/$PERL_VERSION/; |
970
|
0
|
|
|
|
|
|
$in =~ s/^__perlarchlib__/lib\/perl5\/$PERL_VERSION\/$PERL_ARCHNAME/; |
971
|
0
|
|
|
|
|
|
return $in; |
972
|
|
|
|
|
|
|
} |
973
|
|
|
|
|
|
|
|
974
|
|
|
|
|
|
|
# system is pretty broken on APPerl when running on Windows |
975
|
|
|
|
|
|
|
# let's search PATH ourselves ... |
976
|
|
|
|
|
|
|
sub _find_zip { |
977
|
0
|
0
|
0
|
0
|
|
|
if(($^O ne 'cosmo') || (! -f '/C/Windows/System32/cmd.exe')) { |
978
|
0
|
|
|
|
|
|
return 'zip'; |
979
|
|
|
|
|
|
|
} |
980
|
|
|
|
|
|
|
else { |
981
|
0
|
|
|
|
|
|
foreach my $dir (@PATH) { |
982
|
0
|
|
|
|
|
|
my $zippath = "$dir/zip.exe"; |
983
|
0
|
0
|
|
|
|
|
return $zippath if(-f $zippath); |
984
|
|
|
|
|
|
|
} |
985
|
|
|
|
|
|
|
} |
986
|
0
|
|
|
|
|
|
die("Failed to find zip.exe, did you download Info-Zip and add the folder containing zip.exe to \%PATH\%?"); |
987
|
|
|
|
|
|
|
} |
988
|
|
|
|
|
|
|
|
989
|
|
|
|
|
|
|
sub Build { |
990
|
0
|
|
|
0
|
0
|
|
my ($zippath) = @_; |
991
|
0
|
|
|
|
|
|
my $Configs = _load_apperl_configs(); |
992
|
0
|
0
|
|
|
|
|
my $UserProjectConfig = _load_valid_user_project_config_with_default($Configs) or die "cannot Build without valid UserProjectConfig"; |
993
|
0
|
|
|
|
|
|
my $CurAPPerlName = $UserProjectConfig->{current_apperl}; |
994
|
0
|
|
|
|
|
|
my $itemconfig = _load_apperl_config($Configs->{apperl_configs}, $CurAPPerlName); |
995
|
|
|
|
|
|
|
|
996
|
0
|
|
|
|
|
|
my $PERL_APE; |
997
|
|
|
|
|
|
|
my @perl_config_cmd; |
998
|
|
|
|
|
|
|
# build cosmo perl if this isn't a nobuild config |
999
|
0
|
0
|
|
|
|
|
if(! exists $UserProjectConfig->{nobuild_perl_bin}){ |
1000
|
0
|
0
|
|
|
|
|
my $SiteConfig = _load_json(SITE_CONFIG_FILE) or die "cannot build without build deps (run apperlm install-build-deps)"; |
1001
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{cosmo_repo} or die $SiteConfig->{cosmo_repo} .' is not directory'; |
1002
|
0
|
0
|
|
|
|
|
-d $SiteConfig->{perl_repo} or die $SiteConfig->{perl_repo} .' is not directory'; |
1003
|
0
|
|
|
|
|
|
_install_perl_repo_files($itemconfig, $SiteConfig); |
1004
|
0
|
|
|
|
|
|
print "cd ".$SiteConfig->{perl_repo}."\n"; |
1005
|
0
|
0
|
|
|
|
|
chdir($SiteConfig->{perl_repo}) or die "Failed to enter perl repo"; |
1006
|
0
|
|
|
|
|
|
_command_or_die('make'); |
1007
|
0
|
|
|
|
|
|
$PERL_APE = "$SiteConfig->{perl_repo}/perl.com"; |
1008
|
0
|
|
|
|
|
|
@perl_config_cmd = ('./perl', '-Ilib'); |
1009
|
|
|
|
|
|
|
} |
1010
|
|
|
|
|
|
|
else { |
1011
|
0
|
|
|
|
|
|
$PERL_APE = $UserProjectConfig->{nobuild_perl_bin}; |
1012
|
0
|
|
|
|
|
|
@perl_config_cmd = ($PERL_APE); |
1013
|
|
|
|
|
|
|
} |
1014
|
|
|
|
|
|
|
|
1015
|
|
|
|
|
|
|
# prepare for install and pack |
1016
|
0
|
0
|
|
|
|
|
-f $PERL_APE or die "apperlm build: perl ape not found"; |
1017
|
0
|
|
|
|
|
|
my $OUTPUTDIR = "$UserProjectConfig->{apperl_output}/$CurAPPerlName"; |
1018
|
0
|
0
|
|
|
|
|
if(-d $OUTPUTDIR) { |
1019
|
0
|
|
|
|
|
|
print "rm -rf $OUTPUTDIR\n"; |
1020
|
0
|
|
|
|
|
|
remove_tree($OUTPUTDIR); |
1021
|
|
|
|
|
|
|
} |
1022
|
0
|
|
|
|
|
|
my $TEMPDIR = "$OUTPUTDIR/tmp"; |
1023
|
0
|
|
|
|
|
|
print "mkdir -p $TEMPDIR\n"; |
1024
|
0
|
|
|
|
|
|
make_path($TEMPDIR); |
1025
|
0
|
|
|
|
|
|
my $PERL_PREFIX = _cmdoutput_or_die(@perl_config_cmd, '-e', 'use Config; print $Config{prefix}'); |
1026
|
0
|
|
|
|
|
|
my $PREFIX_NOZIP = $PERL_PREFIX; |
1027
|
0
|
|
|
|
|
|
$PREFIX_NOZIP =~ s/^\/zip\/*//; |
1028
|
0
|
|
|
|
|
|
my $PERL_VERSION = _cmdoutput_or_die(@perl_config_cmd, '-e', 'use Config; print $Config{version}'); |
1029
|
0
|
|
|
|
|
|
my $PERL_ARCHNAME = _cmdoutput_or_die(@perl_config_cmd, '-e', 'use Config; print $Config{archname}'); |
1030
|
0
|
|
|
|
|
|
my @zipfiles = map { "$PREFIX_NOZIP"._fix_bases($_, $PERL_VERSION, $PERL_ARCHNAME) } @{$itemconfig->{MANIFEST}}; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1031
|
0
|
|
|
|
|
|
my $ZIP_ROOT = "$TEMPDIR/zip"; |
1032
|
|
|
|
|
|
|
|
1033
|
|
|
|
|
|
|
# install cosmo perl if this isn't a nobuild config |
1034
|
0
|
0
|
|
|
|
|
if(! exists $UserProjectConfig->{nobuild_perl_bin}){ |
1035
|
0
|
|
|
|
|
|
_command_or_die('make', "DESTDIR=$TEMPDIR", 'install'); |
1036
|
0
|
|
|
|
|
|
my @toremove = ("$TEMPDIR$PERL_PREFIX/bin/perl", "$TEMPDIR$PERL_PREFIX/bin/perl$PERL_VERSION"); |
1037
|
0
|
|
|
|
|
|
print 'rm '.join(' ', @toremove)."\n"; |
1038
|
0
|
0
|
|
|
|
|
unlink(@toremove) == scalar(@toremove) or die "Failed to unlink some files"; |
1039
|
|
|
|
|
|
|
} |
1040
|
|
|
|
|
|
|
else { |
1041
|
0
|
|
|
|
|
|
make_path($ZIP_ROOT); |
1042
|
|
|
|
|
|
|
} |
1043
|
|
|
|
|
|
|
|
1044
|
|
|
|
|
|
|
# pack |
1045
|
0
|
|
|
|
|
|
my $APPNAME = basename($PERL_APE); |
1046
|
0
|
|
|
|
|
|
my $APPPATH = "$TEMPDIR/$APPNAME"; |
1047
|
0
|
|
|
|
|
|
print "cp $PERL_APE $APPPATH\n"; |
1048
|
0
|
0
|
|
|
|
|
copy($PERL_APE, $APPPATH) or die "copy failed: $!"; |
1049
|
0
|
|
|
|
|
|
print "chmod 755 $APPPATH\n"; |
1050
|
0
|
0
|
|
|
|
|
chmod(0755, $APPPATH) or die $!; |
1051
|
0
|
0
|
0
|
|
|
|
if((! exists $UserProjectConfig->{nobuild_perl_bin}) || scalar(keys %{$itemconfig->{zip_extra_files}})) { |
|
0
|
|
|
|
|
|
|
1052
|
0
|
|
|
|
|
|
print "cd $ZIP_ROOT\n"; |
1053
|
0
|
0
|
|
|
|
|
chdir($ZIP_ROOT) or die "failed to enter ziproot"; |
1054
|
0
|
|
|
|
|
|
foreach my $destkey (keys %{$itemconfig->{zip_extra_files}}) { |
|
0
|
|
|
|
|
|
|
1055
|
0
|
|
|
|
|
|
my $dest = _fix_bases($destkey, $PERL_VERSION, $PERL_ARCHNAME); |
1056
|
0
|
|
|
|
|
|
foreach my $file (@{$itemconfig->{zip_extra_files}{$destkey}}) { |
|
0
|
|
|
|
|
|
|
1057
|
0
|
|
|
|
|
|
_copy_recursive($file, $dest); |
1058
|
|
|
|
|
|
|
} |
1059
|
|
|
|
|
|
|
} |
1060
|
0
|
|
0
|
|
|
|
_command_or_die($zippath // _find_zip(), '-r', $APPPATH, @zipfiles); |
1061
|
|
|
|
|
|
|
} |
1062
|
0
|
|
|
|
|
|
print "mv $APPPATH $OUTPUTDIR/perl.com\n"; |
1063
|
0
|
0
|
|
|
|
|
move($APPPATH, "$OUTPUTDIR/perl.com") or die "move failed: $!"; |
1064
|
|
|
|
|
|
|
|
1065
|
|
|
|
|
|
|
# copy to user specified location |
1066
|
0
|
0
|
|
|
|
|
if(exists $itemconfig->{dest}) { |
1067
|
0
|
|
|
|
|
|
print "cd ".START_WD."\n"; |
1068
|
0
|
0
|
|
|
|
|
chdir(START_WD) or die "Failed to restore cwd"; |
1069
|
0
|
|
|
|
|
|
my @args = ("$UserProjectConfig->{apperl_output}/$CurAPPerlName/perl.com", $itemconfig->{dest}); |
1070
|
0
|
|
|
|
|
|
print 'cp '.join(' ', @args)."\n"; |
1071
|
0
|
0
|
|
|
|
|
cp(@args) or die "copy failed: $!"; |
1072
|
|
|
|
|
|
|
} |
1073
|
|
|
|
|
|
|
} |
1074
|
|
|
|
|
|
|
|
1075
|
|
|
|
|
|
|
sub apperlm { |
1076
|
0
|
|
|
0
|
0
|
|
my $generic_usage = <<'END_USAGE'; |
1077
|
|
|
|
|
|
|
apperlm [...] |
1078
|
|
|
|
|
|
|
List of commands, try apperlm --help for info about a command |
1079
|
|
|
|
|
|
|
list | List available APPerl configurations |
1080
|
|
|
|
|
|
|
init | Create an APPerl project in the current dir |
1081
|
|
|
|
|
|
|
new-config | Add a new APPerl configuration to the project |
1082
|
|
|
|
|
|
|
checkout | Switch to another APPerl configurations |
1083
|
|
|
|
|
|
|
install-build-deps | Install build dependencies for APPerl |
1084
|
|
|
|
|
|
|
configure | `Configure` Perl (only valid with build config) |
1085
|
|
|
|
|
|
|
build | Build APPerl |
1086
|
|
|
|
|
|
|
help | Prints this message |
1087
|
|
|
|
|
|
|
|
1088
|
|
|
|
|
|
|
Actually Portable Perl Manager (apperlm) handles configuring and |
1089
|
|
|
|
|
|
|
building Actually Portable Perl (APPerl). See |
1090
|
|
|
|
|
|
|
`perldoc Perl::Dist::APPerl` for more info. |
1091
|
|
|
|
|
|
|
END_USAGE |
1092
|
0
|
0
|
|
|
|
|
my $command = shift(@_) if(@_); |
1093
|
0
|
0
|
|
|
|
|
$command or die($generic_usage); |
1094
|
0
|
0
|
|
|
|
|
if($command eq 'list') { |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
1095
|
0
|
|
|
|
|
|
my $usage = <<'END_USAGE'; |
1096
|
|
|
|
|
|
|
apperlm list |
1097
|
|
|
|
|
|
|
List available APPerl configs; checks apperl-project.json and built-in |
1098
|
|
|
|
|
|
|
to Perl::Dist::APPerl configs. If a current config is set it is denoted |
1099
|
|
|
|
|
|
|
with a '*'. |
1100
|
|
|
|
|
|
|
END_USAGE |
1101
|
0
|
0
|
|
|
|
|
die($usage) if(@_); |
1102
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::Status(); |
1103
|
|
|
|
|
|
|
} |
1104
|
|
|
|
|
|
|
elsif($command eq 'build') { |
1105
|
0
|
|
|
|
|
|
my $usage = <<'END_USAGE'; |
1106
|
|
|
|
|
|
|
apperlm build [-z|--zippath ] |
1107
|
|
|
|
|
|
|
-z|--zippath Path to InfoZip zip executable |
1108
|
|
|
|
|
|
|
Build APPerl. If the current config is a from-scratch build, you must |
1109
|
|
|
|
|
|
|
run `apperlm configure` first. |
1110
|
|
|
|
|
|
|
END_USAGE |
1111
|
0
|
|
|
|
|
|
my $zippath; |
1112
|
|
|
|
|
|
|
my $help; |
1113
|
0
|
0
|
|
|
|
|
GetOptionsFromArray(\@_, "zippath|z=s" => \$zippath, |
1114
|
|
|
|
|
|
|
"help|h" => \$help, |
1115
|
|
|
|
|
|
|
) or die($usage); |
1116
|
0
|
0
|
|
|
|
|
if($help) { |
1117
|
0
|
|
|
|
|
|
print $usage; |
1118
|
0
|
|
|
|
|
|
exit 0; |
1119
|
|
|
|
|
|
|
} |
1120
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::Build($zippath); |
1121
|
|
|
|
|
|
|
} |
1122
|
|
|
|
|
|
|
elsif($command eq 'configure') { |
1123
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::Configure(@_); |
1124
|
|
|
|
|
|
|
} |
1125
|
|
|
|
|
|
|
elsif($command =~ /^(\-)*(halp|help|h)$/i) { |
1126
|
0
|
|
|
|
|
|
print $generic_usage; |
1127
|
|
|
|
|
|
|
} |
1128
|
|
|
|
|
|
|
elsif($command =~ /^(\-)*(version|v)$/i) { |
1129
|
0
|
|
|
|
|
|
my $message = <<"END_USAGE"; |
1130
|
|
|
|
|
|
|
apperlm $VERSION |
1131
|
|
|
|
|
|
|
Copyright (C) 2022 Gavin Arthur Hayes |
1132
|
|
|
|
|
|
|
This is free software; you can redistribute it and/or modify it under |
1133
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself. |
1134
|
|
|
|
|
|
|
END_USAGE |
1135
|
0
|
|
|
|
|
|
print $message; |
1136
|
|
|
|
|
|
|
} |
1137
|
|
|
|
|
|
|
elsif($command eq 'checkout') { |
1138
|
0
|
0
|
|
|
|
|
scalar(@_) == 1 or die('bad args'); |
1139
|
0
|
|
|
|
|
|
my $cfgname = $_[0]; |
1140
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::Set($cfgname); |
1141
|
|
|
|
|
|
|
} |
1142
|
|
|
|
|
|
|
elsif($command eq 'init') { |
1143
|
0
|
|
|
|
|
|
my $usage = <<'END_USAGE'; |
1144
|
|
|
|
|
|
|
apperlm init [-h|--help] [-n|--name ] [-b|--base ] |
1145
|
|
|
|
|
|
|
-n|--name name of the default config |
1146
|
|
|
|
|
|
|
-b|--base base class of the config |
1147
|
|
|
|
|
|
|
-h|--help Show this message |
1148
|
|
|
|
|
|
|
Create an APPerl project, create a config if -n specified and it |
1149
|
|
|
|
|
|
|
doesn't already exist, checkout the config. |
1150
|
|
|
|
|
|
|
END_USAGE |
1151
|
0
|
|
|
|
|
|
my $name; |
1152
|
|
|
|
|
|
|
my $base; |
1153
|
0
|
|
|
|
|
|
my $help; |
1154
|
0
|
0
|
|
|
|
|
GetOptionsFromArray(\@_, "name|n=s" => \$name, |
1155
|
|
|
|
|
|
|
"base|b=s" => \$base, |
1156
|
|
|
|
|
|
|
"help|h" => \$help, |
1157
|
|
|
|
|
|
|
) or die($usage); |
1158
|
0
|
0
|
|
|
|
|
if($help) { |
1159
|
0
|
|
|
|
|
|
print $usage; |
1160
|
0
|
|
|
|
|
|
exit 0; |
1161
|
|
|
|
|
|
|
} |
1162
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::Init($name, $base); |
1163
|
|
|
|
|
|
|
} |
1164
|
|
|
|
|
|
|
elsif($command eq 'install-build-deps') { |
1165
|
0
|
|
|
|
|
|
my $usage = <<'END_USAGE'; |
1166
|
|
|
|
|
|
|
apperlm install-build-deps [-h|--help] [-c|--cosmo ] [-p|--perl ] |
1167
|
|
|
|
|
|
|
-c|--cosmo set path to cosmopolitan repo (skips git initialization) |
1168
|
|
|
|
|
|
|
-p|--perl set path to perl repo (skips git initialization) |
1169
|
|
|
|
|
|
|
-h|--help Show this message |
1170
|
|
|
|
|
|
|
Install build dependencies for APPerl, use -c or -p to skip initializing |
1171
|
|
|
|
|
|
|
those repos by providing a path to it. |
1172
|
|
|
|
|
|
|
END_USAGE |
1173
|
0
|
|
|
|
|
|
my $cosmo; |
1174
|
|
|
|
|
|
|
my $perl; |
1175
|
0
|
|
|
|
|
|
my $help; |
1176
|
0
|
0
|
|
|
|
|
GetOptionsFromArray(\@_, "cosmo|c=s" => \$cosmo, |
1177
|
|
|
|
|
|
|
"perl|p=s" => \$perl, |
1178
|
|
|
|
|
|
|
"help|h" => \$help, |
1179
|
|
|
|
|
|
|
) or die($usage); |
1180
|
0
|
0
|
|
|
|
|
if($help) { |
1181
|
0
|
|
|
|
|
|
print $usage; |
1182
|
0
|
|
|
|
|
|
exit 0; |
1183
|
|
|
|
|
|
|
} |
1184
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::InstallBuildDeps($perl, $cosmo); |
1185
|
|
|
|
|
|
|
} |
1186
|
|
|
|
|
|
|
elsif($command eq 'new-config') { |
1187
|
0
|
|
|
|
|
|
my $usage = <<'END_USAGE'; |
1188
|
|
|
|
|
|
|
apperlm new-config [-h|--help] [-n|--name ] [-b|--base ] |
1189
|
|
|
|
|
|
|
-n|--name name of the default config |
1190
|
|
|
|
|
|
|
-b|--base base class of the config |
1191
|
|
|
|
|
|
|
-h|--help Show this message |
1192
|
|
|
|
|
|
|
Create a new APPerl config and add it to the project |
1193
|
|
|
|
|
|
|
END_USAGE |
1194
|
0
|
|
|
|
|
|
my $name; |
1195
|
|
|
|
|
|
|
my $base; |
1196
|
0
|
|
|
|
|
|
my $help; |
1197
|
0
|
0
|
|
|
|
|
GetOptionsFromArray(\@_, "name|n=s" => \$name, |
1198
|
|
|
|
|
|
|
"base|b=s" => \$base, |
1199
|
|
|
|
|
|
|
"help|h" => \$help, |
1200
|
|
|
|
|
|
|
) or die($usage); |
1201
|
0
|
0
|
|
|
|
|
if($help) { |
1202
|
0
|
|
|
|
|
|
print $usage; |
1203
|
0
|
|
|
|
|
|
exit 0; |
1204
|
|
|
|
|
|
|
} |
1205
|
0
|
|
|
|
|
|
Perl::Dist::APPerl::NewConfig($name, $base); |
1206
|
|
|
|
|
|
|
} |
1207
|
|
|
|
|
|
|
elsif($command eq 'get-config-key') { |
1208
|
0
|
0
|
|
|
|
|
scalar(@_) == 2 or die('bad args'); |
1209
|
0
|
|
|
|
|
|
my $itemconfig = _load_apperl_config(_load_apperl_configs()->{apperl_configs}, $_[0]); |
1210
|
0
|
|
|
|
|
|
print $itemconfig->{$_[1]}; |
1211
|
|
|
|
|
|
|
} |
1212
|
|
|
|
|
|
|
else { |
1213
|
0
|
|
|
|
|
|
die($generic_usage); |
1214
|
|
|
|
|
|
|
} |
1215
|
|
|
|
|
|
|
} |
1216
|
|
|
|
|
|
|
|
1217
|
|
|
|
|
|
|
sub _command_or_die { |
1218
|
0
|
|
|
0
|
|
|
print join(' ', @_), "\n"; |
1219
|
0
|
0
|
|
|
|
|
system(@_) == 0 or die; |
1220
|
|
|
|
|
|
|
} |
1221
|
|
|
|
|
|
|
|
1222
|
|
|
|
|
|
|
sub _cmdoutput_or_die { |
1223
|
0
|
|
|
0
|
|
|
print join(' ', @_), "\n"; |
1224
|
0
|
0
|
|
|
|
|
my $kid = open(my $from_kid, '-|', @_) or die "can't fork $!"; |
1225
|
0
|
|
|
|
|
|
my $output = do { local $/; <$from_kid> }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1226
|
0
|
|
|
|
|
|
waitpid($kid, 0); |
1227
|
0
|
0
|
|
|
|
|
(($? >> 8) == 0) or die("child failed"); |
1228
|
0
|
|
|
|
|
|
return $output; |
1229
|
|
|
|
|
|
|
} |
1230
|
|
|
|
|
|
|
|
1231
|
|
|
|
|
|
|
sub _setup_repo { |
1232
|
0
|
|
|
0
|
|
|
my ($repopath, $remotes) = @_; |
1233
|
0
|
|
|
|
|
|
print "mkdir -p $repopath\n"; |
1234
|
0
|
|
|
|
|
|
make_path($repopath); |
1235
|
0
|
|
|
|
|
|
print "cd $repopath\n"; |
1236
|
0
|
0
|
|
|
|
|
chdir($repopath) or die "Failed to chdir $repopath"; |
1237
|
0
|
|
|
|
|
|
_command_or_die('git', 'init'); |
1238
|
0
|
|
|
|
|
|
_command_or_die('git', 'checkout', '-b', 'placeholder_dont_use'); |
1239
|
0
|
|
|
|
|
|
foreach my $remote (keys %{$remotes}) { |
|
0
|
|
|
|
|
|
|
1240
|
0
|
|
|
|
|
|
_command_or_die('git', 'remote', 'add', $remote, $remotes->{$remote}); |
1241
|
0
|
|
|
|
|
|
_command_or_die('git', 'fetch', $remote); |
1242
|
|
|
|
|
|
|
} |
1243
|
|
|
|
|
|
|
} |
1244
|
|
|
|
|
|
|
|
1245
|
|
|
|
|
|
|
sub _write_json { |
1246
|
0
|
|
|
0
|
|
|
my ($destpath, $obj) = @_; |
1247
|
0
|
0
|
|
|
|
|
open(my $fh, '>', $destpath) or die("Failed to open $destpath for writing"); |
1248
|
0
|
|
|
|
|
|
print $fh JSON::PP->new->pretty->encode($obj); |
1249
|
0
|
|
|
|
|
|
close($fh); |
1250
|
|
|
|
|
|
|
} |
1251
|
|
|
|
|
|
|
|
1252
|
|
|
|
|
|
|
sub _load_json { |
1253
|
0
|
|
|
0
|
|
|
my ($jsonpath) = @_; |
1254
|
0
|
0
|
|
|
|
|
open(my $fh, '<', $jsonpath) or return undef; |
1255
|
0
|
|
|
|
|
|
my $file_content = do { local $/; <$fh> }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1256
|
0
|
|
|
|
|
|
close($fh); |
1257
|
0
|
|
|
|
|
|
return decode_json($file_content); |
1258
|
|
|
|
|
|
|
} |
1259
|
|
|
|
|
|
|
|
1260
|
|
|
|
|
|
|
sub _load_apperl_config { |
1261
|
0
|
|
|
0
|
|
|
my ($apperlconfigs, $cfgname) = @_; |
1262
|
0
|
0
|
|
|
|
|
exists $apperlconfigs->{$cfgname} or die "Unknown config: $cfgname"; |
1263
|
|
|
|
|
|
|
|
1264
|
|
|
|
|
|
|
# find the base classes |
1265
|
0
|
|
|
|
|
|
my $item = $apperlconfigs->{$cfgname}; |
1266
|
0
|
|
|
|
|
|
my @configlist = ($item); |
1267
|
0
|
|
|
|
|
|
while(exists $item->{base}) { |
1268
|
0
|
|
|
|
|
|
$item = $apperlconfigs->{$item->{base}}; |
1269
|
0
|
|
|
|
|
|
push @configlist, $item; |
1270
|
|
|
|
|
|
|
} |
1271
|
0
|
|
|
|
|
|
@configlist = reverse @configlist; |
1272
|
|
|
|
|
|
|
|
1273
|
|
|
|
|
|
|
# build the config from oldest to newest |
1274
|
|
|
|
|
|
|
# keys that start with '+' are appended to the non-plus variant instead of replacing |
1275
|
|
|
|
|
|
|
# keys that start with '-' are removed from the non-plus variant instead of replacing |
1276
|
|
|
|
|
|
|
# Removing a key added the same stage or vice versa is undefined |
1277
|
0
|
|
|
|
|
|
my %itemconfig; |
1278
|
0
|
|
|
|
|
|
foreach my $config (@configlist) { |
1279
|
0
|
|
|
|
|
|
foreach my $key (keys %$config) { |
1280
|
0
|
0
|
|
|
|
|
if($key =~ /^(\+|\-)(.+)/) { |
1281
|
0
|
|
|
|
|
|
my $append = $1 eq '+'; |
1282
|
0
|
|
|
|
|
|
my $realkey = $2; |
1283
|
0
|
0
|
|
|
|
|
exists $itemconfig{$realkey} or die("cannot append without existing key"); |
1284
|
0
|
|
|
|
|
|
my $rtype = ref($itemconfig{$realkey}); |
1285
|
0
|
0
|
|
|
|
|
$rtype or die("not ref"); |
1286
|
0
|
0
|
|
|
|
|
if($append) { |
1287
|
0
|
0
|
|
|
|
|
if($rtype eq 'ARRAY') { |
|
|
0
|
|
|
|
|
|
1288
|
0
|
|
|
|
|
|
$itemconfig{$realkey} = [@{$itemconfig{$realkey}}, @{$config->{$key}}]; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1289
|
|
|
|
|
|
|
} |
1290
|
|
|
|
|
|
|
elsif($rtype eq 'HASH') { |
1291
|
0
|
|
|
|
|
|
foreach my $dest (keys %{$config->{$key}}) { |
|
0
|
|
|
|
|
|
|
1292
|
0
|
|
|
|
|
|
push @{$itemconfig{$realkey}{$dest}}, @{$config->{$key}{$dest}}; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1293
|
|
|
|
|
|
|
} |
1294
|
|
|
|
|
|
|
} |
1295
|
|
|
|
|
|
|
else { |
1296
|
0
|
|
|
|
|
|
die($rtype); |
1297
|
|
|
|
|
|
|
} |
1298
|
|
|
|
|
|
|
} |
1299
|
|
|
|
|
|
|
else { |
1300
|
0
|
0
|
|
|
|
|
if($rtype eq 'ARRAY') { |
1301
|
0
|
|
|
|
|
|
_remove_arr_items_from_arr($itemconfig{$realkey}, $config->{$key}); |
1302
|
|
|
|
|
|
|
} |
1303
|
|
|
|
|
|
|
else { |
1304
|
0
|
|
|
|
|
|
die($rtype); |
1305
|
|
|
|
|
|
|
} |
1306
|
|
|
|
|
|
|
} |
1307
|
|
|
|
|
|
|
} |
1308
|
|
|
|
|
|
|
else { |
1309
|
0
|
|
|
|
|
|
$itemconfig{$key} = $config->{$key}; |
1310
|
|
|
|
|
|
|
} |
1311
|
|
|
|
|
|
|
} |
1312
|
|
|
|
|
|
|
} |
1313
|
|
|
|
|
|
|
|
1314
|
|
|
|
|
|
|
# switch these from relative paths to abs paths |
1315
|
0
|
|
|
|
|
|
foreach my $destdir (keys %{$itemconfig{zip_extra_files}}) { |
|
0
|
|
|
|
|
|
|
1316
|
0
|
|
|
|
|
|
foreach my $path (@{$itemconfig{zip_extra_files}{$destdir}}) { |
|
0
|
|
|
|
|
|
|
1317
|
0
|
|
|
|
|
|
$path = abs_path($path); |
1318
|
0
|
0
|
|
|
|
|
$path or die; |
1319
|
0
|
0
|
|
|
|
|
-e $path or die("missing file $path"); |
1320
|
|
|
|
|
|
|
} |
1321
|
|
|
|
|
|
|
} |
1322
|
|
|
|
|
|
|
|
1323
|
|
|
|
|
|
|
# add in ourselves for bootstrapping, this even works when running internal Perl::Dist::APPerl from a bootstrapped build |
1324
|
0
|
0
|
0
|
|
|
|
if(exists $itemconfig{'include_Perl-Dist-APPerl'} && $itemconfig{'include_Perl-Dist-APPerl'}) { |
1325
|
0
|
|
|
|
|
|
my $thispath = abs_path(__FILE__); |
1326
|
0
|
0
|
|
|
|
|
defined($thispath) or die(__FILE__.'issues?'); |
1327
|
0
|
|
|
|
|
|
push @{$itemconfig{zip_extra_files}{"__perllib__/Perl/Dist"}}, $thispath; |
|
0
|
|
|
|
|
|
|
1328
|
0
|
|
|
|
|
|
my @additionalfiles = map { "$FindBin::Bin/$_" } ('apperlm'); |
|
0
|
|
|
|
|
|
|
1329
|
0
|
|
0
|
|
|
|
-e $_ or die("$_ $!") foreach @additionalfiles; |
1330
|
0
|
|
|
|
|
|
push @{$itemconfig{zip_extra_files}{bin}}, @additionalfiles; |
|
0
|
|
|
|
|
|
|
1331
|
|
|
|
|
|
|
} |
1332
|
|
|
|
|
|
|
|
1333
|
|
|
|
|
|
|
# verify apperl config sanity |
1334
|
0
|
0
|
|
|
|
|
if(! exists $itemconfig{nobuild_perl_bin}) { |
1335
|
0
|
|
0
|
|
|
|
$itemconfig{cosmo_ape_loader} //= 'ape-no-modify-self.o'; |
1336
|
0
|
0
|
0
|
|
|
|
($itemconfig{cosmo_ape_loader} eq 'ape-no-modify-self.o') || ($itemconfig{cosmo_ape_loader} eq 'ape.o') or die "Unknown ape loader: " . $itemconfig{cosmo_ape_loader}; |
1337
|
|
|
|
|
|
|
} |
1338
|
|
|
|
|
|
|
|
1339
|
0
|
|
|
|
|
|
return \%itemconfig; |
1340
|
|
|
|
|
|
|
} |
1341
|
|
|
|
|
|
|
|
1342
|
|
|
|
|
|
|
sub _load_user_project_config { |
1343
|
0
|
|
|
0
|
|
|
return _load_json(PROJECT_TMP_CONFIG_FILE); |
1344
|
|
|
|
|
|
|
} |
1345
|
|
|
|
|
|
|
|
1346
|
|
|
|
|
|
|
sub _load_valid_user_project_config { |
1347
|
0
|
|
|
0
|
|
|
my ($Configs) = @_; |
1348
|
0
|
|
|
|
|
|
my $UserProjectConfig = _load_user_project_config(); |
1349
|
0
|
0
|
|
|
|
|
if($UserProjectConfig) { |
1350
|
0
|
0
|
|
|
|
|
if(exists $UserProjectConfig->{current_apperl}) { |
1351
|
0
|
|
|
|
|
|
my $CurAPPerlName = $UserProjectConfig->{current_apperl}; |
1352
|
0
|
0
|
|
|
|
|
exists $Configs->{apperl_configs}{$CurAPPerlName} or die("non-existent apperl config $CurAPPerlName in user project config"); |
1353
|
0
|
|
|
|
|
|
return $UserProjectConfig; |
1354
|
|
|
|
|
|
|
} |
1355
|
|
|
|
|
|
|
} |
1356
|
0
|
|
|
|
|
|
return undef; |
1357
|
|
|
|
|
|
|
} |
1358
|
|
|
|
|
|
|
|
1359
|
|
|
|
|
|
|
sub _load_valid_user_project_config_with_default { |
1360
|
0
|
|
|
0
|
|
|
my ($Configs) = @_; |
1361
|
0
|
|
|
|
|
|
my $UserProjectConfig = _load_valid_user_project_config($Configs); |
1362
|
0
|
0
|
0
|
|
|
|
return $UserProjectConfig if($UserProjectConfig || !exists $Configs->{defaultconfig}); |
1363
|
0
|
|
|
|
|
|
Set($Configs->{defaultconfig}); |
1364
|
0
|
|
|
|
|
|
return _load_valid_user_project_config($Configs); |
1365
|
|
|
|
|
|
|
} |
1366
|
|
|
|
|
|
|
|
1367
|
|
|
|
|
|
|
sub _write_user_project_config { |
1368
|
0
|
|
|
0
|
|
|
my ($config) = @_; |
1369
|
0
|
0
|
|
|
|
|
if(! -d PROJECT_TMP_DIR) { |
1370
|
0
|
|
|
|
|
|
make_path(PROJECT_TMP_DIR); |
1371
|
|
|
|
|
|
|
}; |
1372
|
0
|
|
|
|
|
|
_write_json(PROJECT_TMP_CONFIG_FILE, $config); |
1373
|
|
|
|
|
|
|
} |
1374
|
|
|
|
|
|
|
|
1375
|
|
|
|
|
|
|
sub _copy_recursive { |
1376
|
0
|
|
|
0
|
|
|
my ($src, $dest) = @_; |
1377
|
0
|
0
|
|
|
|
|
if(! -d $dest) { |
1378
|
0
|
|
|
|
|
|
make_path($dest); |
1379
|
|
|
|
|
|
|
} |
1380
|
0
|
|
|
|
|
|
goto &_copy_recursive_inner; |
1381
|
|
|
|
|
|
|
} |
1382
|
|
|
|
|
|
|
|
1383
|
|
|
|
|
|
|
sub _copy_recursive_inner { |
1384
|
0
|
|
|
0
|
|
|
my ($src, $dest) = @_; |
1385
|
0
|
|
|
|
|
|
print "_copy_recursive $src $dest\n"; |
1386
|
0
|
0
|
|
|
|
|
if(-f $src) { |
|
|
0
|
|
|
|
|
|
1387
|
0
|
0
|
|
|
|
|
copy($src, $dest) or die("Failed to copy $!"); |
1388
|
|
|
|
|
|
|
} |
1389
|
|
|
|
|
|
|
elsif(-d $src) { |
1390
|
0
|
|
|
|
|
|
my $dest = "$dest/".basename($src); |
1391
|
0
|
0
|
|
|
|
|
if(! -d $dest) { |
1392
|
0
|
0
|
|
|
|
|
mkdir($dest) or die("Failed to mkdir $!"); |
1393
|
|
|
|
|
|
|
} |
1394
|
0
|
0
|
|
|
|
|
opendir(my $dh, $src) or die("Failed to opendir"); |
1395
|
0
|
|
|
|
|
|
while(my $file = readdir($dh)) { |
1396
|
0
|
0
|
0
|
|
|
|
next if(($file eq '.') || ($file eq '..')); |
1397
|
0
|
|
|
|
|
|
_copy_recursive("$src/$file", $dest); |
1398
|
|
|
|
|
|
|
} |
1399
|
0
|
|
|
|
|
|
closedir($dh); |
1400
|
|
|
|
|
|
|
} |
1401
|
|
|
|
|
|
|
else { |
1402
|
0
|
|
|
|
|
|
die "Unhandled file type for $src"; |
1403
|
|
|
|
|
|
|
} |
1404
|
|
|
|
|
|
|
} |
1405
|
|
|
|
|
|
|
|
1406
|
|
|
|
|
|
|
1; |
1407
|
|
|
|
|
|
|
|
1408
|
|
|
|
|
|
|
__END__ |