|
Packit Service |
c5cf8c |
#!/usr/bin/env perl
|
|
Packit Service |
c5cf8c |
#
|
|
Packit Service |
c5cf8c |
# (C) 2008 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
# See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
#
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
use strict;
|
|
Packit Service |
c5cf8c |
use warnings;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
use Cwd qw( cwd getcwd realpath );
|
|
Packit Service |
c5cf8c |
use Getopt::Long;
|
|
Packit Service |
c5cf8c |
use File::Temp qw( tempdir );
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $arg = 0;
|
|
Packit Service |
c5cf8c |
my $branch = "";
|
|
Packit Service |
c5cf8c |
my $version = "";
|
|
Packit Service |
c5cf8c |
my $append_commit_id;
|
|
Packit Service |
c5cf8c |
my $root = cwd();
|
|
Packit Service |
c5cf8c |
my $with_autoconf = "";
|
|
Packit Service |
c5cf8c |
my $with_automake = "";
|
|
Packit Service |
c5cf8c |
my $git_repo = "";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $logfile = "release.log";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sub usage
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
print "Usage: $0 [OPTIONS]\n\n";
|
|
Packit Service |
c5cf8c |
print "OPTIONS:\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "\t--git-repo path to root of the git repository (required)\n";
|
|
Packit Service |
c5cf8c |
print "\t--branch git branch to be packaged (required)\n";
|
|
Packit Service |
c5cf8c |
print "\t--version tarball version (required)\n";
|
|
Packit Service |
c5cf8c |
print "\t--append-commit-id append git commit description (optional)\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "\n";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
exit 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sub check_package
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my $pack = shift;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "===> Checking for package $pack... ";
|
|
Packit Service |
c5cf8c |
if ($with_autoconf and ($pack eq "autoconf")) {
|
|
Packit Service |
c5cf8c |
# the user specified a dir where autoconf can be found
|
|
Packit Service |
c5cf8c |
if (not -x "$with_autoconf/$pack") {
|
|
Packit Service |
c5cf8c |
print "not found\n";
|
|
Packit Service |
c5cf8c |
exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if ($with_automake and ($pack eq "automake")) {
|
|
Packit Service |
c5cf8c |
# the user specified a dir where automake can be found
|
|
Packit Service |
c5cf8c |
if (not -x "$with_automake/$pack") {
|
|
Packit Service |
c5cf8c |
print "not found\n";
|
|
Packit Service |
c5cf8c |
exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
else {
|
|
Packit Service |
c5cf8c |
if (`which $pack` eq "") {
|
|
Packit Service |
c5cf8c |
print "not found\n";
|
|
Packit Service |
c5cf8c |
exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
print "done\n";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sub check_autotools_version
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my $tool = shift;
|
|
Packit Service |
c5cf8c |
my $req_ver = shift;
|
|
Packit Service |
c5cf8c |
my $curr_ver;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
$curr_ver = `$tool --version | head -1 | cut -f4 -d' ' | xargs echo -n`;
|
|
Packit Service |
c5cf8c |
if ("$curr_ver" ne "$req_ver") {
|
|
Packit Service |
c5cf8c |
print("\tERROR: $tool version mismatch ($req_ver) required\n\n");
|
|
Packit Service |
c5cf8c |
exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# will also chdir to the top level of the git repository
|
|
Packit Service |
c5cf8c |
sub check_git_repo {
|
|
Packit Service |
c5cf8c |
my $repo_path = shift;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "===> chdir to $repo_path\n";
|
|
Packit Service |
c5cf8c |
chdir $repo_path;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "===> Checking git repository sanity... ";
|
|
Packit Service |
c5cf8c |
unless (`git rev-parse --is-inside-work-tree 2> /dev/null` eq "true\n") {
|
|
Packit Service |
c5cf8c |
print "ERROR: $repo_path is not a git repository\n";
|
|
Packit Service |
c5cf8c |
exit 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
# I'm not strictly sure that this is true, but it's not too burdensome right
|
|
Packit Service |
c5cf8c |
# now to restrict it to complete (non-bare repositories).
|
|
Packit Service |
c5cf8c |
unless (`git rev-parse --is-bare-repository 2> /dev/null` eq "false\n") {
|
|
Packit Service |
c5cf8c |
print "ERROR: $repo_path is a *bare* repository (need working tree)\n";
|
|
Packit Service |
c5cf8c |
exit 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# last sanity check
|
|
Packit Service |
c5cf8c |
unless (-e "maint/extracterrmsgs") {
|
|
Packit Service |
c5cf8c |
print "ERROR: does not appear to be a valid MPICH repository\n" .
|
|
Packit Service |
c5cf8c |
"(missing maint/extracterrmsgs)\n";
|
|
Packit Service |
c5cf8c |
exit 1;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print "done\n";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sub run_cmd
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my $cmd = shift;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#print("===> running cmd=|$cmd| from ".getcwd()."\n");
|
|
Packit Service |
c5cf8c |
system("$cmd >> $root/$logfile 2>&1");
|
|
Packit Service |
c5cf8c |
if ($?) {
|
|
Packit Service |
c5cf8c |
die "unable to execute ($cmd), \$?=$?. Stopped";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
GetOptions(
|
|
Packit Service |
c5cf8c |
"branch=s" => \$branch,
|
|
Packit Service |
c5cf8c |
"version=s" => \$version,
|
|
Packit Service |
c5cf8c |
"append-commit-id!" => \$append_commit_id,
|
|
Packit Service |
c5cf8c |
"with-autoconf" => \$with_autoconf,
|
|
Packit Service |
c5cf8c |
"with-automake" => \$with_automake,
|
|
Packit Service |
c5cf8c |
"git-repo=s" => \$git_repo,
|
|
Packit Service |
c5cf8c |
"help" => \&usage,
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# old deprecated args, retained with usage() to help catch non-updated cron
|
|
Packit Service |
c5cf8c |
# jobs and other stale scripts/users
|
|
Packit Service |
c5cf8c |
"append-svnrev!" => sub {usage();},
|
|
Packit Service |
c5cf8c |
) or die "unable to parse options, stopped";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (scalar(@ARGV) != 0) {
|
|
Packit Service |
c5cf8c |
usage();
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (!$branch || !$version) {
|
|
Packit Service |
c5cf8c |
usage();
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
check_package("doctext");
|
|
Packit Service |
c5cf8c |
check_package("txt2man");
|
|
Packit Service |
c5cf8c |
check_package("git");
|
|
Packit Service |
c5cf8c |
check_package("latex");
|
|
Packit Service |
c5cf8c |
check_package("autoconf");
|
|
Packit Service |
c5cf8c |
check_package("automake");
|
|
Packit Service |
c5cf8c |
print("\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
## IMPORTANT: Changing the autotools versions can result in ABI
|
|
Packit Service |
c5cf8c |
## breakage. So make sure the ABI string in the release tarball is
|
|
Packit Service |
c5cf8c |
## updated when you do that.
|
|
Packit Service |
c5cf8c |
check_autotools_version("autoconf", "2.69");
|
|
Packit Service |
c5cf8c |
check_autotools_version("automake", "1.15");
|
|
Packit Service |
c5cf8c |
check_autotools_version("libtool", "2.4.6");
|
|
Packit Service |
c5cf8c |
print("\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $tdir = tempdir(CLEANUP => 1);
|
|
Packit Service |
c5cf8c |
my $local_git_clone = "${tdir}/mpich-clone";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# clone git repo
|
|
Packit Service |
c5cf8c |
print("===> Cloning git repo... ");
|
|
Packit Service |
c5cf8c |
run_cmd("git clone --recursive -b ${branch} ${git_repo} ${local_git_clone}");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# chdirs to $local_git_clone if valid
|
|
Packit Service |
c5cf8c |
check_git_repo($local_git_clone);
|
|
Packit Service |
c5cf8c |
print("\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $current_ver = `git show ${branch}:maint/version.m4 | grep MPICH_VERSION_m4 | \
|
|
Packit Service |
c5cf8c |
sed -e 's/^.*\\[MPICH_VERSION_m4\\],\\[\\(.*\\)\\].*/\\1/g'`;
|
|
Packit Service |
c5cf8c |
if ("$current_ver" ne "$version\n") {
|
|
Packit Service |
c5cf8c |
print("\tWARNING: maint/version does not match user version\n\n");
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $changes_ver = `git show ${branch}:CHANGES | grep "http://git.mpich.org/mpich.git/shortlog" | \
|
|
Packit Service |
c5cf8c |
sed -e '2,\$d' -e 's/.*\.\.//g'`;
|
|
Packit Service |
c5cf8c |
if ("$changes_ver" ne "$version\n") {
|
|
Packit Service |
c5cf8c |
print("\tWARNING: CHANGES/version does not match user version\n\n");
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if ($append_commit_id) {
|
|
Packit Service |
c5cf8c |
my $desc = `git describe --always ${branch}`;
|
|
Packit Service |
c5cf8c |
chomp $desc;
|
|
Packit Service |
c5cf8c |
$version .= "-${desc}";
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $expdir = "${tdir}/mpich-${version}";
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Clean up the log file
|
|
Packit Service |
c5cf8c |
system("rm -f ${root}/$logfile");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Check out the appropriate branch
|
|
Packit Service |
c5cf8c |
print("===> Exporting code from git... ");
|
|
Packit Service |
c5cf8c |
run_cmd("rm -rf ${expdir}");
|
|
Packit Service |
c5cf8c |
run_cmd("mkdir -p ${expdir}");
|
|
Packit Service |
c5cf8c |
run_cmd("git archive ${branch} --prefix='mpich-${version}/' | tar -x -C $tdir");
|
|
Packit Service |
c5cf8c |
run_cmd("git submodule foreach --recursive \'git archive HEAD --prefix='' | tar -x -C `echo \${toplevel}/\${path} | sed -e s/clone/${version}/`'");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print("===> Create release date and version information... ");
|
|
Packit Service |
c5cf8c |
chdir($expdir);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
my $date = `date`;
|
|
Packit Service |
c5cf8c |
chomp $date;
|
|
Packit Service |
c5cf8c |
system(qq(perl -p -i -e 's/\\[MPICH_RELEASE_DATE_m4\\],\\[unreleased development copy\\]/[MPICH_RELEASE_DATE_m4],[$date]/g' ./maint/version.m4));
|
|
Packit Service |
c5cf8c |
# the main version.m4 file will be copied to hydra's version.m4, including the
|
|
Packit Service |
c5cf8c |
# above modifications
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Remove content that is not being released
|
|
Packit Service |
c5cf8c |
print("===> Removing content that is not being released... ");
|
|
Packit Service |
c5cf8c |
chdir($expdir);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
chdir("${expdir}/src/mpid/ch3/channels/nemesis/netmod");
|
|
Packit Service |
c5cf8c |
my @nem_modules = qw(elan);
|
|
Packit Service |
c5cf8c |
run_cmd("rm -rf ".join(' ', @nem_modules));
|
|
Packit Service |
c5cf8c |
for my $module (@nem_modules) {
|
|
Packit Service |
c5cf8c |
run_cmd("rm -rf $module");
|
|
Packit Service |
c5cf8c |
run_cmd(q{perl -p -i -e '$_="" if m|^\s*include \$.*netmod/}.${module}.q{/Makefile.mk|' Makefile.mk});
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Create configure
|
|
Packit Service |
c5cf8c |
print("===> Creating configure in the main codebase... ");
|
|
Packit Service |
c5cf8c |
chdir($expdir);
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
my $cmd = "./autogen.sh";
|
|
Packit Service |
c5cf8c |
$cmd .= " --with-autoconf=$with_autoconf" if $with_autoconf;
|
|
Packit Service |
c5cf8c |
$cmd .= " --with-automake=$with_automake" if $with_automake;
|
|
Packit Service |
c5cf8c |
run_cmd($cmd);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Disable unnecessary tests in the release tarball
|
|
Packit Service |
c5cf8c |
print("===> Disabling unnecessary tests in the main codebase... ");
|
|
Packit Service |
c5cf8c |
chdir($expdir);
|
|
Packit Service |
c5cf8c |
run_cmd(q{perl -p -i -e 's/^\@perfdir\@/#\@perfdir\@/' test/mpi/testlist.in});
|
|
Packit Service |
c5cf8c |
run_cmd(q{perl -p -i -e 's/^\@ftdir\@/#\@ftdir\@/' test/mpi/testlist.in});
|
|
Packit Service |
c5cf8c |
run_cmd("perl -p -i -e 's/^large_message /#large_message /' test/mpi/pt2pt/testlist");
|
|
Packit Service |
c5cf8c |
run_cmd("perl -p -i -e 's/^large_count /#large_count /' test/mpi/datatype/testlist");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Remove unnecessary files
|
|
Packit Service |
c5cf8c |
print("===> Removing unnecessary files in the main codebase... ");
|
|
Packit Service |
c5cf8c |
chdir($expdir);
|
|
Packit Service |
c5cf8c |
run_cmd("rm -rf README.vin maint/config.log maint/config.status unusederr.txt");
|
|
Packit Service |
c5cf8c |
run_cmd("find . -name autom4te.cache | xargs rm -rf");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Get docs
|
|
Packit Service |
c5cf8c |
print("===> Creating secondary codebase for the docs... ");
|
|
Packit Service |
c5cf8c |
run_cmd("mkdir ${expdir}-build");
|
|
Packit Service |
c5cf8c |
chdir("${expdir}-build");
|
|
Packit Service |
c5cf8c |
run_cmd("${expdir}/configure --disable-fortran --disable-cxx");
|
|
Packit Service |
c5cf8c |
run_cmd("(make mandoc && make htmldoc && make latexdoc)");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print("===> Copying docs over... ");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a man ${expdir}");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a www ${expdir}");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a doc/userguide/user.pdf ${expdir}/doc/userguide");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a doc/installguide/install.pdf ${expdir}/doc/installguide");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a doc/logging/logging.pdf ${expdir}/doc/logging");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
print("===> Creating ROMIO docs... ");
|
|
Packit Service |
c5cf8c |
chdir("${expdir}/src/mpi");
|
|
Packit Service |
c5cf8c |
chdir("romio/doc");
|
|
Packit Service |
c5cf8c |
run_cmd("make");
|
|
Packit Service |
c5cf8c |
run_cmd("rm -f users-guide.blg users-guide.toc users-guide.aux users-guide.bbl users-guide.log users-guide.dvi");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Create the main tarball
|
|
Packit Service |
c5cf8c |
print("===> Creating the final mpich tarball... ");
|
|
Packit Service |
c5cf8c |
chdir("${tdir}");
|
|
Packit Service |
c5cf8c |
run_cmd("tar -czvf mpich-${version}.tar.gz mpich-${version}");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a mpich-${version}.tar.gz ${root}/");
|
|
Packit Service |
c5cf8c |
print("done\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# Create the hydra tarball
|
|
Packit Service |
c5cf8c |
print("===> Creating the final hydra tarball... ");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a ${expdir}/src/pm/hydra hydra-${version}");
|
|
Packit Service |
c5cf8c |
run_cmd("tar -czvf hydra-${version}.tar.gz hydra-${version}");
|
|
Packit Service |
c5cf8c |
run_cmd("cp -a hydra-${version}.tar.gz ${root}/");
|
|
Packit Service |
c5cf8c |
print("done\n\n");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
# make sure we are outside of the tempdir so that the CLEANUP logic can run
|
|
Packit Service |
c5cf8c |
chdir("${tdir}/..");
|