prex: recurse subdirectories with make instead of using the shell
[prex.git] / mk / Makefile.inc
blob3812e483d838d7dd0b526bdd513160f6f6842799
2 # Makefile.inc - common make rules to build Prex
5 # Required environment variables
7 #  PREX_SRC      ... Root directory of source tree
8 #  PREX_ARCH     ... Architecture name
9 #  PREX_PLATFORM ... Platform name
11 # Optional environment variables
13 #  NDEBUG        ... 0 for debug, 1 for release (default: 0)
14 #  KTRACE        ... 1 for the kernel function trace (default: 0)
15 #  LIBGCC_PATH   ... Full path for libgcc.a
16 #  CROSS_COMPILE ... Prefix of tools for cross compile
18 # Variables in local Makefile
20 #  TARGET       ... Target file name
21 #  TYPE         ... Traget type
22 #                   e.g. OBJECT,LIBRARY,KERNEL,BINARY,EXEC,DRIVER,OS_IMAGE
23 #  SUBDIRS      ... List of subdirectories
24 #  OBJS         ... Object files (not for drivers)
25 #  OBJS-y       ... Object files
26 #  OBJS-m       ... Object files for modular driver (only for drivers)
27 #  OBJS-        ... Disabled Object files
28 #  OBJS-$(CONFIG_FOO) ... Object enabled / disabled by conf/config.ARCH-PLATFORM
29 #  LIBS         ... Libraries
30 #  MAP          ... Name of map file
31 #  DISASM       ... Disassemble list file
32 #  SYMBOL       ... Symbol files
35 # Variables in conf/boot.conf (override in conf/config.ARCH-PLATFORM)
37 # DRIVER        ... path to driver modules or undefined for no modules
38 # TASKS         ... tasks included in kernel image
39 # RDFILES       ... Files in RAM disk
41 # Variables in conf/config.ARCH-PLATFORM
43 # CONFIG_FOO=y  ... enable feature FOO / build driver FOO into kernel
44 # CONFIG_FOO=m  ... build driver FOO as a module
45 # CONFIG_FOO=*  ... set config parameter FOO to *
48 # Option for cross compile
50 #CROSS_COMPILE  =
51 #CROSS_COMPILE  = i386-elf-
52 #CROSS_COMPILE  = arm-elf-
53 #CROSS_COMPILE  = powerpc-eabi-
54 #CROSS_COMPILE  = sh-elf-
55 #CROSS_COMPILE  = mips-elf-
58 # Tools
60 CC      = $(CROSS_COMPILE)gcc
61 CPP     = $(CROSS_COMPILE)cpp
62 AS      = $(CROSS_COMPILE)as
63 LD      = $(CROSS_COMPILE)ld
64 AR      = $(CROSS_COMPILE)ar
65 OBJCOPY = $(CROSS_COMPILE)objcopy
66 OBJDUMP = $(CROSS_COMPILE)objdump
67 STRIP   = $(CROSS_COMPILE)strip
68 LINT    = splint
69 MAKE    = make
70 RM      = rm
71 #SHELL  = /bin/sh
72 ifdef SHELL_PATH
73 SHELL   = $(SHELL_PATH)
74 endif
75 ifdef DISASM
76 ASMGEN  = $(OBJDUMP) $@ --disassemble-all > $(DISASM)
77 endif
80 # System dependent options
82 include $(PREX_SRC)/mk/own.mk
85 # Flags
87 DEF_FLAGS = -D__$(PREX_ARCH)__ -D__$(PREX_PLATFORM)__ \
88         -D__ARCH__=$(PREX_ARCH) -D__PLATFORM__=$(PREX_PLATFORM) \
89         -U$(PREX_ARCH) -U$(PREX_PLATFORM)
91 ifeq ($(NDEBUG),1)
92 CFLAGS += -fomit-frame-pointer
93 else
94 CFLAGS += -DDEBUG -g
95 endif
97 # Correct gcc behavior for some distributions.
98 SSP_FLAG ?= $(shell if $(CC) -fno-stack-protector -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "-fno-stack-protector"; fi)
99 export SSP_FLAG
100 CFLAGS += $(SSP_FLAG)
102 ifdef MAP
103 LDFLAGS += -Map $(MAP)
104 endif
106 ASFLAGS += -W
107 CFLAGS += -Wsign-compare
108 CFLAGS += -Werror-implicit-function-declaration
109 CFLAGS  += -Wall -O2 -fno-strict-aliasing $(DEF_FLAGS)
110 CPPFLAGS += $(DEF_FLAGS)
111 LDFLAGS +=
112 #MAKEFLAGS += --no-print-directory
114 LINT_FLAGS = -D__lint__ $(DEF_FLAGS) -nolib -weak -fcnuse -nestcomment \
115         -retvalother -fullinitblock
118 # Specify path for libgcc.a
120 ifndef LIBGCC_PATH
121 LIBGCC_PATH := $(dir $(shell $(CC) $(GLOBAL_CFLAGS) -print-libgcc-file-name))
122 endif
125 # Inference rules
127 %.o: %.c
128         $(CC) $(CFLAGS) $(CFLAGS_$@) $(EXTRA_CFLAGS) -c -o $@ $<
130 %.o: %.s
131         $(AS) $(ASFLAGS) $(ASFLAGS_$@) $(EXTRA_ASFLAGS) -o $@ $<
133 %.o: %.S
134         $(CPP) $(CPPFLAGS) $(CPPFLAGS_$@) $(EXTRA_CPPFLAGS) $< $*.tmp
135         $(AS) $(ASFLAGS) $(ASFLAGS_$@) $(EXTRA_ASFLAGS) -o $@ $*.tmp
136         $(RM) -f $*.tmp
139 # Target
141 all: $(SUBDIRS) $(TARGET)
144 # Check configuration
146 ifeq (0, ${MAKELEVEL})
147 # add dependency on config.h
148 $(SUBDIRS):$(PREX_SRC)/conf/config.h
150 $(PREX_SRC)/conf/config.h: dummy
151         @if [ ! -f $@ ]; then \
152                 echo 'You must run `configure` before make.' ;\
153                 exit 1 ;\
154         fi
155 endif
158 # Rules to process sub-directory
160 .PHONY: $(SUBDIRS) 
161 $(SUBDIRS):
162         $(MAKE) -C $@ $(MAKECMDGOALS)
165 # Rules to link a set of .o files into one .o file
167 ifeq ($(TYPE),OBJECT)
168 ifeq (,$(findstring __DRIVER__,$(CFLAGS)))
170 # normal objects
172 # OBJS   unconditionally linked objects
173 # OBJS-y conditionally linked based on a CONFIG_* variable
174 # OBJS-  disabled objects - associated CONFIG_* variable undefined
176 $(TARGET): $(OBJS) $(OBJS-y)
177         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $^ $(LIBS)
179 ifneq (,$(strip $(OBJS-m)))
180 $(error $(OBJS-m) must not be OBJ-m, this is only for drivers)
181 endif
183 else
185 # driver objects
187 # OBJS-y link objects for static drivers (typically set via CONFIG_*)
188 # OBJS-m link objects for modular drivers
189 # OBJS-  disabled objects
190 # OBJS   is no longer used for drivers
191 ifneq (,$(strip $(OBJS)))
192 $(error $(OBJS) must not be OBJS, this is _not_ for drivers)
193 endif
195 # additional target for modular drivers
196 all: $(TARGET:.o=.mo)
198 # static driver objects
199 ifneq (,$(strip $(OBJS-y)))
200 $(TARGET): $(OBJS-y)
201         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $^
202 else # ensure an object file always exists
203 $(TARGET): dummy
204         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $@
205 endif
207 # modular driver objects
208 ifneq (,$(strip $(OBJS-m)))
209 $(TARGET:.o=.mo): $(OBJS-m)
210         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $^
211 else
212 $(TARGET:.o=.mo): dummy
213         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $@
214 endif
216 endif # driver objects
217 endif # type opject
220 # Rules to compile library
222 ifeq ($(TYPE),LIBRARY)
223 $(TARGET): $(OBJS) ar-target
225 .PHONY: ar-target
226 ar-target: $(OBJS)
227         $(AR) $(EXTRA_ARFLAGS) rucs $(TARGET) $?
228 endif 
231 # Rules to compile kernel
233 ifeq ($(TYPE),KERNEL)
234 $(TARGET): $(OBJS) $(LIBS) $(LD_SCRIPT)
235         $(LD) $(LDFLAGS) -T $(LD_SCRIPT) -o $@ $(OBJS) $(LIBS)
236         $(ASMGEN)
237 ifdef SYMBOL
238         cp $@ $(SYMBOL)
239 endif
240         $(STRIP) -s $@
241 endif
244 # Rules to compile device driver
246 ifeq ($(TYPE),DRIVER)
247 # additional target for modular drivers
248 all: $(TARGET:.o=.ko)
250 $(TARGET:.o=.ko):  $(OBJS:.o=.mo) $(LD_SCRIPT)
251         $(LD) $(LDFLAGS) -T $(LD_SCRIPT) -o $@ $(OBJS:.o=.mo) $(LIBS)
252         $(ASMGEN)
253 ifdef SYMBOL
254         cp $@ $(SYMBOL)
255 endif
256         $(STRIP) --strip-debug --strip-unneeded $@
258 # staticly linked drivers
259 $(TARGET): $(OBJS)
260         $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $^
261 endif
264 # Rules to compile binary file
266 ifeq ($(TYPE),BINARY)
267 $(TARGET): $(OBJS) $(LD_SCRIPT)
268         $(LD) $(LDFLAGS) -T $(LD_SCRIPT) $(EXTRA_LDFLAGS) -o $@ $(OBJS) $(LIBS)
269         $(ASMGEN)
270 ifdef SYMBOL
271         cp $@ $(SYMBOL)
272 endif
273         $(OBJCOPY) $(OBJCOPYFLAGS) $@
274 endif
277 # Rules to compile executable file
279 ifeq ($(TYPE),EXEC)
280 $(TARGET): $(OBJS) $(LIBS) $(LD_SCRIPT)
281         $(LD) $(LDFLAGS) -T $(LD_SCRIPT) $(EXTRA_LDFLAGS) -o $@ \
282         $(CRT0) $(OBJS) $(LIBS) $(LIBC) $(LIBGCC_PATH)libgcc.a
283         $(ASMGEN)
284 ifdef SYMBOL
285         cp $@ $(SYMBOL)
286 endif
287         $(STRIP) --strip-debug --strip-unneeded $@
288 endif
291 # Rules to create OS image
293 ifeq ($(TYPE),OS_IMAGE)
294 $(TARGET): dummy
295 ifdef RDFILES
296         $(AR) rcS ramdisk.a $(RDFILES)
297         $(AR) t ramdisk.a
298         $(AR) rcS tmp.a $(KERNEL) $(DRIVER) $(TASKS) ramdisk.a
299         $(RM) ramdisk.a
300 else
301         $(AR) rcS tmp.a $(KERNEL) $(DRIVER) $(TASKS)
302 endif
303         $(AR) t tmp.a
304         cat $(LOADER) tmp.a > $@
305         $(RM) tmp.a
306 endif
309 -include Makefile.dep
311 C_SRCS = $(wildcard *.c) $(wildcard *.S)
314 # Depend
316 .PHONY: depend dep
317 depend dep: $(SUBDIRS)
318         $(RM) -f Makefile.dep
319         @(for d in $(C_SRCS) _ ; do \
320           if [ "$$d" != "_" ] ; then \
321           $(CPP) -M $(CPPFLAGS) $$d >> Makefile.dep; fi; \
322         done);
324 # Lint
326 .PHONY: lint
327 lint:
328         @(for d in $(C_SRCS) _ ; do \
329           if [ "$$d" != "_" ] ; then \
330           $(LINT) $(LINT_FLAGS) $(INC_FLAGS) $$d; fi; \
331         done);
334 # Clean up
336 .PHONY: clean
337 clean: $(SUBDIRS)
338         $(RM) -f Makefile.dep $(TARGET) $(DISASM) $(MAP) $(SYMBOL) $(CLEANS)
339 ifneq (,$(strip $(OBJS) $(OBJS-y) $(OBJS-m) $(OBJS-)))
340         $(RM) -f $(sort $(OBJS) $(OBJS-y) $(OBJS-m) $(OBJS-))
341 endif
342 ifeq ($(TYPE),DRIVER)
343 ifneq (,$(strip $(TARGET:.o=.ko) $(OBJS:.o=.mo)))
344         $(RM) -f $(sort $(TARGET:.o=.ko) $(OBJS:.o=.mo))
345 endif
346 endif
347 ifeq ($(TYPE),OBJECT)
348 ifneq (,$(findstring __DRIVER__,$(CFLAGS)))
349         $(RM) -f $(TARGET:.o=.mo)
350 endif
351 endif
353 .PHONY: dummy