# # Perl script be a wrapper around the gnu gcc. the exportable perl.exe # is built, special processing is done. # This script is caled by the gcc2 shell script when the flag # -buildperl is passed to gcc2 print "perlgcc: building exportable perl...\n"; # get all libs: my @libobs; my @obs; my @libFlags; my $libstring; foreach (@ARGV){ if( /\.[a]$/){ push @libobs,$_; } elsif(/^\-l/){ push @libFlags,$_; } if( /\.[o]$/){ push @obs,$_; } } $libstring = join(" ",@libobs); $obsString = join(" ",@obs); $libflagString = join(" ",@libFlags); # make exports file my $command = "echo EXPORTS > perl.def"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; $command ="nm $libstring | grep '^........ [TCD] _'| grep -v _impure_ptr | sed 's/[^_]*_//' >> perl.def"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; # Build the perl.a lib to link to: $command ="dlltool --as=as --dllname perl.exe --def perl.def --output-lib perl.a"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; # change name of export lib to libperlexp so that is can be understood by ld2/perlld $command ="mv perl.a libperlexp.a"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; # get the full path name of a few libs: my $crt0 = `gcc -print-file-name=crt0.o`; chomp $crt0; my $libdir = `gcc -print-file-name=libcygwin.a`; chomp $libdir; $libdir =~ s/libcygwin\.a//g; # when $crt0 and $libdir get used in the system calls below, the \'s # from the gcc -print-file-name get used to create special characters, # such as \n, \t. Replace the \'s with /'s so that this does not # happen: $crt0 =~ s:\\:/:g; $libdir =~ s:\\:/:g; # Link exe: $command = "ld --base-file perl.base -o perl.exe $crt0 $obsString $libstring -L$libdir $libflagString"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; $command = "dlltool --as=as --dllname perl.exe --def perl.def --base-file perl.base --output-exp perl.exp"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; $command = "ld --base-file perl.base perl.exp -o perl.exe $crt0 $obsString $libstring -L$libdir $libflagString"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; $command = "dlltool --as=as --dllname perl.exe --def perl.def --base-file perl.base --output-exp perl.exp"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; $command = "ld perl.exp -o perl.exe $crt0 $obsString $libstring -L$libdir $libflagString"; print "$command\n"; system($command) == 0 or die "system() failed.\n"; print "perlgcc: Completed\n";