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