mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2024-12-14 10:13:05 +02:00
b03c26968a
Contributed by Cynthia Shang.
331 lines
9.6 KiB
Perl
331 lines
9.6 KiB
Perl
####################################################################################################################################
|
|
# Auto-Generate XS and PM Files Required for Perl
|
|
####################################################################################################################################
|
|
package pgBackRestLibC::Build;
|
|
|
|
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 lib dirname($0) . '/../build/lib';
|
|
use lib dirname($0) . '/../lib';
|
|
|
|
use pgBackRest::Common::Log;
|
|
use pgBackRest::Common::String;
|
|
use pgBackRest::Config::Data;
|
|
use pgBackRest::Storage::Local;
|
|
use pgBackRest::Storage::Posix::Driver;
|
|
use pgBackRest::Version;
|
|
|
|
use pgBackRestBuild::Build;
|
|
use pgBackRestBuild::Build::Common;
|
|
|
|
use pgBackRestLibC::Config::Build;
|
|
use pgBackRestLibC::Config::BuildDefine;
|
|
|
|
####################################################################################################################################
|
|
# Perl function and constant exports
|
|
####################################################################################################################################
|
|
use constant BLD_EXPORTTYPE_SUB => 'sub';
|
|
use constant BLD_EXPORTTYPE_CONSTANT => 'constant';
|
|
|
|
use constant LIB_AUTO_NAME => 'LibCAuto';
|
|
|
|
####################################################################################################################################
|
|
# Static exports
|
|
####################################################################################################################################
|
|
my $rhExport =
|
|
{
|
|
'checksum' =>
|
|
{
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
pageChecksum
|
|
pageChecksumBufferTest
|
|
pageChecksumTest
|
|
)],
|
|
},
|
|
|
|
'cipher' =>
|
|
{
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
CIPHER_MODE_ENCRYPT
|
|
CIPHER_MODE_DECRYPT
|
|
)],
|
|
},
|
|
|
|
'config' =>
|
|
{
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
cfgCommandName
|
|
cfgOptionIndex
|
|
cfgOptionIndexTotal
|
|
cfgOptionName
|
|
)],
|
|
},
|
|
|
|
'configDefine' =>
|
|
{
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
cfgCommandId
|
|
cfgDefOptionAllowList
|
|
cfgDefOptionAllowListValue
|
|
cfgDefOptionAllowListValueTotal
|
|
cfgDefOptionAllowListValueValid
|
|
cfgDefOptionAllowRange
|
|
cfgDefOptionAllowRangeMax
|
|
cfgDefOptionAllowRangeMin
|
|
cfgDefOptionDefault
|
|
cfgDefOptionDepend
|
|
cfgDefOptionDependOption
|
|
cfgDefOptionDependValue
|
|
cfgDefOptionDependValueTotal
|
|
cfgDefOptionDependValueValid
|
|
cfgDefOptionNameAlt
|
|
cfgDefOptionNegate
|
|
cfgDefOptionPrefix
|
|
cfgDefOptionRequired
|
|
cfgDefOptionSection
|
|
cfgDefOptionSecure
|
|
cfgDefOptionType
|
|
cfgDefOptionValid
|
|
cfgOptionId
|
|
cfgOptionTotal
|
|
)],
|
|
},
|
|
|
|
'debug' =>
|
|
{
|
|
&BLD_EXPORTTYPE_CONSTANT => [qw(
|
|
UVSIZE
|
|
)],
|
|
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
libcVersion
|
|
)],
|
|
},
|
|
|
|
'encode' =>
|
|
{
|
|
&BLD_EXPORTTYPE_CONSTANT => [qw(
|
|
ENCODE_TYPE_BASE64
|
|
)],
|
|
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
decodeToBin
|
|
encodeToStr
|
|
)],
|
|
},
|
|
|
|
'random' =>
|
|
{
|
|
&BLD_EXPORTTYPE_SUB => [qw(
|
|
randomBytes
|
|
)],
|
|
},
|
|
};
|
|
|
|
####################################################################################################################################
|
|
# Execute all build functions
|
|
####################################################################################################################################
|
|
sub buildXsAll
|
|
{
|
|
my $strBuildPath = shift;
|
|
|
|
my $rhBuild =
|
|
{
|
|
'config' =>
|
|
{
|
|
&BLD_DATA => buildXsConfig(),
|
|
&BLD_PATH => 'xs/config',
|
|
},
|
|
|
|
'configDefine' =>
|
|
{
|
|
&BLD_DATA => buildXsConfigDefine(),
|
|
&BLD_PATH => 'xs/config',
|
|
},
|
|
};
|
|
|
|
buildAll($strBuildPath, $rhBuild, 'xs');
|
|
|
|
# Storage
|
|
my $oStorage = new pgBackRest::Storage::Local(
|
|
$strBuildPath, new pgBackRest::Storage::Posix::Driver({bFileSync => false, bPathSync => false}));
|
|
|
|
# Get current version
|
|
my $strVersion = BACKREST_VERSION;
|
|
my $bDev = false;
|
|
|
|
if ($strVersion =~ /dev$/)
|
|
{
|
|
$strVersion = substr($strVersion, 0, length($strVersion) - 3) . '.999';
|
|
$bDev = true;
|
|
}
|
|
|
|
# Build interface file
|
|
my $strContent =
|
|
('#' x 132) . "\n" .
|
|
'# ' . bldAutoWarning('Build.pm') . "\n" .
|
|
('#' x 132) . "\n" .
|
|
"package pgBackRest::LibCAuto;\n" .
|
|
"\n" .
|
|
"# Library version (.999 indicates development version)\n" .
|
|
"sub libcAutoVersion\n" .
|
|
"{\n" .
|
|
" return '${strVersion}';\n" .
|
|
"}\n";
|
|
|
|
# Generate constants for options that have a list of strings as allowed values
|
|
my $rhConfigDefine = cfgDefine();
|
|
my $strConstantBlock;
|
|
|
|
foreach my $strOption (sort(keys(%{$rhConfigDefine})))
|
|
{
|
|
my $rhOption = $rhConfigDefine->{$strOption};
|
|
|
|
next if $rhOption->{&CFGDEF_TYPE} ne CFGDEF_TYPE_STRING;
|
|
next if $strOption =~ /^log-level-/;
|
|
|
|
if (defined($rhOption->{&CFGDEF_ALLOW_LIST}))
|
|
{
|
|
$strConstantBlock .= defined($strConstantBlock) ? "\n" : '';
|
|
|
|
foreach my $strValue (@{$rhOption->{&CFGDEF_ALLOW_LIST}})
|
|
{
|
|
my $strConstant = 'CFGOPTVAL_' . uc("${strOption}_${strValue}");
|
|
$strConstant =~ s/\-/\_/g;
|
|
|
|
$strConstantBlock .= " ${strConstant}" . (' ' x (69 - length($strConstant) - 4)) . "=> '${strValue}',\n";
|
|
push(@{$rhExport->{'config'}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant);
|
|
}
|
|
}
|
|
|
|
foreach my $strCommand (sort(keys(%{$rhOption->{&CFGDEF_COMMAND}})))
|
|
{
|
|
my $rhCommand = $rhOption->{&CFGDEF_COMMAND}{$strCommand};
|
|
|
|
if (defined($rhCommand->{&CFGDEF_ALLOW_LIST}))
|
|
{
|
|
$strConstantBlock .= defined($strConstantBlock) ? "\n" : '';
|
|
|
|
foreach my $strValue (@{$rhCommand->{&CFGDEF_ALLOW_LIST}})
|
|
{
|
|
my $strConstant = 'CFGOPTVAL_' . uc("${strCommand}_${strOption}_${strValue}");
|
|
$strConstant =~ s/\-/\_/g;
|
|
|
|
$strConstantBlock .= " ${strConstant}" . (' ' x (69 - length($strConstant) - 4)) . "=> '${strValue}',\n";
|
|
push(@{$rhExport->{'config'}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$strContent .=
|
|
"\n" .
|
|
"# Configuration option value constants\n" .
|
|
"sub libcAutoConstant\n" .
|
|
"{\n" .
|
|
" return\n" .
|
|
" {\n" .
|
|
" " . trim($strConstantBlock) . "\n" .
|
|
" }\n" .
|
|
"}\n";
|
|
|
|
foreach my $strBuild (sort(keys(%{$rhBuild})))
|
|
{
|
|
foreach my $strFile (sort(keys(%{$rhBuild->{$strBuild}{&BLD_DATA}{&BLD_FILE}})))
|
|
{
|
|
my $rhFileConstant = $rhBuild->{$strBuild}{&BLD_DATA}{&BLD_FILE}{$strFile}{&BLD_CONSTANT_GROUP};
|
|
|
|
foreach my $strConstantGroup (sort(keys(%{$rhFileConstant})))
|
|
{
|
|
my $rhConstantGroup = $rhFileConstant->{$strConstantGroup};
|
|
|
|
foreach my $strConstant (sort(keys(%{$rhConstantGroup->{&BLD_CONSTANT}})))
|
|
{
|
|
my $rhConstant = $rhConstantGroup->{&BLD_CONSTANT}{$strConstant};
|
|
|
|
if ($rhConstant->{&BLD_CONSTANT_EXPORT})
|
|
{
|
|
push(@{$rhExport->{$strBuild}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Generate export tags
|
|
my $strExportTags;
|
|
|
|
foreach my $strSection (sort(keys(%{$rhExport})))
|
|
{
|
|
my $rhExportSection = $rhExport->{$strSection};
|
|
|
|
$strExportTags .= (defined($strExportTags) ? "\n" : '') . " ${strSection} =>\n [\n";
|
|
|
|
if (defined($rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}) && @{$rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}} > 0)
|
|
{
|
|
foreach my $strConstant (@{$rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}})
|
|
{
|
|
$strExportTags .= " '${strConstant}',\n";
|
|
}
|
|
}
|
|
|
|
if (defined($rhExportSection->{&BLD_EXPORTTYPE_SUB}) && @{$rhExportSection->{&BLD_EXPORTTYPE_SUB}} > 0)
|
|
{
|
|
foreach my $strSub (@{$rhExportSection->{&BLD_EXPORTTYPE_SUB}})
|
|
{
|
|
$strExportTags .= " '${strSub}',\n";
|
|
}
|
|
}
|
|
|
|
$strExportTags .= " ],\n";
|
|
}
|
|
|
|
$strContent .=
|
|
"\n" .
|
|
"# Export function and constants\n" .
|
|
"sub libcAutoExportTag\n" .
|
|
"{\n" .
|
|
" return\n" .
|
|
" {\n" .
|
|
$strExportTags .
|
|
" }\n" .
|
|
"}\n";
|
|
|
|
# Add module end marker
|
|
$strContent .=
|
|
"\n" .
|
|
"1;\n";
|
|
|
|
# Only save the file if it has changed
|
|
my $strLibFile = 'lib/' . BACKREST_NAME . '/' . LIB_AUTO_NAME . '.pm';
|
|
my $bChanged = true;
|
|
|
|
if ($oStorage->exists($strLibFile))
|
|
{
|
|
my $strContentOld = ${$oStorage->get($strLibFile)};
|
|
|
|
if ($strContent eq $strContentOld)
|
|
{
|
|
$bChanged = false;
|
|
}
|
|
}
|
|
|
|
if ($bChanged)
|
|
{
|
|
$oStorage->put($strLibFile, $strContent);
|
|
}
|
|
}
|
|
|
|
push @EXPORT, qw(buildXsAll);
|
|
|
|
1;
|