Dentry cache
[akaros.git] / GNUmakefile
index be7a4ba..716c468 100644 (file)
-#
-# This makefile system follows the structuring conventions
-# recommended by Peter Miller in his excellent paper:
-#
-#      Recursive Make Considered Harmful
-#      http://aegis.sourceforge.net/auug97.pdf
-#
-OBJDIR := obj
-
-ifdef LAB
-SETTINGLAB := true
-else
--include conf/lab.mk
-endif
+# The ROS Top level Makefile
+# Make sure that 'all' is the first target
 
--include conf/env.mk
+############################################################################# 
+########## Initial Setup so that we can build for different TARGETS #########
+############################################################################# 
 
-ifndef SOL
-SOL := 0
+ARCH_LINK := $(shell readlink kern/include/arch)
+ifneq ($(ARCH_LINK),)
+       ARCH_LINK := $(shell basename $(ARCH_LINK))
+       TARGET_ARCH ?= $(ARCH_LINK)
 endif
-ifndef LABADJUST
-LABADJUST := 0
+ifeq ($(TARGET_ARCH),)
+busted:
+       @echo "You must initially specify your target in the form TARGET_ARCH=<target>"
+       @echo "Current valid values for TARGET_ARCH are 'i686' and 'sparc'"
+       @echo "Subsequent calls for the same target can be made by simply invoking 'make'"
 endif
 
-ifndef LABSETUP
-LABSETUP := ./
-endif
+$(TARGET_ARCH):
+       @if [ "$(ARCH_LINK)" != "$@" ];\
+       then\
+         $(MAKE) realclean;\
+         $(MAKE) realall -j $(MAKE_JOBS);\
+       else\
+         $(MAKE) all -j $(MAKE_JOBS);\
+       fi
+
+############################################################################# 
+########## Beginning of the guts of the real Makefile #######################
+############################################################################# 
+
+# Default values for configurable Make system variables
+COMPILER := GCC
+OBJDIR := obj
+V := @
+
+# Make sure that 'all' is the first target when not erroring out
+realall: symlinks
+
+# Number of make jobs to spawn.  Define it in Makelocal
+MAKE_JOBS :=
 
+# Give it a reasonable default path for initramfs to avoid build breakage
+INITRAMFS_PATHS = kern/kfs
 
-TOP = .
+# Then grab the users Makelocal file to let them override Make system variables
+# and set up other Make targets
+include Makeconfig
+-include Makelocal
 
-# Cross-compiler jos toolchain
+TOP_DIR := $(shell pwd)
+ARCH_DIR := $(TOP_DIR)/kern/arch
+INCLUDE_DIR := $(TOP_DIR)/kern/include
+DOXYGEN_DIR := $(TOP_DIR)/Documentation/doxygen
+
+UNAME=$(shell uname -m)
+
+# Cross-compiler ros toolchain
 #
 # This Makefile will automatically use the cross-compiler toolchain
-# installed as 'i386-jos-elf-*', if one exists.  If the host tools ('gcc',
-# 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
+# installed as '$(TARGET_ARCH)-ros-*', if one exists.  If the host tools ('gcc',
+# 'objdump', and so forth) compile for a 32-bit 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
+# Try to infer the correct GCCPREFIX
+ifneq ($(TARGET_ARCH),)
 ifndef GCCPREFIX
-GCCPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
-       then echo 'i386-jos-elf-'; \
-       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-jos-elf-gcc in your PATH?" 1>&2; \
-       echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
-       echo "*** prefix other than 'i386-jos-elf-', 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)
+TEST_PREFIX := $(TARGET_ARCH)-ros-
+else
+TEST_PREFIX := $(GCCPREFIX)
+endif
+GCC_EXISTS = $(shell which $(TEST_PREFIX)gcc)
+ifneq ($(GCC_EXISTS),)
+       GCCPREFIX := $(TEST_PREFIX)
+else
+       ERROR := "*** Error: Couldn't find $(TEST_PREFIX) version of GCC/binutils." 
+endif
+ifdef ERROR
+error: 
+       @echo $(ERROR)
+       @exit 1
+else
+error:
+endif
 endif
 
-CC     := $(GCCPREFIX)gcc -pipe
-GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
-AS     := $(GCCPREFIX)as
-AR     := $(GCCPREFIX)ar
-LD     := $(GCCPREFIX)ld
+# Default programs for compilation
+USER_CFLAGS += -O2
+ifeq ($(COMPILER),IVY)
+KERN_CFLAGS += --deputy \
+               --no-rc-sharc \
+               --sc-dynamic-is-error \
+               --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
+               --sc-all-in-thread \
+               --enable-precompile \
+#               --enable-error-db \
+
+USER_CFLAGS += --deputy --enable-error-db
+CC         := ivycc --gcc=$(GCCPREFIX)gcc
+else
+CC         := $(GCCPREFIX)gcc 
+endif
+
+AS         := $(GCCPREFIX)as
+AR         := $(GCCPREFIX)ar
+LD         := $(GCCPREFIX)ld
 OBJCOPY        := $(GCCPREFIX)objcopy
 OBJDUMP        := $(GCCPREFIX)objdump
-NM     := $(GCCPREFIX)nm
+NM         := $(GCCPREFIX)nm
+STRIP   := $(GCCPREFIX)strip
+PERL    := perl
 
-# Native commands
-NCC    := gcc $(CC_VER) -pipe
-TAR    := gtar
-PERL   := perl
+EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
 
-# Compiler flags
+# GCC Library path
+ifneq ($(GCC_EXISTS),)
+GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
+endif
+
+# 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) $(DEFS) $(LABDEFS) -O -fno-builtin -fno-stack-protector -I$(TOP) -MD -Wall -Wno-format -Wno-unused -gstabs
+KERN_CFLAGS += -D$(TARGET_ARCH) $(EXTRAARGS)
+KERN_CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
+KERN_CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
+KERN_CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
 
-# Linker flags for JOS user programs
-ULDFLAGS := -T user/user.ld
+# Universal loader flags
+LDFLAGS := -nostdlib
 
-# Lists that the */Makefrag makefile fragments will add to
+# List of directories that the */Makefrag makefile fragments will add to
 OBJDIRS :=
 
-# Make sure that 'all' is the first target
-all:
-
-# Eliminate default suffix rules
-.SUFFIXES:
-
-# Delete target files if there is an error (or make is interrupted)
-.DELETE_ON_ERROR:
-
-# make it so that no intermediate .o files are ever deleted
-.PRECIOUS: %.o $(OBJDIR)/boot/%.o $(OBJDIR)/kern/%.o \
-       $(OBJDIR)/lib/%.o $(OBJDIR)/fs/%.o $(OBJDIR)/user/%.o
-
-KERN_CFLAGS := $(CFLAGS) -DJOS_KERNEL -gstabs
-USER_CFLAGS := $(CFLAGS) -DJOS_USER -gstabs
+# List of directories that the */Makefrag makefile fragments will add to
+ROS_USER_LIBS :=
 
+ROS_ARCH_DIR ?= $(TARGET_ARCH)
 
+arch:
+       @echo "TARGET_ARCH=$(TARGET_ARCH)"
 
+symlinks: error
+       ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
+       ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
+       ln -fs $(ROS_ARCH_DIR) user/include/arch
+       @$(MAKE) -j $(MAKE_JOBS) all
 
 # Include Makefrags for subdirectories
-include boot/Makefrag
-include kern/Makefrag
-include lib/Makefrag
+ifneq ($(TARGET_ARCH),)
 include user/Makefrag
+include tests/Makefrag
+include kern/Makefrag
+endif
 
+ifeq ($(GCCPREFIX),$(TARGET_ARCH)-ros-)
+GCC_ROOT := $(shell which $(GCCPREFIX)gcc | xargs dirname)/../
+tests/: tests
+tests:
+       @$(MAKE) -j $(MAKE_JOBS) realtests
+realtests: $(TESTS_EXECS)
+# No longer automatically copying to the FS dir (deprecated)
+#      @mkdir -p fs/$(TARGET_ARCH)/tests
+#      cp -R $(OBJDIR)/$(TESTS_DIR)/* $(TOP_DIR)/fs/$(TARGET_ARCH)/tests
+
+install-libs: $(ROS_USER_LIBS)
+       cp $(ROS_USER_LIBS) $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib
+       cp $(ROS_USER_LIBS) $(TOP_DIR)/fs/$(TARGET_ARCH)/lib
+       cp -R $(USER_DIR)/include/* $(GCC_ROOT)/$(TARGET_ARCH)-ros/include
+.PHONY: tests
+endif
 
-IMAGES = $(OBJDIR)/kern/bochs.img
-
-bochs: $(IMAGES)
-       bochs 'display_library: nogui'
-
-# For deleting the build
-clean:
-       rm -rf $(OBJDIR)
-
-realclean: clean
-       rm -rf lab$(LAB).tar.gz bochs.out bochs.log
-
-distclean: realclean
-       rm -rf conf/gcc.mk
-
-grade: $(LABSETUP)grade.sh
-       $(V)$(MAKE) clean >/dev/null 2>/dev/null
-       $(MAKE) all
-       sh $(LABSETUP)grade.sh
-
-handin: tarball
-       turnin --submit porterde cs372h-lab$(LAB) lab$(LAB)-handin.tar.gz
-
-tarball: realclean
-       tar cf - `find . -type f | grep -v '^\.*$$' | grep -v '/CVS/' | grep -v '/\.svn/' | grep -v 'lab[0-9].*\.tar\.gz'` | gzip > lab$(LAB)-handin.tar.gz
-
-# For test runs
-run-%:
-       $(V)rm -f $(OBJDIR)/kern/init.o $(IMAGES)
-       $(V)$(MAKE) "DEFS=-DTEST=_binary_obj_user_$*_start -DTESTSIZE=_binary_obj_user_$*_size" $(IMAGES)
-       bochs -q 'display_library: nogui'
+# Eliminate default suffix rules
+.SUFFIXES:
 
-xrun-%:
-       $(V)rm -f $(OBJDIR)/kern/init.o $(IMAGES)
-       $(V)$(MAKE) "DEFS=-DTEST=_binary_obj_user_$*_start -DTESTSIZE=_binary_obj_user_$*_size" $(IMAGES)
-       bochs -q
+# Delete target files if there is an error (or make is interrupted)
+.DELETE_ON_ERROR:
 
 # This magic automatically generates makefile dependencies
 # for header files included from C source files we compile,
@@ -147,12 +183,38 @@ xrun-%:
 # See 'mergedep.pl' for more information.
 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
        @mkdir -p $(@D)
-       @$(PERL) mergedep.pl $@ $^
+       @$(PERL) scripts/mergedep.pl $@ $^
 
+# By including this file we automatically force the target that generates it 
+# to be rerun
 -include $(OBJDIR)/.deps
 
+# Use doxygen to make documentation for ROS
+docs: 
+       @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
+       @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
+        then \
+               ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
+        fi
+
+doxyclean:
+       rm -rf $(DOXYGEN_DIR)/rosdoc
+
+# For deleting the build
+userclean:
+       @rm -rf $(OBJDIR)/user
+       
+clean:
+       @rm -rf $(OBJDIR)
+       @echo All clean and pretty!
+
+realclean: clean
+       @rm -f kern/boot
+       @rm -f kern/include/arch
+       @rm -f user/include/arch
+
 always:
        @:
 
-.PHONY: all always \
-       handin tarball clean realclean clean-labsetup distclean grade labsetup
+.PHONY: all always docs clean
+