summaryrefslogtreecommitdiff
path: root/ACE/bin/vx_repo_link.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/bin/vx_repo_link.pl')
-rwxr-xr-xACE/bin/vx_repo_link.pl217
1 files changed, 217 insertions, 0 deletions
diff --git a/ACE/bin/vx_repo_link.pl b/ACE/bin/vx_repo_link.pl
new file mode 100755
index 00000000000..b4ec5f82ed8
--- /dev/null
+++ b/ACE/bin/vx_repo_link.pl
@@ -0,0 +1,217 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+#
+# $Id$
+#
+
+
+use FindBin;
+use lib $FindBin::Bin;
+
+use diagnostics;
+use Time::Local;
+use File::Basename;
+use File::Spec;
+use FileHandle;
+use Cwd;
+
+my $VXDEBUG = (defined $ENV{'VX_REPO_LINK_DEBUG'}) ? $ENV{'VX_REPO_LINK_DEBUG'} : 0;
+my $ace_root = $ENV{'ACE_ROOT'};
+$ace_root =~ s/\//\\/g;
+my $wind_base = $ENV{'WIND_BASE'};
+$wind_base =~ s/\//\\/g;
+my $AR = $ENV{'AR'};
+my $RANLIB = $ENV{'RANLIB'};
+my @lib_arr;
+my $lib;
+my $curdir = cwd();
+$curdir =~ s/\//\\/g;
+
+
+if ($VXDEBUG > 1)
+{
+ print STDERR "AR = ". $AR . "\n";
+ print STDERR "ACE_ROOT = " . $ace_root . "\n";
+ print STDERR "WIND_BASE = " . $wind_base, "\n";
+ print STDERR "curdir = " . $curdir, "\n";
+}
+
+if ($VXDEBUG > 1) {
+ print STDERR "LINKLIBS are:\n";
+}
+
+while ($#ARGV >= 0)
+{
+ if ($ARGV[0] =~ /^-l/) {
+ $lib = shift;
+ $lib =~ s/^-l//;
+ if ($VXDEBUG > 1) {
+ print STDERR $ace_root."/lib/lib".$lib.".a\n";
+ }
+ push @lib_arr, $lib;
+ }
+}
+
+my @lib_registry = ();
+
+my $LINKLIBS = "";
+
+my $libobj_dir = ".lib";
+system("if not exist ".$libobj_dir." mkdir ".$libobj_dir);
+foreach $lib (@lib_arr) {
+ my $libname = $ace_root."\\lib\\lib".$lib.".a";
+ if (-e $libname) {
+ if (! -e $libobj_dir."\\lib".$lib.".a") {
+ if ($VXDEBUG) {
+ print STDERR "Unpacking ".$lib."...\n";
+ }
+ system("cmd /c if exist ".$libobj_dir."\\".$lib." del /q/f ".$libobj_dir."\\".$lib."\\*.*");
+ system("cmd /c (mkdir ".$libobj_dir."\\".$lib." && cd ".$libobj_dir."\\".$lib." && ".$AR." -x ".$libname." && cd ".$curdir.")");
+
+ if ($VXDEBUG) {
+ print STDERR "Processing ".$lib."...\n";
+ }
+
+ my @rpo_arr = glob ($libobj_dir."\\".$lib."\\*.rpo");
+
+ if ($VXDEBUG > 1) {
+ print STDERR "Read #".$#rpo_arr." filenames\n";
+ }
+
+ my $line;
+ my $fh;
+ my $newfh;
+ my $module;
+ foreach $rpo (@rpo_arr) {
+ if ($VXDEBUG > 2) {
+ print STDERR $rpo."\n";
+ }
+ $fh = new FileHandle();
+ $newfh = new FileHandle();
+ $module = basename($rpo, ".rpo");
+ open ($newfh, '>', dirname($rpo)."\\".$module.".__rpo");
+ open ($fh, '<', $rpo);
+ while (defined ($line = readline $fh)) {
+ if ($line =~ /^M /) {
+ $line =~ s/\//\\/g;
+ }
+ elsif ($line =~ /^D /) {
+ $line =~ s/(^D[ ])(.*ACE_wrappers)(.*)/${1}$ace_root${3}/;
+ $line =~ s/\//\\/g;
+ }
+ elsif ($line =~ /^A /) {
+ $line =~ s/('-I)([^ ]*ACE_wrappers)([']|[^']+')/${1}$ace_root${3}/g;
+ $line =~ s/('-I)([^ ]*Tornado[^\/\\]+)([']|[^']+')/${1}$wind_base${3}/g;
+ $line =~ s/('-o' )('.*')/'-o' '$curdir\/$libobj_dir\/$lib\/$module.o'/g;
+ $line =~ s/\//\\/g;
+ }
+ print $newfh $line;
+ }
+ close ($fh);
+ close ($newfh);
+
+ system("cmd /c (del /f/q ".$rpo." && rename ".dirname($rpo)."\\".$module.".__rpo ".basename($rpo).")");
+ }
+
+ $fh = new FileHandle();
+ open($fh, '<', $libobj_dir."\\".$lib."\\.prelink.spec");
+ my $lnkcmd = readline($fh);
+ my $arcmd = readline($fh);
+ my $libdeps = readline($fh);
+ close($fh);
+
+ $lib_registry[++$#lib_registry] = {
+ lib => $lib,
+ linkcmd => $lnkcmd,
+ arcmd => $arcmd,
+ libdeps => (defined $libdeps ? $libdeps : '')
+ };
+ }
+
+ $LINKLIBS = $LINKLIBS." ".$libobj_dir."\\lib".$lib.".a";
+ }
+ else {
+ $LINKLIBS = "-l".$lib." ".$LINKLIBS;
+ }
+}
+
+sub _find_lib_entry
+{
+ my $lib = shift;
+ foreach my $reg (@lib_registry) {
+ if ($reg->{lib} =~ /(^| )$lib( |$)/) {
+ return $reg;
+ }
+ }
+ return undef;
+}
+
+sub _prelink_lib
+{
+ my $lentry = shift;
+ my $stack = shift;
+ my $lib = $lentry->{lib};
+ my $lnkcmd = $lentry->{linkcmd};
+ my $arcmd = $lentry->{arcmd};
+ my @deps = split(' ', $lentry->{libdeps});
+
+ $lnkcmd =~ s/\n//g;
+ $arcmd =~ s/\n//g;
+
+ if ($VXDEBUG) {
+ print STDERR "Prelink requested for ".$lib." (dependend on ".join(' ', @deps).")...\n";
+ }
+
+ # check dependencies
+ foreach my $dep (@deps) {
+ if ($VXDEBUG > 1) {
+ print STDERR " Checking dependency ".$dep."(stack = ".$stack.")...\n";
+ }
+ if (($stack !~ /\<$dep\>/) && !(-e $libobj_dir."\\lib".$dep.".a")) {
+ my $le = _find_lib_entry ($dep);
+ if (defined $le) {
+ _prelink_lib ($le, $stack." <".$lib.">");
+ }
+ }
+ }
+
+ # prelink library
+ if ($VXDEBUG) {
+ print STDERR "Prelinking ".$lib."...\n";
+ }
+
+ my $objs = join(' ', glob ($libobj_dir."\\".$lib."\\*.o"));
+ my $libs = join(' ', glob ($libobj_dir."\\*.a"));
+ if ($VXDEBUG > 1) {
+ print STDERR " > cmd /c ".$lnkcmd." ".$libobj_dir."\\.prelink_lib ".$objs." ".$libs."\n";
+ }
+ system("cmd /c ".$lnkcmd." ".$libobj_dir."\\.prelink_lib ".$objs." ".$libs);
+ system("cmd /c del /f/q ".$libobj_dir."\\.prelink_lib");
+
+ # build prelinked library
+ if ($VXDEBUG) {
+ print STDERR "Building prelinked lib ".$lib."...\n";
+ }
+
+ $arcmd =~ s/lib$lib/$libobj_dir\\lib$lib/;
+ #$arcmd = $AR." r ".$libobj_dir."\\lib".$lib.".a";
+ $arcmd =~ s/ rv / rc /g;
+ if ($VXDEBUG > 1) {
+ print STDERR "cmd /c echo ".$objs." | ".$arcmd."\n";
+ print STDERR "cmd /c (".$RANLIB." ".$libobj_dir."\\lib".$lib.".a && rmdir /s/q ".$libobj_dir."\\".$lib.")"."\n";
+ }
+ system("cmd /c echo ".$objs." | ".$arcmd);
+ system("cmd /c (".$RANLIB." ".$libobj_dir."\\lib".$lib.".a && rmdir /s/q ".$libobj_dir."\\".$lib.")");
+}
+
+foreach my $libentry (@lib_registry) {
+ if (! -e $libobj_dir."\\lib".$libentry->{lib}.".a") {
+ _prelink_lib ($libentry, "");
+ }
+}
+
+print $LINKLIBS."\n";
+
+1;