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