UCQ debug code
[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 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 -static
134 KERN_CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
135 KERN_CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
136 # Our backtraces need the frame pointer
137 KERN_CFLAGS += -fno-omit-frame-pointer
138
139 # Universal loader flags
140 LDFLAGS := -nostdlib
141
142 # List of directories that the */Makefrag makefile fragments will add to
143 OBJDIRS :=
144
145 ROS_ARCH_DIR ?= $(TARGET_ARCH)
146
147 arch:
148         @echo "TARGET_ARCH=$(TARGET_ARCH)"
149
150 symlinks: error
151         ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
152         ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
153         ln -fs $(ROS_ARCH_DIR) user/parlib/include/arch
154         @$(MAKE) -j $(MAKE_JOBS) all
155
156 # Include Makefrags for subdirectories
157 ifneq ($(TARGET_ARCH),)
158 include tests/Makefrag
159 include kern/Makefrag
160 endif
161
162 ifeq ($(GCCPREFIX),$(TARGET_ARCH)-ros-)
163 GCC_ROOT := $(shell which $(GCCPREFIX)gcc | xargs dirname)/../
164 tests/: tests
165 tests: install-libs
166         @$(MAKE) -j $(MAKE_JOBS) realtests
167 realtests: $(TESTS_EXECS)
168 # No longer automatically copying to the FS dir (deprecated)
169 #       @mkdir -p fs/$(TARGET_ARCH)/tests
170 #       cp -R $(OBJDIR)/$(TESTS_DIR)/* $(TOP_DIR)/fs/$(TARGET_ARCH)/tests
171
172 USER_LIBS = parlib pthread
173 # for now, c3po can't be built for non-i686
174 ifeq ($(TARGET_ARCH),i686)
175 USER_LIBS += c3po
176 endif
177 install-libs: 
178         @for i in $(USER_LIBS) ; do     \
179                 cd user/$$i;            \
180                 $(MAKE);                \
181                 $(MAKE) install;        \
182                 cd ../..;               \
183         done
184
185 fill-kfs: install-libs
186         @rm -rf $(FIRST_INITRAMFS_PATH)/lib
187         @cp -R $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib $(FIRST_INITRAMFS_PATH)
188 endif
189
190 userclean:
191         @for i in $(USER_LIBS) ; do \
192                 cd user/$$i;            \
193                 $(MAKE) clean;          \
194                 cd ../..;               \
195         done
196         @rm -rf $(OBJDIR)/$(TESTS_DIR)
197 .PHONY: tests
198
199 # Eliminate default suffix rules
200 .SUFFIXES:
201
202 # Delete target files if there is an error (or make is interrupted)
203 .DELETE_ON_ERROR:
204
205 # This magic automatically generates makefile dependencies
206 # for header files included from C source files we compile,
207 # and keeps those dependencies up-to-date every time we recompile.
208 # See 'mergedep.pl' for more information.
209 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
210         @mkdir -p $(@D)
211         @$(PERL) scripts/mergedep.pl $@ $^
212
213 # By including this file we automatically force the target that generates it 
214 # to be rerun
215 -include $(OBJDIR)/.deps
216
217 # Use doxygen to make documentation for ROS
218 docs: 
219         @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
220         @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
221          then \
222                 ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
223          fi
224
225 doxyclean:
226         rm -rf $(DOXYGEN_DIR)/rosdoc
227
228 clean:
229         @$(MAKE) userclean
230         @echo + clean [KERNEL/TESTS]
231         @rm -rf $(OBJDIR)
232         @echo All clean and pretty!
233
234 realclean: clean
235         @rm -f kern/boot
236         @rm -f kern/include/arch
237         @rm -f user/parlib/include/arch
238
239 always:
240         @:
241
242 .PHONY: all always docs clean
243