Blame maint/release.pl

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}/..");