1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
|
#! /usr/bin/env perl
##
## Copyright (C) by Argonne National Laboratory
## See COPYRIGHT in top-level directory
##
use strict;
use warnings;
use Cwd qw( cwd getcwd realpath );
use Getopt::Long;
use File::Temp qw( tempdir );
my $arg = 0;
my $branch = "";
my $version = "";
my $so_version = "";
my $append_commit_id;
my $root = cwd();
my $with_autoconf = "";
my $with_automake = "";
my $git_repo = "";
my $logfile = "release.log";
sub usage
{
print "Usage: $0 [OPTIONS]\n\n";
print "OPTIONS:\n";
print "\t--git-repo path to root of the git repository (required)\n";
print "\t--branch git branch to be packaged (required)\n";
print "\t--version tarball version (required)\n";
print "\t--append-commit-id append git commit description (optional)\n";
print "\n";
exit 1;
}
sub check_package
{
my $pack = shift;
print "===> Checking for package $pack... ";
if ($with_autoconf and ($pack eq "autoconf")) {
# the user specified a dir where autoconf can be found
if (not -x "$with_autoconf/$pack") {
print "not found\n";
return 0;
}
}
if ($with_automake and ($pack eq "automake")) {
# the user specified a dir where automake can be found
if (not -x "$with_automake/$pack") {
print "not found\n";
return 0;
}
}
else {
if (`which $pack` eq "") {
print "not found\n";
return 0;
}
}
print "done\n";
return 1;
}
sub check_autotools_version
{
my $tool = shift;
my $req_ver = shift;
my $curr_ver;
$curr_ver = `$tool --version | head -1 | cut -f4 -d' ' | xargs echo -n`;
if ("$curr_ver" lt "$req_ver") {
print("\tERROR: $tool version $curr_ver too old (>=$req_ver) required\n\n");
exit;
}
}
# will also chdir to the top level of the git repository
sub check_git_repo {
my $repo_path = shift;
print "===> chdir to $repo_path\n";
chdir $repo_path;
print "===> Checking git repository sanity... ";
unless (`git rev-parse --is-inside-work-tree 2> /dev/null` eq "true\n") {
print "ERROR: $repo_path is not a git repository\n";
exit 1;
}
# I'm not strictly sure that this is true, but it's not too burdensome right
# now to restrict it to complete (non-bare repositories).
unless (`git rev-parse --is-bare-repository 2> /dev/null` eq "false\n") {
print "ERROR: $repo_path is a *bare* repository (need working tree)\n";
exit 1;
}
# last sanity check
unless (-e "maint/extracterrmsgs") {
print "ERROR: does not appear to be a valid MPICH repository\n" .
"(missing maint/extracterrmsgs)\n";
exit 1;
}
print "done\n";
}
sub run_cmd
{
my $cmd = shift;
#print("===> running cmd=|$cmd| from ".getcwd()."\n");
system("$cmd >> $root/$logfile 2>&1");
if ($?) {
die "unable to execute ($cmd), \$?=$?. Stopped";
}
}
GetOptions(
"branch=s" => \$branch,
"version=s" => \$version,
"so-version=s" => \$so_version,
"append-commit-id!" => \$append_commit_id,
"with-autoconf" => \$with_autoconf,
"with-automake" => \$with_automake,
"git-repo=s" => \$git_repo,
"help" => \&usage,
# old deprecated args, retained with usage() to help catch non-updated cron
# jobs and other stale scripts/users
"append-svnrev!" => sub {usage();},
) or die "unable to parse options, stopped";
if (scalar(@ARGV) != 0) {
usage();
}
if (!$branch || !$version) {
usage();
}
my $has_doctext = check_package("doctext");
my $has_git = check_package("git");
my $has_latex = check_package("latex");
my $has_autoconf = check_package("autoconf");
my $has_automake = check_package("automake");
if (!$has_git || !$has_autoconf || !$has_automake) {
die "\tFATAL: git, autoconf, and automake are required.\n";
}
if (!$has_doctext || !$has_latex) {
print("\tWARNING: doctext or latex not found. Man pages and documentations\n");
print("\t will be skipped in the release package.\n\n");
print("\tdoctext is available on http://wgropp.cs.illinois.edu/projects/software/sowing/\n");
}
print("\n");
## NOTE: Different autotools versions may result in accidental ABI chanages.
## For flexibility, we no longer enforce the check for specific versions of
## autoconf and libtool. We do require a minimum version of automake so tarballs
## contain up-to-date config.guess files. Always double check using the ABI
## compatibility tool before the final release.
check_autotools_version("automake", "1.16.5");
my $tdir = tempdir(CLEANUP => 1);
my $local_git_clone = "${tdir}/mpich-clone";
# clone git repo
print("===> Cloning git repo... ");
run_cmd("git clone --recursive -b ${branch} ${git_repo} ${local_git_clone}");
print("done\n");
# chdirs to $local_git_clone if valid
check_git_repo($local_git_clone);
print("\n");
my $current_ver = `git show ${branch}:maint/version.m4 | grep MPICH_VERSION_m4 | \
sed -e 's/^.*\\[MPICH_VERSION_m4\\],\\[\\(.*\\)\\].*/\\1/g'`;
if ("$current_ver" ne "$version\n") {
print("\tWARNING: maint/version does not match user version\n\n");
}
my $changes_ver = `git show ${branch}:CHANGES | grep -m 1 "Changes in" | \
awk '{print \$3}'`;
if ("$changes_ver" ne "$version\n") {
print("\tWARNING: CHANGES/version does not match user version\n\n");
}
if ($append_commit_id) {
my $desc = `git describe --always ${branch}`;
chomp $desc;
$version .= "-${desc}";
}
my $expdir = "${tdir}/mpich-${version}";
# Clean up the log file
system("rm -f ${root}/$logfile");
# Check out the appropriate branch
print("===> Exporting code from git... ");
run_cmd("rm -rf ${expdir}");
run_cmd("mkdir -p ${expdir}");
run_cmd("git archive ${branch} --prefix='mpich-${version}/' | tar -x -C $tdir");
run_cmd("git submodule foreach --recursive \'git archive HEAD --prefix='' | tar -x -C `echo \${toplevel}/\${path} | sed -e s/clone/${version}/`'");
print("done\n");
print("===> Create release date and version information... ");
chdir($expdir);
my $date = `date`;
chomp $date;
system(qq(perl -p -i -e 's/\\[MPICH_RELEASE_DATE_m4\\],\\[unreleased development copy\\]/[MPICH_RELEASE_DATE_m4],[$date]/g' ./maint/version.m4));
if ($so_version) {
system(qq(perl -p -i -e 's/\\[libmpi_so_version_m4\\],\\[0:0:0\\]/[libmpi_so_version_m4],[$so_version]/g' ./maint/version.m4));
}
# the main version.m4 file will be copied to hydra's version.m4, including the
# above modifications
print("done\n");
# Create configure
print("===> Creating configure in the main codebase... ");
chdir($expdir);
{
my $cmd = "./autogen.sh --with-doc";
$cmd .= " --with-autoconf=$with_autoconf" if $with_autoconf;
$cmd .= " --with-automake=$with_automake" if $with_automake;
run_cmd($cmd);
}
print("done\n");
# Create test/mpi/configure
print("===> Creating configure in the test/mpi... ");
chdir("$expdir/test/mpi");
{
my $cmd = "./autogen.sh";
$cmd .= " --with-autoconf=$with_autoconf" if $with_autoconf;
$cmd .= " --with-automake=$with_automake" if $with_automake;
run_cmd($cmd);
}
print("done\n");
# Disable unnecessary tests in the release tarball
print("===> Disabling unnecessary tests in the main codebase... ");
chdir($expdir);
run_cmd(q{perl -p -i -e 's/^\@perfdir\@/#\@perfdir\@/' test/mpi/testlist.in});
run_cmd(q{perl -p -i -e 's/^\@ftdir\@/#\@ftdir\@/' test/mpi/testlist.in});
run_cmd("perl -p -i -e 's/^large_message /#large_message /' test/mpi/pt2pt/testlist");
run_cmd("perl -p -i -e 's/^large_count /#large_count /' test/mpi/datatype/testlist");
print("done\n");
# Remove unnecessary files
print("===> Removing unnecessary files in the main codebase... ");
chdir($expdir);
run_cmd("rm -rf README.vin maint/config.log maint/config.status unusederr.txt");
run_cmd("find . -name autom4te.cache -o -name __pycache__ | xargs rm -rf");
print("done\n");
# Get docs
if ($has_doctext and $has_latex) {
print("===> Creating secondary codebase for the docs... ");
run_cmd("mkdir ${expdir}-build");
chdir("${expdir}-build");
run_cmd("${expdir}/configure --with-device=ch4:stubnm --disable-fortran --disable-cxx");
run_cmd("(make mandoc && make htmldoc && make latexdoc)");
print("done\n");
print("===> Copying docs over... ");
run_cmd("cp -a man ${expdir}");
run_cmd("cp -a www ${expdir}");
run_cmd("cp -a doc/userguide/user.pdf ${expdir}/doc/userguide");
run_cmd("cp -a doc/installguide/install.pdf ${expdir}/doc/installguide");
print("done\n");
print("===> Creating ROMIO docs... ");
chdir("${expdir}/src/mpi");
chdir("romio/doc");
run_cmd("make");
run_cmd("rm -f users-guide.blg users-guide.toc users-guide.aux users-guide.bbl users-guide.log users-guide.dvi");
print("done\n");
}
# Create the main tarball
print("===> Creating the final mpich tarball... ");
chdir("${tdir}");
run_cmd("tar -czvf mpich-${version}.tar.gz mpich-${version}");
run_cmd("cp -a mpich-${version}.tar.gz ${root}/");
print("done\n");
# Create the hydra tarball
print("===> Creating the final hydra tarball... ");
run_cmd("cp -a ${expdir}/src/pm/hydra hydra-${version}");
run_cmd("tar -czvf hydra-${version}.tar.gz hydra-${version}");
run_cmd("cp -a hydra-${version}.tar.gz ${root}/");
print("done\n");
# Create the pmi tarball
print("===> Creating the final libpmi tarball... ");
run_cmd("cp -a ${expdir}/src/pmi libpmi-${version}");
run_cmd("tar -czvf libpmi-${version}.tar.gz libpmi-${version}");
run_cmd("cp -a libpmi-${version}.tar.gz ${root}/");
print("done\n");
# Create the testsuite tarball
print("===> Creating the final mpich-testsuite tarball... ");
my $target = "mpich-testsuite-$version";
run_cmd("cp -a ${expdir}/test/mpi $target");
run_cmd("tar -czvf $target.tar.gz $target");
run_cmd("cp -a $target.tar.gz ${root}/");
print("done\n\n");
# make sure we are outside of the tempdir so that the CLEANUP logic can run
chdir("${tdir}/..");
|