Added support for building simple user programs
[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;\
25         else\
26           $(MAKE) all -j;\
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 # Then grab the users Makelocal file to let them override Make system variables
42 # and set up other Make targets
43 -include Makelocal
44
45 TOP_DIR := .
46 ARCH_DIR := $(TOP_DIR)/kern/arch
47 INCLUDE_DIR := $(TOP_DIR)/kern/include
48 DOXYGEN_DIR := $(TOP_DIR)/Documentation/doxygen
49
50 UNAME=$(shell uname -m)
51
52 # Cross-compiler ros toolchain
53 #
54 # This Makefile will automatically use the cross-compiler toolchain
55 # installed as '$(TARGET_ARCH)-ros-*', if one exists.  If the host tools ('gcc',
56 # 'objdump', and so forth) compile for a 32-bit ELF target, that will
57 # be detected as well.  If you have the right compiler toolchain installed
58 # using a different name, set GCCPREFIX explicitly in your Makelocal file
59
60 # Try to infer the correct GCCPREFIX
61 ifneq ($(TARGET_ARCH),)
62 ifndef GCCPREFIX
63 TEST_PREFIX := $(TARGET_ARCH)-ros-
64 else
65 TEST_PREFIX := $(GCCPREFIX)
66 endif
67 GCC_EXISTS = $(shell which $(TEST_PREFIX)gcc)
68 ifneq ($(GCC_EXISTS),)
69         GCCPREFIX := $(TEST_PREFIX)
70 else
71         ERROR := "*** Error: Couldn't find $(TEST_PREFIX) version of GCC/binutils." 
72 endif
73 ifdef ERROR
74 error: 
75         @echo $(ERROR)
76         @exit 1
77 else
78 error:
79 endif
80 endif
81
82 # Default programs for compilation
83 ifeq ($(COMPILER),IVY)
84 KERN_CFLAGS := --deputy \
85                   --no-rc-sharc \
86                   --sc-dynamic-is-error \
87                   --sc-ops=$(INCLUDE_DIR)/ivy/sharc.h \
88                   --sc-all-in-thread \
89                   --enable-precompile \
90 #                  --enable-error-db \
91
92 USER_CFLAGS := --deputy --enable-error-db
93 CC          := ivycc --gcc=$(GCCPREFIX)gcc
94 else
95 CC          := $(GCCPREFIX)gcc 
96 endif
97
98 AS          := $(GCCPREFIX)as
99 AR          := $(GCCPREFIX)ar
100 LD          := $(GCCPREFIX)ld
101 OBJCOPY := $(GCCPREFIX)objcopy
102 OBJDUMP := $(GCCPREFIX)objdump
103 NM          := $(GCCPREFIX)nm
104 PERL    := perl
105
106 EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
107
108 # GCC Library path
109 ifneq ($(GCC_EXISTS),)
110 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
111 endif
112
113 # Universal compiler flags
114 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
115 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
116 CFLAGS := $(CFLAGS) -D$(TARGET_ARCH) $(EXTRAARGS)
117 CFLAGS += -O2 -pipe -MD -fno-builtin -gstabs
118 CFLAGS += -Wall -Wno-format -Wno-unused -fno-strict-aliasing
119 CFLAGS += -nostdinc -I$(dir $(GCC_LIB))/include
120
121 # Universal loader flags
122 LDFLAGS := -nostdlib
123
124 # List of directories that the */Makefrag makefile fragments will add to
125 OBJDIRS :=
126
127 ROS_ARCH_DIR ?= $(TARGET_ARCH)
128
129 symlinks: error
130         ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
131         ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
132         @$(MAKE) -j all
133
134 # Include Makefrags for subdirectories
135 ifneq ($(TARGET_ARCH),)
136 include kern/Makefrag
137 include user/Makefrag
138 include tests/Makefrag
139 endif
140
141 tests: $(TESTS_EXECS)
142         @mkdir -p fs/$(TARGET_ARCH)/tests
143         cp -R $(OBJDIR)/$(TESTS_DIR)/* fs/$(TARGET_ARCH)/tests
144
145 # Eliminate default suffix rules
146 .SUFFIXES:
147
148 # Delete target files if there is an error (or make is interrupted)
149 .DELETE_ON_ERROR:
150
151 # This magic automatically generates makefile dependencies
152 # for header files included from C source files we compile,
153 # and keeps those dependencies up-to-date every time we recompile.
154 # See 'mergedep.pl' for more information.
155 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
156         @mkdir -p $(@D)
157         @$(PERL) scripts/mergedep.pl $@ $^
158
159 # By including this file we automatically force the target that generates it 
160 # to be rerun
161 -include $(OBJDIR)/.deps
162
163 # Use doxygen to make documentation for ROS
164 docs: 
165         @DOXYGEN_DIR=$(DOXYGEN_DIR) doxygen $(DOXYGEN_DIR)/rosdoc.cfg
166         @if [ ! -d $(DOXYGEN_DIR)/rosdoc/html/img ]; \
167          then \
168                 ln -s ../../img $(DOXYGEN_DIR)/rosdoc/html; \
169          fi
170
171 doxyclean:
172         rm -rf $(DOXYGEN_DIR)/rosdoc
173
174 # For deleting the build
175 clean:
176         @rm -rf $(OBJDIR)
177         @echo All clean and pretty!
178
179 realclean: clean
180         @rm -f kern/boot
181         @rm -f kern/include/arch
182
183 always:
184         @:
185
186 .PHONY: all always docs clean
187