#!/usr/bin/perl -w
our
(
%Build
,
%Targets
,
$Verbose
,
$Test
);
if
(
ord
(
"A"
) == 193) {
print
"1..0 # EBCDIC sort order is different\n"
;
exit
;
}
%Targets
= (
manifest
=>
'MANIFEST'
,
vms
=>
'vms/descrip_mms.template'
,
nmake
=>
'win32/Makefile'
,
gmake
=>
'win32/GNUmakefile'
,
podmak
=>
'win32/pod.mak'
,
unix
=>
'Makefile.SH'
,
);
require
'./Porting/pod_lib.pl'
;
require
'./Porting/manifest_lib.pl'
;
sub
my_die;
{
my
@files
=
keys
%Targets
;
my
$filesopts
=
join
(
" | "
,
map
{
"--build-$_"
}
"all"
,
sort
@files
);
my
$showfiles
;
my
%build_these
;
die
"$0: Usage: $0 [--verbose] [--showfiles] [$filesopts]\n"
unless
GetOptions (
verbose
=> \
$Verbose
,
showfiles
=> \
$showfiles
,
tap
=> \
$Test
,
map
{+
"build-$_"
, \
$build_these
{
$_
}}
@files
,
'all'
)
&& !
@ARGV
;
if
(
$build_these
{all}) {
%Build
=
%Targets
;
}
else
{
while
(
my
(
$file
,
$want
) =
each
%build_these
) {
$Build
{
$file
} =
$Targets
{
$file
}
if
$want
;
}
%Build
=
%Targets
if
!
%Build
;
}
if
(
$showfiles
) {
print
join
(
" "
,
sort
{
lc
$a
cmp
lc
$b
}
values
%Build
),
"\n"
;
exit
(0);
}
}
if
(
$Verbose
) {
print
"I will be building $_\n"
foreach
sort
keys
%Build
;
}
my
$test
= 1;
my
$state
=
$Test
? get_pod_metadata(0,
sub
{
printf
"1..%d\n"
, 1 +
scalar
keys
%Build
;
if
(
@_
) {
print
"not ok $test # got Pod metadata\n"
;
die
@_
;
}
print
"ok $test # got Pod metadata\n"
;
})
: get_pod_metadata(1,
sub
{
warn
@_
if
@_
},
values
%Build
);
sub
generate_manifest {
my
@temp
= unexpand (
map
{
sprintf
"%-32s%s"
,
@$_
}
@_
);
map
{s/ \t/\t\t/g;
$_
}
@temp
;
}
sub
generate_manifest_pod {
generate_manifest
map
{[
"pod/$_.pod"
,
$state
->{pods}{
$_
}]}
sort
grep
{
!
$state
->{copies}{
"$_.pod"
}
&& !
$state
->{generated}{
"$_.pod"
}
&& !-e
"$_.pod"
}
keys
%{
$state
->{pods}};
}
sub
generate_manifest_readme {
generate_manifest
sort
{
$a
->[0] cmp
$b
->[0]}
[
"README.vms"
,
"Notes about installing the VMS port"
],
map
{[
"README.$_"
,
$state
->{readmes}{
$_
}]}
keys
%{
$state
->{readmes}};
}
sub
generate_nmake_1 {
(
map
{
sprintf
"\tcopy ..\\README.%-8s ..\\pod\\perl$_.pod\n"
,
$_
}
sort
keys
%{
$state
->{readmes}}),
(
map
{
"\tcopy ..\\pod\\$state->{copies}{$_} ..\\pod\\$_\n"
}
sort
keys
%{
$state
->{copies}});
}
sub
generate_nmake_2 {
local
$Text::Wrap::columns
= 76;
my
$line
= wrap (
"\t "
,
"\t "
,
join
" "
,
sort
(
keys
%{
$state
->{copies}},
keys
%{
$state
->{generated}},
map
{
"perl$_.pod"
}
keys
%{
$state
->{readmes}}));
$line
=~ s/$/ \\/mg;
$line
=~ s/ \\$//;
$line
;
}
sub
generate_pod_mak {
my
$variable
=
shift
;
my
@lines
;
my
$line
=
"\U$variable = "
.
join
"\t\\\n\t"
,
map
{
"$_.$variable"
}
sort
grep
{
$_
!~ m{/} }
keys
%{
$state
->{pods}};
$line
=~ s/.
*perltoc
.html.*\n//m;
$line
;
}
sub
do_manifest {
my
(
$name
,
$prev
) =
@_
;
my
@manifest
=
grep
{! m!^pod/[^. \t]+\.pod.*!}
grep
{! m!^README\.(\S+)! ||
$state
->{ignore}{$1}}
split
"\n"
,
$prev
;
join
"\n"
, sort_manifest(
@manifest
,
&generate_manifest_pod
(),
&generate_manifest_readme
()
),
''
,
;
}
sub
do_nmake {
my
(
$name
,
$makefile
) =
@_
;
my
$re
=
qr/^\tcopy \.\.\\README[^\n]*\n/
sm;
$makefile
= verify_contiguous(
$name
,
$makefile
,
$re
,
'README copies'
);
1
while
$makefile
=~ s/\0\tcopy .*\n/\0/gm;
$makefile
=~ s/\0+/
join
(
""
,
&generate_nmake_1
)/se;
$makefile
=~ s{(-cd \$\(PODDIR\) && del /f[^\n]+).*?(-cd \.\.\\utils && del /f)}
{
"$1\n"
.
&generate_nmake_2
.
"\n\t$2"
}se;
$makefile
;
}
*do_gmake
=
*do_gmake
= \
&do_nmake
;
sub
do_podmak {
my
(
$name
,
$body
) =
@_
;
foreach
my
$variable
(
qw(pod man html tex)
) {
my_die
"could not find $variable in $name"
unless
$body
=~ s{\n\U
$variable
\E = (?:[^\n]*\\\n)*[^\n]*}
{
"\n"
. generate_pod_mak (
$variable
)}se;
}
$body
;
}
sub
do_vms {
my
(
$name
,
$makefile
) =
@_
;
my
$re
=
qr{\nPERLDELTA_CURRENT\s+=\s+\Q[.pod]perl\E\d+delta\.pod\n}
smx;
$makefile
= verify_contiguous(
$name
,
$makefile
,
$re
,
'current perldelta macro'
);
$makefile
=~ s/\0+/
join
"\n"
,
''
,
"PERLDELTA_CURRENT = [.pod]$state->{delta_target}"
,
''
/se;
$makefile
;
}
sub
do_unix {
my
(
$name
,
$makefile_SH
) =
@_
;
$makefile_SH
=~ s{^(perltoc_pod_prereqs = extra.pods).*}
{
join
' '
, $1,
map
"pod/$_"
,
sort
(
keys
%{
$state
->{copies}},
grep
{!/perltoc/}
keys
%{
$state
->{generated}})
}mge;
my
$re
=
qr{(
pod/perl[a-z0-9_]+\.pod: pod/perl[a-z0-9_]+\.pod
\$\(RMS\) pod/perl[a-z0-9_]+\.pod
\$\(LNS\) perl[a-z0-9_]+\.pod pod/perl[a-z0-9_]+\.pod
)+}
sm;
$makefile_SH
= verify_contiguous(
$name
,
$makefile_SH
,
$re
,
'copy rules'
);
my
@copy_rules
=
map
"
pod/
$_
: pod/
$state
->{copies}{
$_
}
\$(RMS) pod/
$_
\$(LNS)
$state
->{copies}{
$_
} pod/
$_
",
keys
%{
$state
->{copies}};
$makefile_SH
=~ s/\0+/
join
''
,
@copy_rules
/se;
$makefile_SH
;
}
process(
$_
,
$Build
{
$_
}, main->can(
"do_$_"
),
$Test
&& ++
$test
,
$Verbose
)
foreach
sort
keys
%Build
;