X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/cbae9e740c7aea5b544e3cfc64af31820699f200..cea451c53287e51175c9bbe1a4fd607d1db7a02a:/release-process/scripts/mk_exim_release diff --git a/release-process/scripts/mk_exim_release b/release-process/scripts/mk_exim_release index 84d26e777..ed075b42b 100755 --- a/release-process/scripts/mk_exim_release +++ b/release-process/scripts/mk_exim_release @@ -1,5 +1,5 @@ #!/usr/bin/env perl -# Copyright (c) The Exim Maintainers 2016-2018 +# Copyright (c) The Exim Maintainers 2016 - 2023 use strict; use warnings; @@ -12,6 +12,7 @@ use Getopt::Long; use IO::File; use Pod::Usage; use Digest::SHA; +use feature 'state'; use if $ENV{DEBUG} => 'Smart::Comments'; my $ME = basename $0; @@ -26,7 +27,7 @@ my $version_pattern = qr/ (? (? (?\d) # 4 - \.(?\d\d) # .90 + \.(?\d+) # .90 or .105 (?:\.(?\d+) # .0 (?:\.(?)\d+)?)? # .22 ) # target-release ->| @@ -38,7 +39,7 @@ my $quick_version_pattern = qr/ (? (? (?\d) # 4 - \.(?\d\d) # .90 + \.(?\d+) # .90 or .105 (?:\.(?\d+) # .0 (?:\.(?)\d+)?)? # .22 ) # last-tag ->| @@ -87,6 +88,19 @@ package Context { # rc|quick => RC4 | 27-gabcdef # } + # + # v => { + # release => 4.92-RC4 | 4.92-27-gabcdef-dirty + # target_release|last_tag => 4.92 | 4.92 + # + # major => 4 + # minor => 92 + # security => + # fixes => + # + # rc|quick => RC4 | 27-gabcdef-dirty + # } + if ($context->{quick}) { # Try to find suitable version description chomp(my $describe = do { # we wrap it into a open() to avoid hassle with @@ -148,7 +162,9 @@ package Context { my $workspace = $context->{workspace}; if (not defined $workspace) { - $workspace = $context->{workspace} = File::Temp->newdir(File::Spec->tmpdir . '/exim-packaging-XXXX'); + $workspace = $context->{workspace} = File::Temp->newdir( + TEMPLATE => File::Spec->tmpdir . '/exim-packaging-XXXX', + CLEANUP => $context->{cleanup}); } else { # ensure the working directory is not in place @@ -242,8 +258,8 @@ package Context { #my $stamp = $context->{minor} ? '_'.$context->{minor} : ''; #$stamp .= $context->{rc} if $context->{rc}; - my $release = $context->{v}{rc} ? $context->{v}{target_release} - : $context->{v}{last_tag}; + my $release = $context->{quick} ? $context->{v}{last_tag} + : $context->{v}{target_release}; my $variant = $context->{v}{rc} ? $context->{v}{rc} @@ -292,12 +308,8 @@ __ chdir $docdir or die "$ME: Can't chdir to $docdir: $!\n"; system('./OS-Fixups') == 0 or exit $?; exec $context->{make_cmd}, - "EXIM_VER=$context->{v}{target_release}" . - ($context->{v}{rc} ? "-$context->{v}{rc}" - : $context->{v}{quick} ? "-$context->{v}{quick}" - : ''), - 'everything'; - die "$ME: [$cwd] Cannot exec $context->{make_cmd}: $!\n"; + "EXIM_VER=$context->{v}{release}", 'everything' + or die "$ME: [$cwd] Cannot exec $context->{make_cmd}: $!\n"; } else { waitpid($pid, 0); @@ -475,51 +487,51 @@ __ ) if qx/tar --help 2>&1/ =~ /^\s*--owner=/m; # See also environment variables set in main, tuning compression levels - my %COMPRESSION = ( - gzip => { extension => 'gz', flags => '--gzip' }, - bzip2 => { extension => 'bz2', flags => '--bzip2' }, - lzip => { extension => 'lz', flags => '--lzip' }, - xz => { extension => 'xz', flags => '--xz' }, - ); - - my (%size, %sha256); + my (%size, %sha256, %sha512); foreach my $dir ( glob( catdir( $pkg_trees, ( 'exim*-' . $context->{v}{release} ) ) ) ) { my $dirname = ( splitdir($dir) )[-1]; - foreach my $comp (keys %COMPRESSION) { - next unless $context->{compressors}{$comp}; + foreach my $comp (keys %{$context->{compressors}}) { + my %compressor = %{$context->{compressors}{$comp}}; + next unless $compressor{use}; - my $basename = "$dirname.tar.$COMPRESSION{$comp}{extension}"; + my $basename = "$dirname.tar.$compressor{extension}"; my $outfile = catfile $pkg_tars, $basename; print "Creating: $outfile\n" if $verbose || $debug; 0 == system($tar, cf => $outfile, - $COMPRESSION{$comp}{flags}, + $compressor{flags}, @ownership, -C => $pkg_trees, $dirname) or exit $? >> 8; # calculate size and md5sum $size{$basename} = -s $outfile; - $sha256{$basename} = do { - my $sha = Digest::SHA->new(256); - $sha->addfile($outfile); - $sha->hexdigest; - }; + $sha256{$basename} = Digest::SHA->new(256)->addfile($outfile)->hexdigest; + $sha512{$basename} = Digest::SHA->new(512)->addfile($outfile)->hexdigest; } } # write the sizes file if ($context->{sizes}) { - open my $sizes, '>', $_ = catfile $pkg_tars, 'sizes.txt' - or die "$ME: Can't open `$_': $!\n"; + for ([ sizes => 'SIZE' => \%size ], + [ sha256sums => 'SHA256' => \%sha256 ], + [ sha512sums => 'SHA512' => \%sha512 ]) { + + my $outfile = catfile $pkg_tars, "00-$_->[0].txt"; + my $tag = $_->[1]; + my $sizes = $_->[2]; - print $sizes join "\n", - (map { "SIZE($_) = $size{$_}" } sort keys %size), - (map { "SHA256($_) = $sha256{$_}" } sort keys %sha256); + open my $out, '>', $outfile + or die "$ME: Can't open `$outfile': $!\n"; - close($sizes) or die "$ME: Can't close $_: $!\n"; + print $out join "\n", + (map { "$tag ($_) = $sizes->{$_}" } sort keys %$sizes), + ''; + + close($out) or die "$ME: Can't close $outfile: $!\n"; + } } } @@ -532,6 +544,17 @@ __ } +# Check, if tar understands --use-compress-program and use this, as +# at least gzip deprecated passing options via the environment. +sub compressor { + my ($compressor, $fallback) = @_; + state $use_compress_option = + 0 == system("tar c -f /dev/null -C / --use-compress-program=cat dev/null 2>/dev/null"); + return $use_compress_option + ? "--use-compress-program=$compressor" + : ref $fallback eq ref sub {} ? $fallback->() : $fallback; +} + MAIN: { # some of these settings are useful only if we're in the @@ -545,11 +568,12 @@ MAIN: { group => '0', }, make_cmd => 'make', # for 'make'ing the docs + sizes => 1, compressors => { - gzip => 1, - bzip2 => 1, - xz => 1, - lzip => 0, + gzip => { use => 1, extension => 'gz', flags => compressor('gzip -9', sub { $ENV{GZIP} = '-9'; '--gzip' }) }, + bzip2 => { use => 1, extension => 'bz2', flags => compressor('bzip2 -9', sub { $ENV{BZIP2} = '-9'; '--bzip2' }) }, + xz => { use => 1, extension => 'xz', flags => compressor('xz -9', sub { $ENV{XZ_OPT} = '-9'; '--xz' }) }, + lzip => { use => 0, extension => 'lz', flags => compressor('lzip -9', '--lzip') }, }, docs => 1, web => 1, @@ -563,23 +587,29 @@ MAIN: { ); ##$ENV{'PATH'} = '/opt/local/bin:' . $ENV{'PATH'}; - # We are creating files for mass distribution, so work harder to make smaller files. - $ENV{GZIP} = -9; - $ENV{BZIP2} = -9; - # xz documents minimum file sizes for levels higher than -6 to be useful and each - # requires more RAM on the decompressing system. Exim tarball currently 24MiB so - # using -8. - $ENV{XZ_DEFAULTS} = -8; GetOptions( $context, qw(workspace|tmp=s website_base|webgen_base=s tar_cmd|tar-cmd=s make_cmd|make-cmd=s - docs|build-docs! web|build-web! + docs|build-docs! web|build-web! sizes! delete! cleanup! quick|quick-release! minimal), 'sign!' => \$context->{gpg}{sign}, 'key=s' => \$context->{gpg}{key}, - 'lzip!' => \$context->{compressors}{lzip}, 'verbose!' => \$verbose, + 'compressors=s@' => sub { + die "$0: can't parse compressors string `$_[1]'\n" unless $_[1] =~ /^[+=-]?\w+(?:[+=-]\w+)*$/; + while ($_[1] =~ /(?[+=-])?(?\w+)\b/g) { + die "$0: Unknown compressor $+{name}" + unless $context->{compressors}{$+{name}}; + if (not defined $+{act} or $+{act} eq '=') { + $_->{use} = 0 + for values %{$context->{compressors}}; + $context->{compressors}{$+{name}}{use}++; + } + elsif ($+{act} eq '+') { $context->{compressors}{$+{name}}{use}++; } + elsif ($+{act} eq '-') { $context->{compressors}{$+{name}}{use}--; } + } + }, 'debug:s' => \$debug, 'quick' => sub { $context->{web}--; $context->{quick} = 1 }, 'help|?' => sub { pod2usage(-verbose => 1, -exit => 0) }, @@ -673,6 +703,13 @@ Call B about like this: Do (or do not) cleanup the tmp directory at exit (default: do cleanup) +=item B<--compressors> [I]I$]... + +A list of compressors to use. Currently the default list is +B, B, and B, with B optionally to be enabled. + +I can be "+" (add), "-" (remove), and "=" (set). + =item B<--debug[=I]> Forces debug mode. If (default: no debug info) @@ -712,10 +749,6 @@ is used: =back -=item B<--[no]lzip> - -Control the creation of B tarballs. (default: do not use lzip) - =item B<--make-cmd> I Force the use of a specific C command. This may be necessary if C is not @@ -735,10 +768,14 @@ website creation (which can be enabled by B<--web> again). Sign the created archive files (and the sizes.txt). (default: sign) +=item B<--[no]sizes> + +Write the sizes information to F. (default: write sizes) + =item B<--tar-cmd> I Use to override the path to the C command. Need GNU tar in case -I is selected. (default: C, if not found, use C) +I is selected. (default: C, if not found, use C). =item B<--tmpdir> I