2017-11-29 04:44:05 +02:00
|
|
|
####################################################################################################################################
|
|
|
|
# Auto-Generate Option Definition for Parsing with getopt_long().
|
|
|
|
####################################################################################################################################
|
|
|
|
package pgBackRestBuild::Config::BuildParse;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings FATAL => qw(all);
|
|
|
|
use Carp qw(confess);
|
|
|
|
use English '-no_match_vars';
|
|
|
|
|
|
|
|
use Cwd qw(abs_path);
|
|
|
|
use Exporter qw(import);
|
|
|
|
our @EXPORT = qw();
|
|
|
|
use File::Basename qw(dirname);
|
|
|
|
use Storable qw(dclone);
|
|
|
|
|
|
|
|
use pgBackRest::Common::Log;
|
|
|
|
use pgBackRest::Common::String;
|
|
|
|
use pgBackRest::Version;
|
|
|
|
|
|
|
|
use pgBackRestBuild::Build::Common;
|
|
|
|
use pgBackRestBuild::Config::Build;
|
|
|
|
use pgBackRestBuild::Config::Data;
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Constants
|
|
|
|
####################################################################################################################################
|
|
|
|
use constant BLDLCL_FILE_DEFINE => 'parse';
|
|
|
|
|
|
|
|
use constant BLDLCL_DATA_OPTION => '01-dataOption';
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Definitions for constants and data to build
|
|
|
|
####################################################################################################################################
|
|
|
|
my $strSummary = 'Option Parse Definition';
|
|
|
|
|
|
|
|
my $rhBuild =
|
|
|
|
{
|
|
|
|
&BLD_FILE =>
|
|
|
|
{
|
|
|
|
&BLDLCL_FILE_DEFINE =>
|
|
|
|
{
|
|
|
|
&BLD_SUMMARY => $strSummary,
|
|
|
|
|
|
|
|
&BLD_DATA =>
|
|
|
|
{
|
|
|
|
&BLDLCL_DATA_OPTION =>
|
|
|
|
{
|
|
|
|
&BLD_SUMMARY => 'Option parse data',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
####################################################################################################################################
|
|
|
|
# Build configuration constants and data
|
|
|
|
####################################################################################################################################
|
|
|
|
sub buildConfigParse
|
|
|
|
{
|
|
|
|
# Build option parse list
|
|
|
|
#-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
my $rhConfigDefine = cfgDefine();
|
|
|
|
|
|
|
|
my $strBuildSource =
|
|
|
|
"static const struct option optionList[] =\n" .
|
|
|
|
"{\n";
|
|
|
|
|
|
|
|
foreach my $strOption (sort(keys(%{$rhConfigDefine})))
|
|
|
|
{
|
|
|
|
my $rhOption = $rhConfigDefine->{$strOption};
|
|
|
|
my $strOptionEnum = buildConfigOptionEnum($strOption);
|
|
|
|
my $strOptionArg = ($rhOption->{&CFGDEF_TYPE} ne CFGDEF_TYPE_BOOLEAN ? " .has_arg = required_argument,\n" : '');
|
|
|
|
my $strOptionPrefix = $rhConfigDefine->{$strOption}{&CFGDEF_PREFIX};
|
|
|
|
|
|
|
|
for (my $iOptionIdx = 0; $iOptionIdx <= $rhOption->{&CFGDEF_INDEX_TOTAL}; $iOptionIdx++)
|
|
|
|
{
|
|
|
|
# Don't and option indexes if it is not indexeds
|
|
|
|
next if ($iOptionIdx == 1 && $rhOption->{&CFGDEF_INDEX_TOTAL} == 1);
|
|
|
|
|
|
|
|
# Generate option name
|
|
|
|
my $strOptionName = $iOptionIdx > 0 ?
|
|
|
|
"${strOptionPrefix}${iOptionIdx}-" . substr($strOption, length($strOptionPrefix) + 1) : $strOption;
|
|
|
|
|
|
|
|
# Generate option value used for parsing (offset is added so options don't conflict with getopt_long return values)
|
2017-12-05 17:09:07 +02:00
|
|
|
my $strOptionFlag = 'PARSE_OPTION_FLAG |';
|
|
|
|
|
|
|
|
my $strOptionVal =
|
|
|
|
($iOptionIdx > 1 ? "(" : '') . $strOptionEnum . ($iOptionIdx > 1 ? " + " . ($iOptionIdx - 1) . ')' : '');
|
2017-11-29 04:44:05 +02:00
|
|
|
|
|
|
|
# Add option
|
|
|
|
$strBuildSource .=
|
|
|
|
" {\n" .
|
|
|
|
" .name = \"${strOptionName}\",\n" .
|
|
|
|
$strOptionArg .
|
2017-12-05 17:09:07 +02:00
|
|
|
" .val = ${strOptionFlag} ${strOptionVal},\n" .
|
2017-11-29 04:44:05 +02:00
|
|
|
" },\n";
|
|
|
|
|
|
|
|
# Add negation when defined
|
|
|
|
if ($rhOption->{&CFGDEF_NEGATE})
|
|
|
|
{
|
|
|
|
$strBuildSource .=
|
|
|
|
" {\n" .
|
|
|
|
" .name = \"no-${strOptionName}\",\n" .
|
2017-12-05 17:09:07 +02:00
|
|
|
" .val = ${strOptionFlag} PARSE_NEGATE_FLAG | ${strOptionVal},\n" .
|
2017-11-29 04:44:05 +02:00
|
|
|
" },\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# The option list needs to be terminated or getopt_long will just keep on reading
|
|
|
|
$strBuildSource .=
|
|
|
|
" // Terminate option list\n" .
|
|
|
|
" {\n" .
|
|
|
|
" .name = NULL\n" .
|
|
|
|
" }\n" .
|
|
|
|
"};\n";
|
|
|
|
|
|
|
|
$rhBuild->{&BLD_FILE}{&BLDLCL_FILE_DEFINE}{&BLD_DATA}{&BLDLCL_DATA_OPTION}{&BLD_SOURCE} = $strBuildSource;
|
|
|
|
|
|
|
|
return $rhBuild;
|
|
|
|
}
|
|
|
|
|
|
|
|
push @EXPORT, qw(buildConfigParse);
|
|
|
|
|
|
|
|
1;
|