mmap() with addr 0 will start from BRK_END
[akaros.git] / GNUmakefile
1 # The ROS Top level Makefile
2 # Make sure that 'all' is the first target
3
4 # Keep make quiet.  Make sure you call make via $(MAKE), and not directly
5 MAKE += -s 
6
7 ############################################################################# 
8 ########## Initial Setup so that we can build for different TARGETS #########
9 ############################################################################# 
10
11 ARCH_LINK := $(shell readlink kern/include/arch)
12 ifneq ($(ARCH_LINK),)
13         ARCH_LINK := $(shell basename $(ARCH_LINK))
14         TARGET_ARCH ?= $(ARCH_LINK)
15 endif
16 ifeq ($(TARGET_ARCH),)
17 busted:
18         @echo "You must initially specify your target in the form TARGET_ARCH=<target>"
19         @echo "Current valid values for TARGET_ARCH are 'i686' and 'sparc'"
20         @echo "Subsequent calls for the same target can be made by simply invoking 'make'"
21 endif
22
23 $(TARGET_ARCH):
24         @if [ "$(ARCH_LINK)" != "$@" ];\
25         then\
26           $(MAKE) realclean;\
27           $(MAKE) realall -j $(MAKE_JOBS);\
28         else\
29           $(MAKE) all -j $(MAKE_JOBS);\
30         fi
31
32 ############################################################################# 
33 ########## Beginning of the guts of the real Makefile #######################
34 ############################################################################# 
35
36 # Default values for configurable Make system variables
37 COMPILER := GCC
38 OBJDIR := obj
39 V ?= @
40
41 # Make sure that 'all' is the first target when not erroring out
42 realall: symlinks
43
44 # Number of make jobs to spawn.  Define it in Makelocal
45 MAKE_JOBS :=
46
47 # Give it a reasonable default path for initramfs to avoid build breakage
48 INITRAMFS_PATHS = kern/kfs
49 FIRST_INITRAMFS_PATH = $(firstword $(INITRAMFS_PATHS))
50
51 # Then grab the users Makelocal file to let them override Make system variables
52 # and set up other Make targets
53 include Makeconfig
54 -include Makelocal
55
56 TOP_DIR := $(shell pwd)
57 ARCH_DIR := $(TOP_DIR)/kern/arch
58 INCLUDE_DIR := $(TOP_DIR)/kern/include
59 DOXYGEN_DIR := $(TOP_DIR)/Documentation/doxygen
60
61 UNAME=$(shell uname -m)
62
63 # Cross-compiler ros toolchain
64 #
65 # This Makefile will automatically use the cross-compiler toolchain
66 # installed as '$(TARGET_ARCH)-ros-*', if one exists.  If the host tools ('gcc',
67 # 'objdump', and so forth) compile for a 32-bit ELF target, that will
68 # be detected as well.  If you have the right compiler toolchain installed
69 # using a different name, set GCCPREFIX explicitly in your Makelocal file
70
71 # Try to infer the correct GCCPREFIX
72 ifneq ($(TARGET_ARCH),)
73 ifndef GCCPREFIX
74 TEST_PREFIX := $(TARGET_ARCH)-ros-
75 else
76 TEST_PREFIX := $(GCCPREFIX)
77 endif
78 GCC_EXISTS = $(shell which $(TEST_PREFIX)gcc)
79 ifneq ($(GCC_EXISTS),)
80         GCCPREFIX := $(TEST_PREFIX)
81 else
82         ERROR := "*** Error: Couldn't find $(TEST_PREFIX) version of GCC/binutils." 
83 endif
84 ifdef ERROR
85 error: 
86         @echo $(ERROR)
87         @exit 1
88 else
89 error:
90 endif
91 endif
92
93 # Default programs for compilation
94 USER_CFLAGS += -O2 -std=gnu99
95 ifeq ($(COMPILER),IVY)
96 KERN_CFLAGS += --deputy \
97                --no-rc-sharc \
98                --sc-dynamic-is-error \
99                --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
100                --sc-all-in-thread \
101                --enable-precompile \
102 #               --enable-error-db \
103
104 USER_CFLAGS += --deputy --enable-error-db
105 CC          := ivycc --gcc=$(GCCPREFIX)gcc
106 else
107 CC          := $(GCCPREFIX)gcc 
108 endif
109
110 AS          := $(GCCPREFIX)as
111 AR          := $(GCCPREFIX)ar
112 LD          := $(GCCPREFIX)ld
113 OBJCOPY := $(GCCPREFIX)objcopy
114 OBJDUMP := $(GCCPREFIX)objdump
115 NM          := $(GCCPREFIX)nm
116 STRIP   := $(GCCPREFIX)strip
117 PERL    := perl
118
119 EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
120
121 # GCC Library path
122 ifneq ($(GCC_EXISTS),)
123 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
124 endif
125
126 # Universal compiler flags
127 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
128 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
129 KERN_CFLAGS += -D$(TARGET_ARCH) $(EXTRAARGS)
130 KERN_CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
131 KERN_CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
132 KERN_CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
133
134 # Universal loader flags
135 LDFLAGS := -nostdlib
136
137 # List of directories that the */Makefrag makefile fragments will add to
138 OBJDIRS :=
139
140 ROS_ARCH_DIR ?= $(TARGET_ARCH)
141
142 arch:
143         @echo "TARGET_ARCH=$(TARGET_ARCH)"
144
145 symlinks: error
146         ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
147         ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
148         ln -fs $(ROS_ARCH_DIR) user/parlib/include/arch
149         @$(MAKE) -j $(MAKE_JOBS) all
150
151 # Include Makefrags for subdirectories
152 ifneq ($(TARGET_ARCH),)
153 include tests/Makefrag
154 include kern/Makefrag
155 endif
156
157 ifeq ($(GCCPREFIX),$(TARGET_ARCH)-ros-)
158 GCC_ROOT := $(shell which $(GCCPREFIX)gcc | xargs dirname)/../
159 tests/: tests
160 tests: install-libs
161         @$(MAKE) -j $(MAKE_JOBS) realtests
162 realtests: $(TESTS_EXECS)
163 # No longer automatically copying to the FS dir (deprecated)
164 #       @mkdir -p fs/$(TARGET_ARCH)/tests
165 #       cp -R $(OBJDIR)/$(TESTS_DIR)/* $(TOP_DIR)/fs/$(TARGET_ARCH)/tests
166
167 USER_LIBS = parlib pthread c3po
168 install-libs: 
169         @for i in $(USER_LIBS) ; do \
170                 cd user/$$i;            \
171                 $(MAKE);                \
172                 $(MAKE) install;        \
173                 cd ../..;               \
174         done
175
176 fill-kfs: install-libs
177         @rm -rf $(FIRST_INITRAMFS_PATH)/lib
178         @cp -R $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib $(FIRST_INITRAMFS_PATH)
179
180 userclean:
181         @for i in $(USER_LIBS) ; do \
182                 cd user/$$i;            \
183                 $(MAKE) clean;          \
184                 cd ../..;               \
185         done
186         @rm -rf $(OBJDIR)/$(TESTS_DIR)
187 .PHONY: tests
188 endif
189
190 # Eliminate default suffix rules
191 .SUFFIXES:
192
193 # Delete target files if there is an error (or make is interrupted)
194 .DELETE_ON_ERROR:
195
196 # This magic automatically generates makefile dependencies
197 # for header files included from C source files we compile,
198 # and keeps those dependencies up-to-date every time we recompile.
199 # See 'mergedep.pl' for more information.
200 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
201         @mkdir -p $(@D)
202         @$(PERL) scripts/mergedep.pl $@ $^
203
204 # By including this file we automatically force the target that generates it 
205 # to be rerun
206 -include $(OBJDIR)/.deps
207
208 # Use doxygen to make documentation for ROS
209 docs: 
210         @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
211         @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
212          then \
213                 ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
214          fi
215
216 doxyclean:
217         rm -rf $(DOXYGEN_DIR)/rosdoc
218
219 clean:
220         @rm -rf $(OBJDIR)
221         @echo All clean and pretty!
222
223 realclean: clean
224         @rm -f kern/boot
225         @rm -f kern/include/arch
226         @rm -f user/parlib/include/arch
227
228 always:
229         @:
230
231 .PHONY: all always docs clean
232