diff options
-rw-r--r-- | klibc/MCONFIG | 6 | ||||
-rw-r--r-- | klibc/Makefile | 5 | ||||
-rw-r--r-- | klibc/include/stddef.h | 2 | ||||
-rw-r--r-- | klibc/klcc.in | 76 | ||||
-rw-r--r-- | klibc/makeklcc.pl | 17 | ||||
-rw-r--r-- | klibc/version | 2 |
6 files changed, 68 insertions, 40 deletions
diff --git a/klibc/MCONFIG b/klibc/MCONFIG index 7a24b821ad..1141b78d47 100644 --- a/klibc/MCONFIG +++ b/klibc/MCONFIG @@ -29,6 +29,10 @@ OBJROOT = $(SRCROOT) KRNLSRC = $(SRCROOT)/linux KRNLOBJ = $(SRCROOT)/linux +# klibc version information +KLIBCVER = -D__KLIBC__=$(shell cut -d. -f1 < $(SRCROOT)/version) \ + -D__KLIBC_MINOR__=$(shell cut -d. -f2 < $(SRCROOT)/version) + ARCH = $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) CC = $(CROSS)gcc LD = $(CROSS)ld @@ -38,7 +42,7 @@ INCLUDE = -I$(SRCROOT)/include/arch/$(ARCH) \ -I$(SRCROOT)/include/bits$(BITSIZE) \ -I$(SRCROOT)/include \ -I$(KRNLOBJ)/include -I$(KRNLOBJ)/include2 -I$(KRNLSRC)/include -REQFLAGS = $(ARCHREQFLAGS) -nostdinc -iwithprefix include -D__KLIBC__ \ +REQFLAGS = $(ARCHREQFLAGS) $(KLIBCVER) -nostdinc -iwithprefix include \ $(INCLUDE) LDFLAGS = AR = $(CROSS)ar diff --git a/klibc/Makefile b/klibc/Makefile index a512aa308a..7a9b92e8d6 100644 --- a/klibc/Makefile +++ b/klibc/Makefile @@ -27,7 +27,10 @@ $(CROSS)klibc.config: Makefile echo 'STRIPFLAGS=$(STRIPFLAGS)' >> $@ echo 'EMAIN=$(EMAIN)' >> $@ echo 'BITSIZE=$(BITSIZE)' >> $@ - echo 'INSTALLDIR=$(INSTALLDIR)' >> $@ + echo 'prefix=$(INSTALLDIR)' >> $@ + echo 'bindir=$(INSTALLDIR)/$(KCROSS)bin' >> $@ + echo 'libdir=$(INSTALLDIR)/$(KCROSS)lib' >> $@ + echo 'includedir=$(INSTALLDIR)/$(KCROSS)include' >> $@ $(CROSS)klcc: klcc.in $(CROSS)klibc.config makeklcc.pl $(PERL) makeklcc.pl klcc.in $(CROSS)klibc.config \ diff --git a/klibc/include/stddef.h b/klibc/include/stddef.h index 125d2352ec..e96f28c446 100644 --- a/klibc/include/stddef.h +++ b/klibc/include/stddef.h @@ -6,7 +6,7 @@ #define _STDDEF_H #ifndef __KLIBC__ -# define __KLIBC__ 1 +# error "__KLIBC__ not defined, compiler invocation error!" #endif #include <bitsize/stddef.h> diff --git a/klibc/klcc.in b/klibc/klcc.in index d8721c9a6b..36c4d9b3ee 100644 --- a/klibc/klcc.in +++ b/klibc/klcc.in @@ -1,19 +1,22 @@ # -*- perl -*- # Standard includes -@includes = ("-I${INSTALLDIR}/${KCROSS}include/arch/${ARCH}", - "-I${INSTALLDIR}/${KCROSS}include/bits${BITSIZE}", - "-I${INSTALLDIR}/${KCROSS}include"); +@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 = ("$INSTALLDIR/${KCROSS}lib/crt0.o"); -@staticlib = ("$INSTALLDIR/${KCROSS}lib/libc.a"); -@sharedopt = (@EMAIN, "$INSTALLDIR/${KCROSS}lib/interp.o"); -@sharedlib = ('-R', "$INSTALLDIR/${KCROSS}lib/libc.so"); +@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($) { @@ -51,13 +54,15 @@ sub files_with_lang($$) { foreach $f ( @{$files} ) { $need = ${$flang}{$f}; - $need = 'none' if ( $need eq 'obj' ); - unless ( $xopt eq $need || - ($xopt eq 'none' && filename2lang($f) eq $need) ) { - push(@as, '-x', $need); - $xopt = $need; + + # Skip object files + if ( $need ne 'obj' ) { + unless ( $xopt eq $need ) { + push(@as, '-x', $need); + $xopt = $need; + } + push(@as, $f); } - push(@as, $f); } return @as; @@ -88,6 +93,7 @@ open(NULL, '+<', '/dev/null') or die "$0: cannot open /dev/null\n"; @ccopt = (); @ldopt = (); +@libs = (); @files = (); # List of files %flang = (); # Languages for files @@ -111,13 +117,26 @@ while ( defined($a = shift(@ARGV)) ) { # Not an option. Must be a filename then. push(@files, $a); $flang{$a} = $lang || filename2lang($a); + } 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)/ ) { + } elsif ( $a =~ /^-([fmwWQdO]|std=|ansi|pedantic|M[GPD]|MMD)/ ) { # Options to gcc push(@ccopt, $a); - } elsif ( $a =~ /^-([DUI])(.*)$/ ) { + } 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); @@ -125,10 +144,13 @@ while ( defined($a = shift(@ARGV)) ) { } elsif ( $a eq '-include' ) { # Options to gcc which always take a disjoint argument push(@ccopt, $a, shift(@ARGV)); - } elsif ( $a =~ /^-[gp]/ ) { - # Debugging options to gcc *and* ld + } 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); - push(@ldopt, $a); $debugging = 1; } elsif ( $a eq '-v' ) { push(@ccopt, $a); @@ -147,13 +169,15 @@ while ( defined($a = shift(@ARGV)) ) { $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 =~ /^(-print|--help)/ ) { - # Pseudo-operations; just pass to gcc and don't do anything else - push(@ccopt, $a); - $operation = 'c' if ( $operation eq '' ); + } elsif ( $a =~ /^-([lL])(.*)$/ ) { + # Libraries + push(@libs, $a); + push(@libs, shift(@ARGV)) if ( $2 eq '' ); } else { die "$0: unknown option: $a\n"; } @@ -170,6 +194,10 @@ if ( $operation ne '' ) { @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 = (); @@ -204,9 +232,9 @@ if ( $operation ne '' ) { close(LIBGCC); if ( $shared ) { - $rv = mysystem($LD, @LDFLAGS, @sharedopt, @ldopt, @outopt, @objs, @sharedlib, $libgcc); + $rv = mysystem($LD, @LDFLAGS, @sharedopt, @ldopt, @outopt, @objs, @libs, @stdlibpath, @sharedlib, $libgcc); } else { - $rv = mysystem($LD, @LDFLAGS, @staticopt, @ldopt, @outopt, @objs, @staticlib, $libgcc); + $rv = mysystem($LD, @LDFLAGS, @staticopt, @ldopt, @outopt, @objs, @libs, @stdlibpath, @staticlib, $libgcc); } unlink(@rmobjs); diff --git a/klibc/makeklcc.pl b/klibc/makeklcc.pl index ea3f8a8256..f8a6294db3 100644 --- a/klibc/makeklcc.pl +++ b/klibc/makeklcc.pl @@ -7,23 +7,16 @@ ($klccin, $klibcconf, $perlpath) = @ARGV; -# This should probably handle quotes and escapes... -sub string2list($) -{ - my($s) = @_; - - $s =~ s/\s+/\',\'/g; - return "(\'".$s."\')"; -} - print "#!${perlpath}\n"; open(KLIBCCONF, '<', $klibcconf) or die "$0: cannot open $klibcconf: $!\n"; while ( defined($l = <KLIBCCONF>) ) { chomp $l; - if ( $l =~ /=/ ) { - print "\$$` = \"\Q$'\E\";\n"; - print "\@$` = ", string2list("$'"), ";\n"; + if ( $l =~ /^([^=]+)\=(.*)$/ ) { + $n = $1; $s = $2; + print "\$$n = \"\Q$s\E\";\n"; + print "\@$n = qw($s);\n"; + print "\$conf{\'\L$n\E\'} = \\\$$n;\n"; } } close(KLIBCCONF); diff --git a/klibc/version b/klibc/version index 136a629e2d..21e8796a09 100644 --- a/klibc/version +++ b/klibc/version @@ -1 +1 @@ -0.214 +1.0.3 |