App-hopen
view release on metacpan or search on metacpan
lib/App/hopen.pm view on Meta::CPAN
our $_did_set_phase = false;
# Whether the current hopen file called set_phase()
=head2 C<$_hf_pkg_idx>
Used to give each hopen file or C<-e> a unique package name.
=cut
my $_hf_pkg_idx = 0; # unique ID for the packages of hopen files
# }}}1
# === Command line parsing ============================================== {{{1
=head2 %CMDLINE_OPTS
A hash from internal name to array reference of
[getopt-name, getopt-options, optional default-value].
If default-value is a reference, it will be the destination for that value.
=cut
my %CMDLINE_OPTS = (
# They are listed in alphabetical order by option name,
# lowercase before upper, although the code does not require that order.
ARCHITECTURE => ['a','|A|architecture|platform=s'],
# -A and --platform are for the comfort of folks migrating from CMake
BUILD => ['build'], # If specified, do not
# run any phases. Instead, run the
# build tool indicated by the generator.
#DUMP_VARS => ['d', '|dump-variables', false],
#DEBUG => ['debug','', false],
DEFINE => ['D',':s%'],
EVAL => ['e','|eval=s@'], # Perl source to run as a hopen file
#RESTRICTED_EVAL => ['E','|exec=s@'],
# TODO add -f to specify additional hopen files
FRESH => ['fresh'], # Don't run MY.hopen.pl
PROJ_DIR => ['from','=s'],
GENERATOR => ['g', '|G|generator=s', 'Make'], # -G is from CMake
# *** This is where the default generator is set ***
# TODO? add an option to pass parameters to the generator?
# E.g., which make(1) to use? Or maybe that should be part of the
# ARCHITECTURE string.
#GO => ['go'], # TODO implement this --- if specified, run all phases
# and invoke the build tool without requiring the user to
# re-run hopen.
# -h and --help reserved
#INCLUDE => ['i','|include=s@'],
#LIB => ['l','|load=s@'], # TODO implement this. A separate option
# for libs only used for hopen files?
#LANGUAGE => ['L','|language:s'],
# --man reserved
# OUTPUT_FILENAME => ['o','|output=s', ""],
# OPTIMIZE => ['O','|optimize'],
PHASE => ['phase','=s'], # NO DEFAULT so we can tell if --phase was used
QUIET => ['q'],
#SANDBOX => ['S','|sandbox',false],
#SOURCES reserved
TOOLSET => ['t','|T|toolset=s'], # -T is from CMake
DEST_DIR => ['to','=s'],
# --usage reserved
PRINT_VERSION => ['version','', false],
VERBOSE => ['v','+', 0],
VERBOSE2 => ['verbose',':s'], # --verbose=<n>
# -? reserved
);
=head1 INTERNAL FUNCTIONS
=cut
sub _parse_command_line { # {{{2
=head2 _parse_command_line
Takes {into=>hash ref, from=>array ref}. Fills in the hash with the
values from the command line, keyed by the keys in L</%CMDLINE_OPTS>.
=cut
my %params = @_;
#local @_Sources;
my $hrOptsOut = $params{into};
# Easier syntax for checking whether optional args were provided.
# Syntax thanks to http://www.perlmonks.org/?node_id=696592
local *have = sub { return exists($hrOptsOut->{ $_[0] }); };
# Set defaults so we don't have to test them with exists().
%$hrOptsOut = ( # map getopt option name to default value
map { $CMDLINE_OPTS{ $_ }->[0] => $CMDLINE_OPTS{ $_ }[2] }
grep { (scalar @{$CMDLINE_OPTS{ $_ }})==3 }
keys %CMDLINE_OPTS
);
# Get options
my $opts_ok = GetOptionsFromArray(
$params{from}, # source array
$hrOptsOut, # destination hash
'usage|?', 'h|help', 'man', # options we handle here
map { $_->[0] . ($_->[1] // '') } values %CMDLINE_OPTS, # options strs
);
# Help, if requested
if(!$opts_ok || have('usage') || have('h') || have('man')) {
# Only pull in the Pod routines if we actually need them.
# Terminal formatting, if present.
( run in 0.786 second using v1.01-cache-2.11-cpan-13bb782fe5a )