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