llvm-capstone/lldb/scripts/checkpoint-llvm.pl
Sean Callanan bfb237bc02 Updated LLVM/Clang to pick up a fix for imports of
C++ vtables, fixing a record layout problem in the
expression parser.

Also fixed various problems with the generation 
and unpacking of llvm.zip given our new better
handling of multiple architectures in the LLVM
build.

(And added a log message that will hopefully catch
record layout problems in the future.)

llvm-svn: 143741
2011-11-04 22:46:46 +00:00

127 lines
4.0 KiB
Perl
Executable File

#!/usr/bin/perl
# This script should be pointed to a valid llvm.build folder that
# was created using the "build-llvm.pl" shell script. It will create
# a new llvm.zip file that can be checked into the respository
# at lldb/llvm.zip
use strict;
use Cwd 'abs_path';
use File::Basename;
use File::Temp qw/ tempfile tempdir /;
our $debug = 1;
sub do_command
{
my $cmd = shift;
my $description = @_ ? shift : "command";
my $die_on_fail = @_ ? shift : undef;
$debug and print "% $cmd\n";
system ($cmd);
if ($? == -1)
{
$debug and printf ("error: %s failed to execute: $!\n", $description);
$die_on_fail and $? and exit(1);
return $?;
}
elsif ($? & 127)
{
$debug and printf("error: %s child died with signal %d, %s coredump\n",
$description,
($? & 127),
($? & 128) ? 'with' : 'without');
$die_on_fail and $? and exit(1);
return $?;
}
else
{
my $exit = $? >> 8;
if ($exit)
{
$debug and printf("error: %s child exited with value %d\n", $description, $exit);
$die_on_fail and exit(1);
}
return $exit;
}
}
sub do_rsync_paths
{
while (@_)
{
my $rsync_src = shift @_;
my $rsync_dst = shift @_;
print "rsync_src = '$rsync_src'\n";
print "rsync_dst = '$rsync_dst'\n";
if (!-d $rsync_dst)
{
mkdir $rsync_dst;
}
if (-e $rsync_src)
{
my ($rsync_dst_file, $rsync_dst_dir) = fileparse ($rsync_dst);
print "rsync_dst_dir = '$rsync_dst_dir'\n";
-e $rsync_dst_dir or do_command ("mkdir -p '$rsync_dst_dir'");
do_command ("rsync -amvC --exclude='*.tmp' --exclude='*.txt' --exclude='*.TXT' --exclude='*.td' --exclude='\.dir' --exclude=Makefile '$rsync_src' '$rsync_dst'");
}
else
{
die "$rsync_src does not exist!\n";
}
}
}
if (@ARGV > 4)
{
my $llvm_source_dir = abs_path(shift @ARGV); # The llvm source that contains full llvm and clang sources
my $llvm_build_dir = abs_path(shift @ARGV); # The llvm build directory that contains headers and
my $lldb_build_dir = abs_path(shift @ARGV); # the build directory that contains the fat libEnhancedDisassembly.dylib
my $llvm_zip_file = abs_path(shift @ARGV);
printf("LLVM sources : '%s'\n", $llvm_source_dir);
printf("LLVM build : '%s'\n", $llvm_build_dir);
printf("LLDB build : '%s'\n", $lldb_build_dir);
printf("LLVM zip file: '%s'\n", $llvm_zip_file);
-e $llvm_build_dir or die "LLVM build directory doesn't exist: '$llvm_build_dir': $!\n";
my $temp_dir = tempdir( CLEANUP => 1 );
print "temp dir = '$temp_dir'\n";
my $llvm_checkpoint_dir = "$temp_dir/llvm";
mkdir "$llvm_checkpoint_dir" or die "Couldn't make 'llvm' in '$temp_dir'\n";
my @generic_rsync_src_dst_paths =
(
"$llvm_source_dir/include", "$llvm_checkpoint_dir",
"$llvm_source_dir/tools/clang/include", "$llvm_checkpoint_dir/tools/clang",
);
do_rsync_paths (@generic_rsync_src_dst_paths);
for my $arch (@ARGV)
{
my @specific_rsync_src_dst_paths =
(
"$llvm_build_dir/$arch/include", "$llvm_checkpoint_dir/$arch",
"$llvm_build_dir/$arch/tools/clang/include", "$llvm_checkpoint_dir/$arch/tools/clang",
);
do_rsync_paths (@specific_rsync_src_dst_paths);
do_command ("cp '$llvm_build_dir/$arch/libllvmclang.a' '$llvm_checkpoint_dir/$arch/libllvmclang.a'", "Copying .a file", 1);
}
#do_command ("cp '$llvm_build_dir/libllvmclang.a' '$llvm_checkpoint_dir'", "Copying libllvmclang.a", 1);
do_command ("rm -rf '$llvm_zip_file'", "Removing old llvm checkpoint file '$llvm_zip_file'", 1);
do_command ("(cd '$temp_dir' ; zip -r '$llvm_zip_file' 'llvm')", "Zipping llvm checkpoint directory '$llvm_checkpoint_dir' to '$llvm_zip_file'", 1);
}
else
{
print "USAGE\n\tcheckpoint-llvm.pl <llvm-sources> <llvm-build> <lldb-build> <llvm-zip> <arch1> [<arch2> ...]\n\n";
print "EXAMPLE\n\tcd lldb\n\t./scripts/checkpoint-llvm.pl llvm build/llvm build/BuildAndIntegration llvm.zip x86_64 i386\n";
}