x86: changes LAPIC timer divisor to 32
[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         @rm -rf $(FIRST_INITRAMFS_PATH)/lib
190         @cp -R $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib $(FIRST_INITRAMFS_PATH)
191 endif
192
193 userclean:
194         @for i in $(USER_LIBS) ; do \
195                 cd user/$$i;            \
196                 $(MAKE) clean;          \
197                 cd ../..;               \
198         done
199         @rm -rf $(OBJDIR)/$(TESTS_DIR)
200 .PHONY: tests
201
202 # Eliminate default suffix rules
203 .SUFFIXES:
204
205 # Delete target files if there is an error (or make is interrupted)
206 .DELETE_ON_ERROR:
207
208 # This magic automatically generates makefile dependencies
209 # for header files included from C source files we compile,
210 # and keeps those dependencies up-to-date every time we recompile.
211 # See 'mergedep.pl' for more information.
212 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
213         @mkdir -p $(@D)
214         @$(PERL) scripts/mergedep.pl $@ $^
215
216 # By including this file we automatically force the target that generates it 
217 # to be rerun
218 -include $(OBJDIR)/.deps
219
220 # Use doxygen to make documentation for ROS
221 docs: 
222         @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
223         @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
224          then \
225                 ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
226          fi
227
228 doxyclean:
229         rm -rf $(DOXYGEN_DIR)/rosdoc
230
231 clean:
232         @$(MAKE) userclean
233         @echo + clean [KERNEL/TESTS]
234         @rm -rf $(OBJDIR)
235         @echo All clean and pretty!
236
237 realclean: clean
238         @rm -f kern/boot
239         @rm -f kern/include/arch
240         @rm -f user/parlib/include/arch
241
242 always:
243         @:
244
245 .PHONY: all always docs clean
246