Get things to build Ivy again. Turn off error db logging because it is slow.
[akaros.git] / GNUmakefile
1 #
2 # This makefile system follows the structuring conventions
3 # recommended by Peter Miller in his excellent paper:
4 #
5 #       Recursive Make Considered Harmful
6 #       http://aegis.sourceforge.net/auug97.pdf
7 #
8
9 OBJDIR := obj
10
11 # Make sure that 'all' is the first target
12 all: symlinks
13
14 # User defined constants passed on the command line 
15 TARGET_ARCH := i386
16 COMPILER := IVY
17
18 -include Makelocal
19
20 TOP_DIR := .
21 ARCH_DIR := $(TOP_DIR)/kern/arch
22 INCLUDE_DIR := $(TOP_DIR)/kern/include
23
24 UNAME=$(shell uname -m)
25 V = @
26
27 # Cross-compiler ros toolchain
28 #
29 # This Makefile will automatically use the cross-compiler toolchain
30 # installed as 'i386-ros-elf-*', if one exists.  If the host tools ('gcc',
31 # 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
32 # be detected as well.  If you have the right compiler toolchain installed
33 # using a different name, set GCCPREFIX explicitly in conf/env.mk
34
35 # try to infer the correct GCCPREFIX
36 ifndef GCCPREFIX
37 GCCPREFIX := $(shell if i386-ros-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
38         then echo 'i386-ros-elf-'; \
39         elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \
40         then echo ''; \
41         else echo "***" 1>&2; \
42         echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \
43         echo "*** Is the directory with i386-ros-elf-gcc in your PATH?" 1>&2; \
44         echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
45         echo "*** prefix other than 'i386-ros-elf-', set your GCCPREFIX" 1>&2; \
46         echo "*** environment variable to that prefix and run 'make' again." 1>&2; \
47         echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \
48         echo "***" 1>&2; exit 1; fi)
49 endif
50
51 # Default programs for compilation
52 ifeq ($(COMPILER),IVY)
53 KERN_CFLAGS := --deputy\
54                   --no-rc-sharc\
55                   --sc-dynamic-is-error\
56                   --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h\
57                   --sc-all-in-thread\
58                   --enable-precompile\
59 #                  --enable-error-db\
60
61 USER_CFLAGS := --deputy --enable-error-db
62 CC          := ivycc --gcc=$(GCCPREFIX)gcc
63 else
64 CC          := $(GCCPREFIX)gcc -std=gnu99 -fgnu89-inline
65 endif
66
67 AS          := $(GCCPREFIX)as
68 AR          := $(GCCPREFIX)ar
69 LD          := $(GCCPREFIX)ld
70 OBJCOPY := $(GCCPREFIX)objcopy
71 OBJDUMP := $(GCCPREFIX)objdump
72 NM          := $(GCCPREFIX)nm
73 PERL    := perl
74
75 # Universal compiler flags
76 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
77 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
78 CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
79 CFLAGS += -O2 -pipe -MD -fno-builtin -fno-stack-protector -gstabs
80 CFLAGS += -Wall -Wno-format -Wno-unused -Wno-attributes
81 CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
82
83 # Universal loader flags
84 LDFLAGS := -nostdlib
85
86 # GCC Library path 
87 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
88
89 # 64 Bit specific flags / definitions
90 ifeq ($(TARGET_ARCH),i386)
91         ifeq ($(UNAME),x86_64)
92                 CFLAGS += -m32
93                 LDFLAGS += -melf_i386
94                 GCC_LIB = $(shell $(CC) -print-libgcc-file-name | sed 's/libgcc.a/32\/libgcc.a/')
95         endif
96 endif
97
98 # List of directories that the */Makefrag makefile fragments will add to
99 OBJDIRS :=
100
101 symlinks:
102         @rm -f kern/include/arch
103         @ln -s ../arch/$(TARGET_ARCH)/ kern/include/arch
104         @rm -f kern/boot
105         @ln -s arch/$(TARGET_ARCH)/boot/ kern/boot
106
107 # Include Makefrags for subdirectories
108 include user/Makefrag
109 include kern/Makefrag
110
111 # Eliminate default suffix rules
112 .SUFFIXES:
113
114 # Delete target files if there is an error (or make is interrupted)
115 .DELETE_ON_ERROR:
116
117 # This magic automatically generates makefile dependencies
118 # for header files included from C source files we compile,
119 # and keeps those dependencies up-to-date every time we recompile.
120 # See 'mergedep.pl' for more information.
121 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
122         @mkdir -p $(@D)
123         @$(PERL) scripts/mergedep.pl $@ $^
124
125 # By including this file we automatically force the target that generates it 
126 # to be rerun
127 -include $(OBJDIR)/.deps
128
129 # Use doxygen to make documentation for ROS
130 docs: 
131         @doxygen doc/rosdoc.cfg
132         @if [ ! -d doc/rosdoc/html/img ];          \
133          then                                      \
134                 ln -s ../../img doc/rosdoc/html;       \
135          fi
136
137 doxyclean:
138         rm -rf doc/rosdoc
139
140 # For deleting the build
141 clean:
142         @rm -rf $(OBJDIR)
143         @rm -f kern/boot
144         @rm -f kern/include/arch
145         @echo All clean and pretty!
146
147 always:
148         @:
149
150 .PHONY: all always docs clean
151