diff options
Diffstat (limited to 'klibc/klcc.in')
-rw-r--r-- | klibc/klcc.in | 258 |
1 files changed, 0 insertions, 258 deletions
diff --git a/klibc/klcc.in b/klibc/klcc.in deleted file mode 100644 index 5629f24f1c..0000000000 --- a/klibc/klcc.in +++ /dev/null @@ -1,258 +0,0 @@ -# -*- perl -*- - -use IPC::Open3; - -# Standard includes -@includes = ("-I${prefix}/${KCROSS}include/arch/${ARCH}", - "-I${prefix}/${KCROSS}include/bits${BITSIZE}", - "-I${prefix}/${KCROSS}include"); - -# Default optimization options (for compiles without -g) -@optopt = @OPTFLAGS; -@goptopt = ('-O'); - -# Standard library directories -@stdlibpath = ("-L${prefix}/${KCROSS}lib"); - -# Options and libraries to pass to ld; shared versus static -@staticopt = ("${prefix}/${KCROSS}lib/crt0.o"); -@staticlib = ("${prefix}/${KCROSS}lib/libc.a"); -@sharedopt = (@EMAIN, "${prefix}/${KCROSS}lib/interp.o"); -@sharedlib = ('-R', "${prefix}/${KCROSS}lib/libc.so"); - -# Returns the language (-x option string) for a specific extension. -sub filename2lang($) { - my ($file) = @_; - - return 'c' if ( $file =~ /\.c$/ ); - return 'c-header' if ( $file =~ /\.h$/ ); - return 'cpp-output' if ( $file =~ /\.i$/ ); - return 'c++-cpp-output' if ( $file =~ /\.ii$/ ); - return 'objective-c' if ( $file =~ /\.m$/ ); - return 'objc-cpp-output' if ( $file =~ /\.mi$/ ); - return 'c++' if ( $file =~/\.(cc|cp|cxx|cpp|CPP|c\+\+|C)$/ ); - return 'c++-header' if ( $file =~ /\.(hh|H)$/ ); - return 'f77' if ( $file =~ /\.(f|for|FOR)$/ ); - return 'f77-cpp-input' if ( $file =~ /\.(F|fpp|FPP)$/ ); - return 'ratfor' if ( $file =~ /\.r$/ ); - - # Is this correct? - return 'ada' if ( $file =~ /\.(ads|adb)$/ ); - - return 'assembler' if ( $file =~ /\.s$/ ); - return 'assembler-with-cpp' if ( $file =~/ \.S$/ ); - - # Linker file; there is no option to gcc to assume something - # is a linker file, so we make up our own... - return 'obj'; -} - -# Produces a series of -x options and files -sub files_with_lang($$) { - my($files, $flang) = @_; - my(@as) = (); - my($xopt) = 'none'; - my($need); - - foreach $f ( @{$files} ) { - $need = ${$flang}{$f}; - - # Skip object files - if ( $need ne 'obj' ) { - unless ( $xopt eq $need || $need eq 'stdin') { - push(@as, '-x', $need); - $xopt = $need; - } - push(@as, $f); - } - } - - return @as; -} - -# Convert a return value from system() to an exit() code -sub syserr($) { - my($e) = @_; - - return ($e & 0x7f) | 0x80 if ( $e & 0xff ); - return $e >> 8; -} - -# Run a program; printing out the command line if $verbose is set -sub mysystem(@) { - print STDERR join(' ', @_), "\n" if ( $verbose ); - my $cmd = shift; - open(INPUT, "<&STDIN"); # dup STDIN filehandle to INPUT - my $childpid = open3("<&INPUT", ">&STDOUT", ">&STDERR", $cmd, @_); - waitpid ($childpid, 0); - return $?; -} - -# -# Initialization -# -open(NULL, '+<', '/dev/null') or die "$0: cannot open /dev/null\n"; - -# -# Begin parsing options. -# - -@ccopt = (); -@ldopt = (); -@libs = (); - -@files = (); # List of files -%flang = (); # Languages for files - -# This is 'c' for compile only, 'E' for preprocess only, -# 'S' for compile to assembly. -$operation = ''; # Compile and link - -# Current -x option. If undefined, it means autodetect. -undef $lang; - -$save_temps = 0; # The -save-temps option -$verbose = 0; # The -v option -$shared = 0; # Are we compiling shared? -$debugging = 0; # -g or -p option present? -$strip = 0; # -s option present? -undef $output; # -o option present? - -while ( defined($a = shift(@ARGV)) ) { - if ( $a !~ /^\-/ ) { - # Not an option. Must be a filename then. - push(@files, $a); - $flang{$a} = $lang || filename2lang($a); - } elsif ( $a eq '-' ) { - # gcc gets its input from stdin - push(@files, $a); - # prevent setting -x - $flang{$a} = 'stdin' - } elsif ( $a =~ /^-print-klibc-(.*)$/ ) { - # This test must precede -print - if ( defined($conf{$1}) ) { - print ${$conf{$1}}, "\n"; - exit 0; - } else { - die "$0: unknown option: $a\n"; - } - } elsif ( $a =~ /^(-print|-dump|--help|--version)/ ) { - # These share prefixes with some other options, so put this test early! - # Pseudo-operations; just pass to gcc and don't do anything else - push(@ccopt, $a); - $operation = 'c' if ( $operation eq '' ); - } elsif ( $a =~ /^-Wl,(.*)$/ ) { - # -Wl used to pass options to the linker - push(@ldopt, split(/,/, $1)); - } elsif ( $a =~ /^-([fmwWQdO]|std=|ansi|pedantic|M[GPD]|MMD)/ ) { - # Options to gcc - push(@ccopt, $a); - } elsif ( $a =~ /^-([DUI]|M[FQT])(.*)$/ ) { - # Options to gcc, which can take either a conjoined argument - # (-DFOO) or a disjoint argument (-D FOO) - push(@ccopt, $a); - push(@ccopt, shift(@ARGV)) if ( $2 eq '' ); - } elsif ( $a eq '-include' ) { - # Options to gcc which always take a disjoint argument - push(@ccopt, $a, shift(@ARGV)); - } elsif ( $a eq '-M' || $a eq '-MM' ) { - # gcc options, that force preprocessing mode - push(@ccopt, $a); - $operation = 'E'; - } elsif ( $a =~ /^-[gp]/ || $a eq '-p' ) { - # Debugging options to gcc - push(@ccopt, $a); - $debugging = 1; - } elsif ( $a eq '-v' ) { - push(@ccopt, $a); - $verbose = 1; - } elsif ( $a eq '-save-temps' ) { - push(@ccopt, $a); - $save_temps = 1; - } elsif ( $a =~ '^-([cSE])$' ) { - push(@ccopt, $a); - $operation = $1; - } elsif ( $a eq '-shared' ) { - $shared = 1; - } elsif ( $a eq '-static' ) { - $shared = 0; - } elsif ( $a eq '-s' ) { - $strip = 1; - } elsif ( $a eq '-o' ) { - $output = shift(@ARGV); - } elsif ( $a eq '-x' ) { - $lang = shift(@ARGV); - } elsif ( $a eq '-nostdinc' ) { - push(@ccopt, $a); - @includes = (); - } elsif ( $a =~ /^-([lL])(.*)$/ ) { - # Libraries - push(@libs, $a); - push(@libs, shift(@ARGV)) if ( $2 eq '' ); - } else { - die "$0: unknown option: $a\n"; - } -} - -if ( $debugging ) { - @ccopt = (@REQFLAGS, @includes, @goptopt, @ccopt); -} else { - @ccopt = (@REQFLAGS, @includes, @optopt, @ccopt); -} - -if ( $operation ne '' ) { - # Just run gcc with the appropriate options - @outopt = ('-o', $output) if ( defined($output) ); - $rv = mysystem($CC, @ccopt, @outopt, files_with_lang(\@files, \%flang)); -} else { - if ( scalar(@files) == 0 ) { - die "$0: No input files!\n"; - } - - @outopt = ('-o', $output || 'a.out'); - - @objs = (); - @rmobjs = (); - - foreach $f ( @files ) { - if ( $flang{$f} eq 'obj' ) { - push(@objs, $f); - } else { - $fo = $f; - $fo =~ s/\.[^\/.]+$/\.o/; - - die if ( $f eq $fo ); # safety check - - push(@objs, $fo); - push(@rmobjs, $fo) unless ( $save_temps ); - - $rv = mysystem($CC, @ccopt, '-c', '-o', $fo, '-x', $flang{$f}, $f); - - if ( $rv ) { - unlink(@rmobjs); - exit syserr($rv); - } - } - } - - # Get the libgcc pathname for the *current* gcc - open(LIBGCC, '-|', $CC, @ccopt, '-print-libgcc-file-name') - or die "$0: cannot get libgcc filename\n"; - $libgcc = <LIBGCC>; - chomp $libgcc; - close(LIBGCC); - - if ( $shared ) { - $rv = mysystem($LD, @LDFLAGS, @sharedopt, @ldopt, @outopt, @objs, @libs, @stdlibpath, @sharedlib, $libgcc); - } else { - $rv = mysystem($LD, @LDFLAGS, @staticopt, @ldopt, @outopt, @objs, @libs, @stdlibpath, @staticlib, $libgcc); - } - - unlink(@rmobjs); - - if ( $strip && !$rv ) { - $rv = mysystem($STRIP, @STRIPFLAGS, $output); - } -} - -exit syserr($rv); |