Fixed some infrastructure stuff related to our crosscompilers
authorKevin Klues <klueska@r53.millennium.berkeley.edu>
Mon, 30 Nov 2009 09:52:12 +0000 (01:52 -0800)
committerKevin Klues <klueska@parcad.millennium.berkeley.edu>
Tue, 1 Dec 2009 04:17:34 +0000 (20:17 -0800)
GNUmakefile
augment-gcc [deleted file]
kern/src/Makefrag
scripts/augment-gcc [new file with mode: 0755]
user/parlib/inc/sys/dirent.h [new file with mode: 0644]

index 3644769..9050735 100644 (file)
@@ -27,22 +27,22 @@ V = @
 # Cross-compiler ros toolchain
 #
 # This Makefile will automatically use the cross-compiler toolchain
-# installed as 'i386-ros-elf-*', if one exists.  If the host tools ('gcc',
+# installed as 'i386-ros-*', if one exists.  If the host tools ('gcc',
 # 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
 # be detected as well.  If you have the right compiler toolchain installed
-# using a different name, set GCCPREFIX explicitly in conf/env.mk
+# using a different name, set GCCPREFIX explicitly in your Makelocal file
 
 # try to infer the correct GCCPREFIX
 ifndef GCCPREFIX
-GCCPREFIX := $(shell if i386-ros-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
-       then echo 'i386-ros-elf-'; \
+GCCPREFIX := $(shell if i386-ros-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
+       then echo 'i386-ros-'; \
        elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \
        then echo ''; \
        else echo "***" 1>&2; \
        echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \
-       echo "*** Is the directory with i386-ros-elf-gcc in your PATH?" 1>&2; \
+       echo "*** Is the directory with i386-ros-gcc in your PATH?" 1>&2; \
        echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
-       echo "*** prefix other than 'i386-ros-elf-', set your GCCPREFIX" 1>&2; \
+       echo "*** prefix other than 'i386-ros-', set your GCCPREFIX" 1>&2; \
        echo "*** environment variable to that prefix and run 'make' again." 1>&2; \
        echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \
        echo "***" 1>&2; exit 1; fi)
@@ -51,16 +51,16 @@ endif
 # Default programs for compilation
 ifeq ($(COMPILER),IVY)
 KERN_CFLAGS := --deputy\
-                  --enable-error-db\
-                  --no-rc-sharc\
-                  --sc-dynamic-is-error\
-                  --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h\
-                  --sc-all-in-thread\
-                  --enable-precompile
+               --enable-error-db\
+               --no-rc-sharc\
+               --sc-dynamic-is-error\
+               --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h\
+               --sc-all-in-thread\
+               --enable-precompile
 USER_CFLAGS := --deputy --enable-error-db
 CC         := ivycc --gcc=$(GCCPREFIX)gcc
 else
-CC         := $(GCCPREFIX)gcc -std=gnu99
+CC         := $(GCCPREFIX)gcc 
 endif
 
 AS         := $(GCCPREFIX)as
@@ -71,15 +71,15 @@ OBJDUMP     := $(GCCPREFIX)objdump
 NM         := $(GCCPREFIX)nm
 PERL    := perl
 
-EXTRAARGS ?= -Wno-attributes -fno-stack-protector -fgnu89-inline
+EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
 
 # Universal compiler flags
 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
 CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
 CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
-CFLAGS += -Wall -Wno-format -Wno-unused
-CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
+CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
+#CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
 
 # Universal loader flags
 LDFLAGS := -nostdlib
@@ -87,15 +87,6 @@ LDFLAGS := -nostdlib
 # GCC Library path 
 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
 
-# 64 Bit specific flags / definitions
-ifeq ($(TARGET_ARCH),i386)
-       ifeq ($(UNAME),x86_64)
-               CFLAGS += -m32
-               LDFLAGS += -melf_i386
-               GCC_LIB = $(shell $(CC) -print-libgcc-file-name | sed 's/libgcc.a/32\/libgcc.a/')
-       endif
-endif
-
 # List of directories that the */Makefrag makefile fragments will add to
 OBJDIRS :=
 
@@ -138,6 +129,9 @@ docs:
 doxyclean:
        rm -rf doc/rosdoc
 
+augment-gcc: symlinks
+       scripts/augment-gcc $(dir $(shell which $(CC))).. $(TARGET_ARCH)
+
 # For deleting the build
 clean:
        @rm -rf $(OBJDIR)
diff --git a/augment-gcc b/augment-gcc
deleted file mode 100755 (executable)
index ccf1ad4..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-
-function overwrite
-{
-       for i in `find $1 -iname $3`
-       do
-               if [ ! -f $i.bak ]
-               then
-                       cp $i $i.bak
-               fi
-               cp $2 $i
-       done
-}
-
-if [ -z "$1" -o -z "$2" ]
-then
-       echo usage: $1 path-to-ros-gcc target-arch
-       exit
-fi
-
-overwrite $1 obj/user/parlib/src/$2/crtbegin.o crtbegin.o
-overwrite $1 obj/user/parlib/src/$2/crtend.o crtend.o
-overwrite $1 obj/user/parlib/src/$2/entry.o crt0.o
-
-LIBGCC=`find $1 -iname libgcc.a.bak`
-if [ -z "$LIBGCC" ]
-then
-       LIBGCC=`find $1 -iname libgcc.a`
-fi
-LIBC=`find $1 -iname libc.a`
-LIBM=`find $1 -iname libm.a`
-LIBG=`find $1 -iname libg.a`
-LIBPARLIB=../obj/user/parlib/libparlib.a
-LIBPTHREAD=../obj/user/parlib/libpthread.a
-mkdir tmp
-cd tmp
-ar x $LIBPARLIB
-for i in *.o; do mv $i first-$i; ar xN 1 $LIBPARLIB $i 2> /dev/null; done
-ar rcs libgcc.a *.o; rm *.o
-ar x $LIBPTHREAD
-for i in *.o; do mv $i first-$i; ar xN 1 $LIBPTHREAD $i 2> /dev/null; done
-ar rcs libgcc.a *.o; rm *.o
-ar x $LIBGCC
-ar x $LIBC
-ar x $LIBM
-ar x $LIBG
-ar rcs libgcc.a *.o
-cd ..
-
-overwrite $1 tmp/libgcc.a libgcc.a
-rm -rf tmp
-
-SYS_INC=`find $1 -iname sys-include`
-rm -rf $SYS_INC/ros
-cp -r user/parlib/inc/ros $SYS_INC
-
index 45c9878..05baa88 100644 (file)
@@ -116,6 +116,8 @@ $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
 
+all: $(OBJDIR)/$(KERN_DIR)/kernel
+
 #$(OBJDIR)/$(KERN_DIR)/bochs.img: $(OBJDIR)/$(KERN_DIR)/kernel $(OBJDIR)/$(KERN_DIR)/boot
 #      @echo + mk [KERN] $@
 #      $(V)dd if=/dev/zero of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ count=10080 2>/dev/null
@@ -123,5 +125,6 @@ $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
 #      $(V)dd if=$(OBJDIR)/$(KERN_DIR)/kernel of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ seek=1 conv=notrunc 2>/dev/null
 #      $(V)mv $(OBJDIR)/kern/bochs.img~ $(OBJDIR)/kern/bochs.img
 
-all: $(OBJDIR)/$(KERN_DIR)/kernel
-
+ifeq ($(AUGMENT_GCC),TRUE)
+all: augment-gcc
+endif
diff --git a/scripts/augment-gcc b/scripts/augment-gcc
new file mode 100755 (executable)
index 0000000..f98a4be
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+function overwrite
+{
+       for i in `find $1 -iname $3`
+       do
+               if [ ! -f $i.bak ]
+               then
+                       cp $i $i.bak
+               fi
+               cp $2 $i
+       done
+}
+
+if [ -z "$1" -o -z "$2" ]
+then
+       echo usage: $1 path-to-ros-gcc target-arch
+       exit
+fi
+
+overwrite $1 obj/user/parlib/src/$2/crtbegin.o crtbegin.o
+overwrite $1 obj/user/parlib/src/$2/crtend.o crtend.o
+overwrite $1 obj/user/parlib/src/$2/entry.o crt0.o
+
+LIBGCC=`find $1 -iname libgcc.a.bak`
+if [ -z "$LIBGCC" ]
+then
+       LIBGCC=`find $1 -iname libgcc.a`
+fi
+LIBC=`find $1 -iname libc.a`
+LIBM=`find $1 -iname libm.a`
+LIBG=`find $1 -iname libg.a`
+LIBPARLIB=../obj/user/parlib/libparlib.a
+LIBPTHREAD=../obj/user/parlib/libpthread.a
+rm -rf tmp
+mkdir tmp
+cd tmp
+ar x $LIBPARLIB
+for i in *.o; do mv $i first-$i; ar xN 1 $LIBPARLIB $i 2> /dev/null; done
+ar rcs libgcc.a *.o; rm *.o
+ar x $LIBPTHREAD
+for i in *.o; do mv $i first-$i; ar xN 1 $LIBPTHREAD $i 2> /dev/null; done
+ar rcs libgcc.a *.o; rm *.o
+ar x $LIBGCC
+ar x $LIBC
+ar x $LIBM
+ar x $LIBG
+ar rcs libgcc.a *.o
+cd ..
+
+overwrite $1 tmp/libgcc.a libgcc.a
+rm -rf tmp
+
+SYS_INC=`find $1 -iname sys-include`
+rm -rf $SYS_INC/ros
+cp -r user/parlib/inc/ros $SYS_INC
+cp -r user/parlib/inc/sys/* $SYS_INC/sys
+
diff --git a/user/parlib/inc/sys/dirent.h b/user/parlib/inc/sys/dirent.h
new file mode 100644 (file)
index 0000000..b7ca90b
--- /dev/null
@@ -0,0 +1,45 @@
+/* FIXME: From sys/sysvi386/sys */
+#ifndef _SYS_DIRENT_H
+# define _SYS_DIRENT_H
+
+/*
+ * This file was written to be compatible with the BSD directory
+ * routines, so it looks like it.  But it was written from scratch.
+ * Sean Eric Fagan, sef@Kithrup.COM
+ *
+ * Modified by dje@cygnus.com for sun.
+ */
+
+typedef struct __dirdesc {
+       int     dd_fd;
+       long    dd_loc;
+       long    dd_size;
+       long    dd_bsize;
+       long    dd_off;
+       char    *dd_buf;
+} DIR;
+
+# define __dirfd(dp)   ((dp)->dd_fd)
+
+DIR *opendir (const char *);
+struct dirent *readdir (DIR *);
+void rewinddir (DIR *);
+int closedir (DIR *);
+
+#include <sys/types.h>
+
+#define MAXNAMLEN      255
+
+#define d_ino  d_fileno        /* compatibility */
+
+struct dirent {
+       off_t           d_off;
+       unsigned long   d_fileno;
+       unsigned short  d_reclen;
+       unsigned short  d_namlen;
+       char            d_name[MAXNAMLEN + 1];
+};
+
+/* FIXME: include definition of DIRSIZ() ? */
+
+#endif