#************************************************************** # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # #************************************************************** #************************************************************************* # # createPDBRelocators - create for pdb relocator files # PDB relocator files are used to find debug infos # for analysis of creash reports # # usage: create_pdb_relocators($inpath, $milestoneext, $pre); # #************************************************************************* package CreatePDBRelocators; use strict; use File::Basename; use SourceConfig; sub new { my $Object = shift; my $solarversion = shift; my $workdir; my $relworkdir; my $self = {}; my @basedirs; my @repos; if (!defined ($solarversion)) { $solarversion = $ENV{SOLARVERSION}; } if ( !$solarversion ) { print STDERR "can't determine SOLARVERSION.\n"; exit (1); } $self->{SOLARVERSION} = $solarversion; $workdir = $ENV{WORKDIR}; if ( !$workdir ) { print STDERR "can't determine WORKDIR.\n"; exit (1); } if ( $workdir =~ /^$solarversion/ ) { $relworkdir = $workdir; $relworkdir =~ s/^$solarversion\///; } else { print STDERR "ERROR: workdir outside $solarversion unsupported\n"; exit (2); } my $SourceConfigObj = SourceConfig->new(); @repos = $SourceConfigObj->get_repositories(); if ( defined $ENV{UPDMINOREXT} ) { foreach my $onedir ( @repos ) { push( @basedirs, $onedir.$ENV{UPDMINOREXT} ); } } # basdirs is repositories (dmake) + workdir (gnu make) push(@basedirs, $relworkdir); if (!scalar @basedirs) { print STDERR "no basedir and no working directory found.\n"; exit (2); } $self->{BASEDIRS} = \@basedirs; bless($self, $Object); return $self; } sub create_pdb_relocators { my $self = shift; my $inpath = shift; my $milestoneext = shift; my $pre = shift; my $solarversion = $self->{SOLARVERSION}; my $root_dir = "$solarversion/$inpath"; # sanitize path $root_dir =~ s/\\/\//g; my $o =~ s/\\/\//g; my $premilestoneext = $milestoneext; if ( $pre ne "" ) { $premilestoneext = ~ s/^\.//; $premilestoneext = ".pre$premilestoneext"; } my $pdb_dir = $root_dir . "/pdb$premilestoneext"; my $pdb_so_dir = $root_dir . "/pdb$premilestoneext/so"; # create pdb directories if necessary if ( ! -d $pdb_dir ) { if ( !mkdir($pdb_dir, 0775) ) { print STDERR "can't create directory '$pdb_dir'\n"; return undef; } } if ( ! -d $pdb_so_dir ) { if ( !mkdir($pdb_so_dir, 0775) ) { print STDERR "can't create directory '$pdb_so_dir'\n"; return undef; } } # collect files foreach my $basedir (@{$self->{BASEDIRS}}) { my @pdb_files; my $o = $self->{SOLARVERSION} . "/$basedir"; $basedir =~ s/(.*?)\.(.*)/$1/; $self->collect_files( $o, $inpath, \@pdb_files); foreach (@pdb_files) { my $relocator = basename($_) . ".location"; /$o\/(.*)/i; my $src_location = $1; my $location = ""; my $target = ""; if ( $src_location =~ /\/so\// ) { $location = "../../../$basedir$milestoneext/" . $src_location; $target = "$pdb_dir/so/$relocator"; } else { $location = "../../$basedir$milestoneext/" . $src_location; $target = "$pdb_dir/$relocator"; } if ( !open(RELOCATOR, ">$target") ) { print STDERR "can't write file '$target'\n"; return undef; } print RELOCATOR "$location\n"; close(RELOCATOR); } } return 1; } sub collect_files_from_all_basedirs { my $self = shift; my ($platform, $filesref) = @_; my $basedir; my $ret; foreach $basedir (@{$self->{BASEDIRS}}) { my $srcdir = $self->{SOLARVERSION} . "/$basedir"; $ret |= $self->collect_files ($srcdir, $platform, $filesref); } return $ret; } sub collect_files { my $self = shift; my ($srcdir, $platform, $filesref) = @_; my $template = "$srcdir/*/$platform"; my $template2 = "$srcdir/LinkTarget"; if ( $ENV{GUI} eq "WNT" ) { # collect all pdb files on o: # regular glob does not work with two wildcard on WNT my @bin = glob("$template/bin/*.pdb"); my @bin_so = glob("$template/bin/so/*.pdb"); my @workdir = glob("$template2/*/*.pdb"); # we are only interested in pdb files which are accompanied by # .exe or .dll which the same name foreach (@bin, @bin_so, @workdir) { my $dir = dirname($_); my $base = basename($_, ".pdb"); my $exe = "$dir/$base.exe"; my $dll = "$dir/$base.dll"; if ( -e $exe || -e $dll ) { push(@$filesref, $_); } } } else { # collect all shared libraries on o: my @lib = glob("$template/lib/*.so*"); my @workdir_lib = glob("$template2/Library/*.so*"); my @lib_so = glob("$template/lib/so/*.so*"); my @mac_lib = glob("$template/lib/*.dylib*"); my @mac_workdir_lib = glob("$template2/Library/*.dylib*"); my @mac_lib_so = glob("$template/lib/so/*.dylib*"); # collect all binary executables on o: my @bin = $self->find_binary_execs("$template/bin"); my @workdir_bin = $self->find_binary_execs("$template2/Executable"); my @bin_so = $self->find_binary_execs("$template/bin/so"); push(@$filesref, (@lib, @lib_so, @workdir_lib, @mac_lib, @mac_workdir_lib, @mac_lib_so, @bin, @workdir_bin, @bin_so)); } return 1; } sub find_binary_execs { my $self = shift; my $path = shift; my @files = glob("$path/*"); my @execs = grep(-x $_, @files); my @elf_files = grep(`file $_` =~ /ELF/, @execs); my @MachO_files = grep(`file $_` =~ /Mach\-O/, @execs); return ( @elf_files, @MachO_files ); } 1; # required