+my %Extensions = map {($_,$_)}
+ qw(dynamic_ext static_ext extensions known_extensions);
+
+# The plan is that this information is used by ExtUtils::MakeMaker to generate
+# Makefile dependencies, rather than hardcoding a list, which has become out
+# of date. However, currently, MM_Unix.pm and MM_VMS.pm have *different* lists,
+# *and* descrip_mms.template doesn't actually install all the headers.
+# The "Unix" list seems to (attempt to) avoid the generated headers, which I'm
+# not sure is the right thing to do. Also, not certain whether it would be
+# easier to parse MANIFEST to get these (adding config.h, and potentially
+# removing others), but for now, stick to a hard coded list.
+
+# Could use a map to add ".h", but I suspect that it's easier to use literals,
+# so that anyone using grep will find them
+# This is the list from MM_VMS, plus pad.h, parser.h, perlsfio.h utf8.h
+# which it installs. It *doesn't* install perliol.h - FIXME.
+my @header_files = qw(EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h
+ embed.h embedvar.h form.h gv.h handy.h hv.h intrpvar.h
+ iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h
+ pad.h parser.h patchlevel.h perl.h perlio.h perlsdio.h
+ perlsfio.h perlvars.h perly.h pp.h pp_proto.h proto.h
+ regcomp.h regexp.h regnodes.h scope.h sv.h thread.h utf8.h
+ util.h);
+
+# No point in adding fakethr.h, as it no longer works
+push @header_files,
+ $^O eq 'VMS' ? 'vmsish.h' : qw(dosish.h perliol.h time64.h unixish.h);
+
+my $header_files = ' return qw(' . join(' ', sort @header_files) . ');';
+$header_files =~ s/(?=.{64}) # If line is still overlength
+ (.{1,64})\ # Split at the last convenient space
+ /$1\n /gx;
+
+# allowed opts as well as specifies default and initial values
+my %Allowed_Opts = (
+ 'cross' => '', # --cross=PLATFORM - crosscompiling for PLATFORM
+ 'glossary' => 1, # --no-glossary - no glossary file inclusion,
+ # for compactness
+ 'chdir' => '', # --chdir=dir - change directory before writing files
+);
+
+sub opts {
+ # user specified options
+ my %given_opts = (
+ # --opt=smth
+ (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
+ # --opt --no-opt --noopt
+ (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
+ );
+
+ my %opts = (%Allowed_Opts, %given_opts);
+
+ for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
+ warn "option '$opt' is not recognized";
+ usage;
+ }
+ @ARGV = grep {!/^--/} @ARGV;
+
+ return %opts;
+}
+
+
+my %Opts = opts();