| #!/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; |
| } |
| } |
| |
| 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"; |
| -l "$llvm_build_dir/llvm" || die "Couldn't find llvm symlink '$llvm_build_dir/llvm': $!\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 @rsync_src_dst_paths = |
| ( |
| "$llvm_source_dir/include", "$llvm_checkpoint_dir", |
| "$llvm_source_dir/tools/clang/include", "$llvm_checkpoint_dir/tools/clang", |
| "$llvm_build_dir/llvm/include", "$llvm_checkpoint_dir", |
| "$llvm_build_dir/llvm/tools/clang/include", "$llvm_checkpoint_dir/tools/clang", |
| ); |
| |
| while (@rsync_src_dst_paths) |
| { |
| my $rsync_src = shift @rsync_src_dst_paths; |
| my $rsync_dst = shift @rsync_src_dst_paths; |
| print "rsync_src = '$rsync_src'\n"; |
| print "rsync_dst = '$rsync_dst'\n"; |
| 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'"); |
| } |
| } |
| |
| do_command ("cp '$llvm_build_dir/libllvmclang.a' '$llvm_checkpoint_dir'", "Copying libllvmclang.a", 1); |
| do_command ("cp '$lldb_build_dir/libEnhancedDisassembly.dylib' '$llvm_checkpoint_dir'", "Copying libEnhancedDisassembly.dylib", 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>\n\n"; |
| print "EXAMPLE\n\tcd lldb\n\t./scripts/checkpoint-llvm.pl llvm build/lldb.build/BuildAndIntegration/LLDB.build/DerivedSources/llvm.build build/BuildAndIntegration llvm.zip\n"; |
| } |