Moved pthreads into parlib
[akaros.git] / GNUmakefile
index 6b4da62..3644769 100644 (file)
@@ -5,9 +5,22 @@
 #      Recursive Make Considered Harmful
 #      http://aegis.sourceforge.net/auug97.pdf
 #
+
 OBJDIR := obj
 
-TOP = .
+# Make sure that 'all' is the first target
+all: symlinks
+
+# User defined constants passed on the command line 
+TARGET_ARCH := i386
+COMPILER := IVY
+
+-include Makelocal
+
+TOP_DIR := .
+ARCH_DIR := $(TOP_DIR)/kern/arch
+INCLUDE_DIR := $(TOP_DIR)/kern/include
+
 UNAME=$(shell uname -m)
 V = @
 
@@ -36,7 +49,20 @@ GCCPREFIX := $(shell if i386-ros-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/de
 endif
 
 # Default programs for compilation
-CC         := $(GCCPREFIX)ivycc --deputy
+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
+USER_CFLAGS := --deputy --enable-error-db
+CC         := ivycc --gcc=$(GCCPREFIX)gcc
+else
+CC         := $(GCCPREFIX)gcc -std=gnu99
+endif
+
 AS         := $(GCCPREFIX)as
 AR         := $(GCCPREFIX)ar
 LD         := $(GCCPREFIX)ld
@@ -45,52 +71,43 @@ OBJDUMP     := $(GCCPREFIX)objdump
 NM         := $(GCCPREFIX)nm
 PERL    := perl
 
-# User defined constants passed on the command line 
-ARCH ?= NONE
+EXTRAARGS ?= -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$(ARCH) 
-CFLAGS += -O -pipe -MD -fno-builtin -fno-stack-protector -gstabs
+CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
+CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
 CFLAGS += -Wall -Wno-format -Wno-unused
-CFLAGS += -I$(TOP)
-
-# Kernel vs. user universal compiler flags
-KERN_CFLAGS := $(CFLAGS) -DROS_KERNEL -nostdinc
-USER_CFLAGS := $(CFLAGS) -DROS_USER
+CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
 
 # Universal loader flags
 LDFLAGS := -nostdlib
 
-# Kernel vs. user universal loader flags
-KERN_LDFLAGS := 
-USER_LDFLAGS :=
-
 # GCC Library path 
 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
 
 # 64 Bit specific flags / definitions
-ifeq ($(UNAME),x86_64)
-       CFLAGS += -m32
-       LDFLAGS += -melf_i386
-       GCC_LIB = $(shell $(CC) -print-libgcc-file-name | sed 's/libgcc.a/32\/libgcc.a/')
+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 :=
 
-# Make sure that 'all' is the first target
-all:
+symlinks:
+       @rm -f kern/include/arch
+       @ln -s ../arch/$(TARGET_ARCH)/ kern/include/arch
+       @rm -f kern/boot
+       @ln -s arch/$(TARGET_ARCH)/boot/ kern/boot
 
 # Include Makefrags for subdirectories
 include user/Makefrag
-# A hack until we get the story figured out with the kernel including files from 
-# parlib/inc
-KERN_CFLAGS += -I$(USER_PARLIB_DIR)
-include boot/Makefrag
 include kern/Makefrag
--include Makelocal
 
 # Eliminate default suffix rules
 .SUFFIXES:
@@ -98,15 +115,6 @@ include kern/Makefrag
 # 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_DIR)/%.o              \
-           $(OBJDIR)/$(KERN_DIR)/%.o              \
-              $(OBJDIR)/$(USER_PARLIB_DIR)/%.o       \
-              $(OBJDIR)/$(USER_NEWLIB_DIR)/%.o       \
-           $(OBJDIR)/$(USER_APPS_NEWLIB_DIR)/%.o  \
-           $(OBJDIR)/$(USER_APPS_PARLAB_DIR)/%.o
-
 # This magic automatically generates makefile dependencies
 # for header files included from C source files we compile,
 # and keeps those dependencies up-to-date every time we recompile.
@@ -115,14 +123,30 @@ $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
        @mkdir -p $(@D)
        @$(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 doc/rosdoc.cfg
+       @if [ ! -d doc/rosdoc/html/img ];          \
+        then                                      \
+               ln -s ../../img doc/rosdoc/html;       \
+        fi
+
+doxyclean:
+       rm -rf doc/rosdoc
+
 # For deleting the build
 clean:
-       rm -rf $(OBJDIR)
+       @rm -rf $(OBJDIR)
+       @rm -f kern/boot
+       @rm -f kern/include/arch
+       @echo All clean and pretty!
 
 always:
        @:
 
-.PHONY: all always clean
+.PHONY: all always docs clean