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