x86: initialize XMM registers along with x87
[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', 'sparc', and 'riscv'."
20         @echo "Subsequent calls for the same target can be made by simply invoking 'make'"
21 endif
22
23 real-$(TARGET_ARCH):
24         @if [ "$(ARCH_LINK)" != "$(TARGET_ARCH)" ];\
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 USER_CXXFLAGS += -O2
99 ifeq ($(COMPILER),IVY)
100 KERN_CFLAGS += --deputy \
101                --no-rc-sharc \
102                --sc-dynamic-is-error \
103                --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
104                --sc-all-in-thread \
105                --enable-precompile \
106 #               --enable-error-db \
107
108 USER_CFLAGS += --deputy --enable-error-db
109 CC          := ivycc --gcc=$(GCCPREFIX)gcc
110 else
111 CC          := $(GCCPREFIX)gcc 
112 endif
113
114 CPP         := $(GCCPREFIX)g++
115 AS          := $(GCCPREFIX)as
116 AR          := $(GCCPREFIX)ar
117 LD          := $(GCCPREFIX)ld
118 OBJCOPY := $(GCCPREFIX)objcopy
119 OBJDUMP := $(GCCPREFIX)objdump
120 NM          := $(GCCPREFIX)nm
121 STRIP   := $(GCCPREFIX)strip
122 PERL    := perl
123
124 EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
125
126 # GCC Library path
127 ifneq ($(GCC_EXISTS),)
128 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
129 endif
130
131 # Universal compiler flags
132 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
133 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
134 KERN_CFLAGS += -D$(TARGET_ARCH) $(EXTRAARGS)
135 KERN_CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs -static
136 KERN_CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
137 KERN_CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
138 # Our backtraces need the frame pointer
139 KERN_CFLAGS += -fno-omit-frame-pointer
140
141 # Universal loader flags
142 LDFLAGS := -nostdlib
143
144 # List of directories that the */Makefrag makefile fragments will add to
145 OBJDIRS :=
146
147 ROS_ARCH_DIR ?= $(TARGET_ARCH)
148
149 arch:
150         @echo "TARGET_ARCH=$(TARGET_ARCH)"
151
152 symlinks: error
153         ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
154         ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
155         ln -fs $(ROS_ARCH_DIR) user/parlib/include/arch
156         @$(MAKE) -j $(MAKE_JOBS) all
157
158 # Include Makefrags for subdirectories
159 ifneq ($(TARGET_ARCH),)
160 include tests/Makefrag
161 include kern/Makefrag
162 endif
163
164 ifeq ($(GCCPREFIX),$(TARGET_ARCH)-ros-)
165 GCC_ROOT := $(shell which $(GCCPREFIX)gcc | xargs dirname)/../
166 tests/: tests
167 tests: install-libs
168         @$(MAKE) -j $(MAKE_JOBS) realtests
169
170 realtests: $(TESTS_EXECS_C) $(TESTS_EXECS_CPP)
171 # No longer automatically copying to the FS dir (deprecated)
172 #       @mkdir -p fs/$(TARGET_ARCH)/tests
173 #       cp -R $(OBJDIR)/$(TESTS_DIR)/* $(TOP_DIR)/fs/$(TARGET_ARCH)/tests
174
175 USER_LIBS = parlib pthread
176 # for now, c3po can't be built for non-i686
177 ifeq ($(TARGET_ARCH),i686)
178 USER_LIBS += c3po
179 endif
180 install-libs: 
181         @for i in $(USER_LIBS) ; do     \
182                 cd user/$$i;            \
183                 $(MAKE);                \
184                 $(MAKE) install;        \
185                 cd ../..;               \
186         done
187
188 fill-kfs: install-libs
189         @mkdir -p $(FIRST_INITRAMFS_PATH)/lib
190         @cp $(addprefix $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib/, \
191           libc.so.6 ld.so.1 libm.so libgcc_s.so.1) $(FIRST_INITRAMFS_PATH)/lib
192         $(STRIP) --strip-debug $(addprefix $(FIRST_INITRAMFS_PATH)/lib/, libc.so.6 ld.so.1)
193 endif
194
195 userclean:
196         @for i in $(USER_LIBS) ; do \
197                 cd user/$$i;            \
198                 $(MAKE) clean;          \
199                 cd ../..;               \
200         done
201         @rm -rf $(OBJDIR)/$(TESTS_DIR)
202 .PHONY: tests
203
204 # Eliminate default suffix rules
205 .SUFFIXES:
206
207 # Delete target files if there is an error (or make is interrupted)
208 .DELETE_ON_ERROR:
209
210 # This magic automatically generates makefile dependencies
211 # for header files included from C source files we compile,
212 # and keeps those dependencies up-to-date every time we recompile.
213 # See 'mergedep.pl' for more information.
214 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
215         @mkdir -p $(@D)
216         @$(PERL) scripts/mergedep.pl $@ $^
217
218 # By including this file we automatically force the target that generates it 
219 # to be rerun
220 -include $(OBJDIR)/.deps
221
222 # Use doxygen to make documentation for ROS
223 docs: 
224         @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
225         @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
226          then \
227                 ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
228          fi
229
230 doxyclean:
231         rm -rf $(DOXYGEN_DIR)/rosdoc
232
233 clean:
234         @$(MAKE) userclean
235         @echo + clean [KERNEL/TESTS]
236         @rm -rf $(OBJDIR)
237         @echo All clean and pretty!
238
239 realclean: clean
240         @rm -f kern/boot
241         @rm -f kern/include/arch
242         @rm -f user/parlib/include/arch
243
244 always:
245         @:
246
247 .PHONY: all always docs clean
248