1 | # -*- makefile -*- : Force emacs to use Makefile mode |
---|
2 | # |
---|
3 | # This file contains various boring housekeeping functions that would |
---|
4 | # otherwise seriously clutter up the main Makefile. |
---|
5 | |
---|
6 | ############################################################################### |
---|
7 | # |
---|
8 | # Find a usable "echo -e" substitute. |
---|
9 | # |
---|
10 | TAB := $(shell $(PRINTF) '\t') |
---|
11 | ECHO_E_ECHO := $(ECHO) |
---|
12 | ECHO_E_ECHO_E := $(ECHO) -e |
---|
13 | ECHO_E_BIN_ECHO := /bin/echo |
---|
14 | ECHO_E_BIN_ECHO_E := /bin/echo -e |
---|
15 | ECHO_E_ECHO_TAB := $(shell $(ECHO_E_ECHO) '\t' | cat) |
---|
16 | ECHO_E_ECHO_E_TAB := $(shell $(ECHO_E_ECHO_E) '\t' | cat) |
---|
17 | ECHO_E_BIN_ECHO_TAB := $(shell $(ECHO_E_BIN_ECHO) '\t') |
---|
18 | ECHO_E_BIN_ECHO_E_TAB := $(shell $(ECHO_E_BIN_ECHO_E) '\t') |
---|
19 | |
---|
20 | ifeq ($(ECHO_E_ECHO_TAB),$(TAB)) |
---|
21 | ECHO_E := $(ECHO_E_ECHO) |
---|
22 | endif |
---|
23 | ifeq ($(ECHO_E_ECHO_E_TAB),$(TAB)) |
---|
24 | ECHO_E := $(ECHO_E_ECHO_E) |
---|
25 | endif |
---|
26 | ifeq ($(ECHO_E_BIN_ECHO_TAB),$(TAB)) |
---|
27 | ECHO_E := $(ECHO_E_BIN_ECHO) |
---|
28 | endif |
---|
29 | ifeq ($(ECHO_E_BIN_ECHO_E_TAB),$(TAB)) |
---|
30 | ECHO_E := $(ECHO_E_BIN_ECHO_E) |
---|
31 | endif |
---|
32 | |
---|
33 | .echocheck : |
---|
34 | ifdef ECHO_E |
---|
35 | @$(TOUCH) $@ |
---|
36 | else |
---|
37 | @$(PRINTF) '%24s : x%sx\n' 'tab' '$(TAB)' |
---|
38 | @$(PRINTF) '%24s : x%sx\n' '"$(ECHO_E_ECHO) \t"' \ |
---|
39 | '$(ECHO_E_ECHO_TAB)' |
---|
40 | @$(PRINTF) '%24s : x%sx\n' '"$(ECHO_E_ECHO_E) \t"' \ |
---|
41 | '$(ECHO_E_ECHO_E_TAB)' |
---|
42 | @$(PRINTF) '%24s : x%sx\n' '"$(ECHO_E_BIN_ECHO) \t"' \ |
---|
43 | '$(ECHO_E_BIN_ECHO_TAB)' |
---|
44 | @$(PRINTF) '%24s : x%sx\n' '"$(ECHO_E_BIN_ECHO_E) \t"' \ |
---|
45 | '$(ECHO_E_BIN_ECHO_E_TAB)' |
---|
46 | @$(ECHO) "No usable \"echo -e\" substitute found" |
---|
47 | @exit 1 |
---|
48 | endif |
---|
49 | MAKEDEPS += .echocheck |
---|
50 | VERYCLEANUP += .echocheck |
---|
51 | |
---|
52 | echo : |
---|
53 | @$(ECHO) "Using \"$(ECHO_E)\" for \"echo -e\"" |
---|
54 | |
---|
55 | ############################################################################### |
---|
56 | # |
---|
57 | # Generate a usable "seq" substitute |
---|
58 | # |
---|
59 | define seq |
---|
60 | $(shell awk 'BEGIN { for ( i = $(1) ; i <= $(2) ; i++ ) print i }') |
---|
61 | endef |
---|
62 | |
---|
63 | ############################################################################### |
---|
64 | # |
---|
65 | # Determine host OS |
---|
66 | # |
---|
67 | HOST_OS := $(shell uname -s) |
---|
68 | hostos : |
---|
69 | @$(ECHO) $(HOST_OS) |
---|
70 | |
---|
71 | ############################################################################### |
---|
72 | # |
---|
73 | # Determine compiler |
---|
74 | |
---|
75 | CCDEFS := $(shell $(CC) -E -x c -c /dev/null -dM | cut -d" " -f2) |
---|
76 | ccdefs: |
---|
77 | @$(ECHO) $(CCDEFS) |
---|
78 | |
---|
79 | ifeq ($(filter __ICC,$(CCDEFS)),__ICC) |
---|
80 | CCTYPE := icc |
---|
81 | else |
---|
82 | CCTYPE := gcc |
---|
83 | endif |
---|
84 | cctype: |
---|
85 | @$(ECHO) $(CCTYPE) |
---|
86 | |
---|
87 | ############################################################################### |
---|
88 | # |
---|
89 | # Check for tools that can cause failed builds |
---|
90 | # |
---|
91 | .toolcheck : |
---|
92 | @if $(CC) -v 2>&1 | grep -is 'gcc version 2\.96' > /dev/null; then \ |
---|
93 | $(ECHO) 'gcc 2.96 is unsuitable for compiling Etherboot'; \ |
---|
94 | $(ECHO) 'Use gcc 2.95 or gcc 3.x instead'; \ |
---|
95 | exit 1; \ |
---|
96 | fi |
---|
97 | @if [ `perl -e 'use bytes; print chr(255)' | wc -c` = 2 ]; then \ |
---|
98 | $(ECHO) 'Your Perl version has a Unicode handling bug'; \ |
---|
99 | $(ECHO) 'Execute this command before compiling Etherboot:'; \ |
---|
100 | $(ECHO) 'export LANG=$${LANG%.UTF-8}'; \ |
---|
101 | exit 1; \ |
---|
102 | fi |
---|
103 | @$(TOUCH) $@ |
---|
104 | MAKEDEPS += .toolcheck |
---|
105 | VERYCLEANUP += .toolcheck |
---|
106 | |
---|
107 | ############################################################################### |
---|
108 | # |
---|
109 | # Check for various tool workarounds |
---|
110 | # |
---|
111 | |
---|
112 | # Make syntax does not allow use of comma or space in certain places. |
---|
113 | # This ugly workaround is suggested in the manual. |
---|
114 | # |
---|
115 | COMMA := , |
---|
116 | EMPTY := |
---|
117 | SPACE := $(EMPTY) $(EMPTY) |
---|
118 | |
---|
119 | # Check for an old version of gas (binutils 2.9.1) |
---|
120 | # |
---|
121 | OLDGAS := $(shell $(AS) --version | grep -q '2\.9\.1' && $(ECHO) -DGAS291) |
---|
122 | CFLAGS += $(OLDGAS) |
---|
123 | oldgas : |
---|
124 | @$(ECHO) $(oldgas) |
---|
125 | |
---|
126 | # Some widespread patched versions of gcc include -fstack-protector by |
---|
127 | # default, even when -ffreestanding is specified. We therefore need |
---|
128 | # to disable -fstack-protector if the compiler supports it. |
---|
129 | # |
---|
130 | ifeq ($(CCTYPE),gcc) |
---|
131 | SP_TEST = $(CC) -fno-stack-protector -x c -c /dev/null \ |
---|
132 | -o /dev/null >/dev/null 2>&1 |
---|
133 | SP_FLAGS := $(shell $(SP_TEST) && $(ECHO) '-fno-stack-protector') |
---|
134 | CFLAGS += $(SP_FLAGS) |
---|
135 | endif |
---|
136 | |
---|
137 | # gcc 4.4 generates .eh_frame sections by default, which distort the |
---|
138 | # output of "size". Inhibit this. |
---|
139 | # |
---|
140 | ifeq ($(CCTYPE),gcc) |
---|
141 | CFI_TEST = $(CC) -fno-dwarf2-cfi-asm -x c -c /dev/null \ |
---|
142 | -o /dev/null >/dev/null 2>&1 |
---|
143 | CFI_FLAGS := $(shell $(CFI_TEST) && $(ECHO) '-fno-dwarf2-cfi-asm') |
---|
144 | CFLAGS += $(CFI_FLAGS) |
---|
145 | endif |
---|
146 | |
---|
147 | # Some versions of gas choke on division operators, treating them as |
---|
148 | # comment markers. Specifying --divide will work around this problem, |
---|
149 | # but isn't available on older gas versions. |
---|
150 | # |
---|
151 | DIVIDE_TEST = $(AS) --divide /dev/null -o /dev/null 2>/dev/null |
---|
152 | DIVIDE_FLAGS := $(shell $(DIVIDE_TEST) && $(ECHO) '--divide') |
---|
153 | ASFLAGS += $(DIVIDE_FLAGS) |
---|
154 | |
---|
155 | ############################################################################### |
---|
156 | # |
---|
157 | # Build verbosity |
---|
158 | # |
---|
159 | ifeq ($(V),1) |
---|
160 | Q := |
---|
161 | QM := @\# |
---|
162 | else |
---|
163 | Q := @ |
---|
164 | QM := @ |
---|
165 | endif |
---|
166 | |
---|
167 | ############################################################################### |
---|
168 | # |
---|
169 | # Set BIN according to whatever was specified on the command line as |
---|
170 | # the build target. |
---|
171 | # |
---|
172 | |
---|
173 | # Determine how many different BIN directories are mentioned in the |
---|
174 | # make goals. |
---|
175 | # |
---|
176 | BIN_GOALS := $(filter bin/% bin-%,$(MAKECMDGOALS)) |
---|
177 | BIN_GOAL_BINS := $(foreach BG,$(BIN_GOALS),$(firstword $(subst /, ,$(BG)))) |
---|
178 | NUM_BINS := $(words $(sort $(BIN_GOAL_BINS))) |
---|
179 | |
---|
180 | ifeq ($(NUM_BINS),0) |
---|
181 | |
---|
182 | # No BIN directory was specified. Set BIN to "bin" as a sensible |
---|
183 | # default. |
---|
184 | |
---|
185 | BIN := bin |
---|
186 | |
---|
187 | else # NUM_BINS == 0 |
---|
188 | |
---|
189 | ifeq ($(NUM_BINS),1) |
---|
190 | |
---|
191 | # If exactly one BIN directory was specified, set BIN to match this |
---|
192 | # directory. |
---|
193 | # |
---|
194 | BIN := $(firstword $(BIN_GOAL_BINS)) |
---|
195 | |
---|
196 | else # NUM_BINS == 1 |
---|
197 | |
---|
198 | # More than one BIN directory was specified. We cannot handle the |
---|
199 | # latter case within a single make invocation, so set up recursive |
---|
200 | # targets for each BIN directory. |
---|
201 | # |
---|
202 | # Leave $(BIN) undefined. This has implications for any target that |
---|
203 | # depends on $(BIN); such targets should be made conditional upon the |
---|
204 | # existence of $(BIN). |
---|
205 | # |
---|
206 | $(BIN_GOALS) : % : BIN_RECURSE |
---|
207 | $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) $@ |
---|
208 | .PHONY : BIN_RECURSE |
---|
209 | |
---|
210 | endif # NUM_BINS == 1 |
---|
211 | endif # NUM_BINS == 0 |
---|
212 | |
---|
213 | ifdef BIN |
---|
214 | |
---|
215 | # Create $(BIN) directory if it doesn't exist yet |
---|
216 | # |
---|
217 | ifeq ($(wildcard $(BIN)),) |
---|
218 | $(shell $(MKDIR) -p $(BIN)) |
---|
219 | endif |
---|
220 | |
---|
221 | # Target to allow e.g. "make bin-efi arch" |
---|
222 | # |
---|
223 | $(BIN) : |
---|
224 | @# Do nothing, silently |
---|
225 | .PHONY : $(BIN) |
---|
226 | |
---|
227 | # Remove everything in $(BIN) for a "make clean" |
---|
228 | # |
---|
229 | CLEANUP += $(BIN)/*.* # Avoid picking up directories |
---|
230 | |
---|
231 | endif # defined(BIN) |
---|
232 | |
---|
233 | # Determine whether or not we need to include the dependency files |
---|
234 | # |
---|
235 | NO_DEP_TARGETS := $(BIN) clean veryclean |
---|
236 | ifeq ($(MAKECMDGOALS),) |
---|
237 | NEED_DEPS := 1 |
---|
238 | endif |
---|
239 | ifneq ($(strip $(filter-out $(NO_DEP_TARGETS),$(MAKECMDGOALS))),) |
---|
240 | NEED_DEPS := 1 |
---|
241 | endif |
---|
242 | |
---|
243 | ############################################################################### |
---|
244 | # |
---|
245 | # Select build architecture and platform based on $(BIN) |
---|
246 | # |
---|
247 | # BIN has the form bin[-[arch-]platform] |
---|
248 | |
---|
249 | ARCHS := $(patsubst arch/%,%,$(wildcard arch/*)) |
---|
250 | PLATFORMS := $(patsubst config/defaults/%.h,%,\ |
---|
251 | $(wildcard config/defaults/*.h)) |
---|
252 | archs : |
---|
253 | @$(ECHO) $(ARCHS) |
---|
254 | |
---|
255 | platforms : |
---|
256 | @$(ECHO) $(PLATFORMS) |
---|
257 | |
---|
258 | ifdef BIN |
---|
259 | |
---|
260 | # Determine architecture portion of $(BIN), if present |
---|
261 | BIN_ARCH := $(strip $(foreach A,$(ARCHS),\ |
---|
262 | $(patsubst bin-$(A)-%,$(A),\ |
---|
263 | $(filter bin-$(A)-%,$(BIN))))) |
---|
264 | |
---|
265 | # Determine platform portion of $(BIN), if present |
---|
266 | ifeq ($(BIN_ARCH),) |
---|
267 | BIN_PLATFORM := $(patsubst bin-%,%,$(filter bin-%,$(BIN))) |
---|
268 | else |
---|
269 | BIN_PLATFORM := $(patsubst bin-$(BIN_ARCH)-%,%,$(BIN)) |
---|
270 | endif |
---|
271 | |
---|
272 | # Determine build architecture |
---|
273 | DEFAULT_ARCH := i386 |
---|
274 | ARCH := $(firstword $(BIN_ARCH) $(DEFAULT_ARCH)) |
---|
275 | CFLAGS += -DARCH=$(ARCH) |
---|
276 | arch : |
---|
277 | @$(ECHO) $(ARCH) |
---|
278 | .PHONY : arch |
---|
279 | |
---|
280 | # Determine build platform |
---|
281 | DEFAULT_PLATFORM := pcbios |
---|
282 | PLATFORM := $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM)) |
---|
283 | CFLAGS += -DPLATFORM=$(PLATFORM) |
---|
284 | platform : |
---|
285 | @$(ECHO) $(PLATFORM) |
---|
286 | |
---|
287 | endif # defined(BIN) |
---|
288 | |
---|
289 | # Include architecture-specific Makefile |
---|
290 | ifdef ARCH |
---|
291 | MAKEDEPS += arch/$(ARCH)/Makefile |
---|
292 | include arch/$(ARCH)/Makefile |
---|
293 | endif |
---|
294 | |
---|
295 | # Include architecture-specific include path |
---|
296 | ifdef ARCH |
---|
297 | INCDIRS += arch/$(ARCH)/include |
---|
298 | endif |
---|
299 | |
---|
300 | ############################################################################### |
---|
301 | # |
---|
302 | # Source file handling |
---|
303 | |
---|
304 | # SRCDIRS lists all directories containing source files. |
---|
305 | srcdirs : |
---|
306 | @$(ECHO) $(SRCDIRS) |
---|
307 | |
---|
308 | # SRCS lists all .c or .S files found in any SRCDIR |
---|
309 | # |
---|
310 | SRCS += $(wildcard $(patsubst %,%/*.c,$(SRCDIRS))) |
---|
311 | SRCS += $(wildcard $(patsubst %,%/*.S,$(SRCDIRS))) |
---|
312 | srcs : |
---|
313 | @$(ECHO) $(SRCS) |
---|
314 | |
---|
315 | # AUTO_SRCS lists all files in SRCS that are not mentioned in |
---|
316 | # NON_AUTO_SRCS. Files should be added to NON_AUTO_SRCS if they |
---|
317 | # cannot be built using the standard build template. |
---|
318 | # |
---|
319 | AUTO_SRCS = $(filter-out $(NON_AUTO_SRCS),$(SRCS)) |
---|
320 | autosrcs : |
---|
321 | @$(ECHO) $(AUTO_SRCS) |
---|
322 | |
---|
323 | # Just about everything else in this section depends upon having |
---|
324 | # $(BIN) set |
---|
325 | |
---|
326 | ifdef BIN |
---|
327 | |
---|
328 | # INCDIRS lists the include path |
---|
329 | incdirs : |
---|
330 | @$(ECHO) $(INCDIRS) |
---|
331 | |
---|
332 | # Common flags |
---|
333 | # |
---|
334 | CFLAGS += $(foreach INC,$(INCDIRS),-I$(INC)) |
---|
335 | CFLAGS += -Os |
---|
336 | CFLAGS += -g |
---|
337 | ifeq ($(CCTYPE),gcc) |
---|
338 | CFLAGS += -ffreestanding |
---|
339 | CFLAGS += -Wall -W -Wformat-nonliteral |
---|
340 | endif |
---|
341 | ifeq ($(CCTYPE),icc) |
---|
342 | CFLAGS += -fno-builtin |
---|
343 | CFLAGS += -no-ip |
---|
344 | CFLAGS += -no-gcc |
---|
345 | CFLAGS += -diag-disable 111 # Unreachable code |
---|
346 | CFLAGS += -diag-disable 128 # Unreachable loop |
---|
347 | CFLAGS += -diag-disable 170 # Array boundary checks |
---|
348 | CFLAGS += -diag-disable 177 # Unused functions |
---|
349 | CFLAGS += -diag-disable 181 # printf() format checks |
---|
350 | CFLAGS += -diag-disable 188 # enum strictness |
---|
351 | CFLAGS += -diag-disable 193 # Undefined preprocessor identifiers |
---|
352 | CFLAGS += -diag-disable 280 # switch ( constant ) |
---|
353 | CFLAGS += -diag-disable 310 # K&R parameter lists |
---|
354 | CFLAGS += -diag-disable 424 # Extra semicolon |
---|
355 | CFLAGS += -diag-disable 589 # Declarations mid-code |
---|
356 | CFLAGS += -diag-disable 593 # Unused variables |
---|
357 | CFLAGS += -diag-disable 810 # Casting ints to smaller ints |
---|
358 | CFLAGS += -diag-disable 981 # Sequence point violations |
---|
359 | CFLAGS += -diag-disable 1292 # Ignored attributes |
---|
360 | CFLAGS += -diag-disable 1338 # void pointer arithmetic |
---|
361 | CFLAGS += -diag-disable 1361 # Variable-length arrays |
---|
362 | CFLAGS += -diag-disable 1418 # Missing prototypes |
---|
363 | CFLAGS += -diag-disable 1419 # Missing prototypes |
---|
364 | CFLAGS += -diag-disable 1599 # Hidden variables |
---|
365 | CFLAGS += -Wall -Wmissing-declarations |
---|
366 | endif |
---|
367 | CFLAGS += $(EXTRA_CFLAGS) |
---|
368 | ASFLAGS += $(EXTRA_ASFLAGS) |
---|
369 | LDFLAGS += $(EXTRA_LDFLAGS) |
---|
370 | |
---|
371 | # Inhibit -Werror if NO_WERROR is specified on make command line |
---|
372 | # |
---|
373 | ifneq ($(NO_WERROR),1) |
---|
374 | CFLAGS += -Werror |
---|
375 | ASFLAGS += --fatal-warnings |
---|
376 | endif |
---|
377 | |
---|
378 | # compiler.h is needed for our linking and debugging system |
---|
379 | # |
---|
380 | CFLAGS += -include compiler.h |
---|
381 | |
---|
382 | # CFLAGS for specific object types |
---|
383 | # |
---|
384 | CFLAGS_c += |
---|
385 | CFLAGS_S += -DASSEMBLY |
---|
386 | |
---|
387 | # Base object name of the current target |
---|
388 | # |
---|
389 | OBJECT = $(firstword $(subst ., ,$(@F))) |
---|
390 | |
---|
391 | # CFLAGS for specific object files. You can define |
---|
392 | # e.g. CFLAGS_rtl8139, and have those flags automatically used when |
---|
393 | # compiling bin/rtl8139.o. |
---|
394 | # |
---|
395 | OBJ_CFLAGS = $(CFLAGS_$(OBJECT)) -DOBJECT=$(subst -,_,$(OBJECT)) |
---|
396 | $(BIN)/%.flags : |
---|
397 | @$(ECHO) $(OBJ_CFLAGS) |
---|
398 | |
---|
399 | # ICC requires postprocessing objects to fix up table alignments |
---|
400 | # |
---|
401 | ifeq ($(CCTYPE),icc) |
---|
402 | POST_O = && $(ICCFIX) $@ |
---|
403 | POST_O_DEPS := $(ICCFIX) |
---|
404 | else |
---|
405 | POST_O := |
---|
406 | POST_O_DEPS := |
---|
407 | endif |
---|
408 | |
---|
409 | # Rules for specific object types. |
---|
410 | # |
---|
411 | COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS) |
---|
412 | RULE_c = $(Q)$(COMPILE_c) -c $< -o $@ $(POST_O) |
---|
413 | RULE_c_to_dbg%.o = $(Q)$(COMPILE_c) -Ddebug_$(subst -,_,$(OBJECT))=$* -c $< -o $@ $(POST_O) |
---|
414 | RULE_c_to_c = $(Q)$(COMPILE_c) -E -c $< > $@ |
---|
415 | RULE_c_to_s = $(Q)$(COMPILE_c) -S -g0 -c $< -o $@ |
---|
416 | |
---|
417 | PREPROCESS_S = $(CPP) $(CFLAGS) $(CFLAGS_S) $(OBJ_CFLAGS) |
---|
418 | ASSEMBLE_S = $(AS) $(ASFLAGS) |
---|
419 | RULE_S = $(Q)$(PREPROCESS_S) $< | $(ASSEMBLE_S) -o $@ |
---|
420 | RULE_S_to_s = $(Q)$(PREPROCESS_S) $< > $@ |
---|
421 | |
---|
422 | DEBUG_TARGETS += dbg%.o c s |
---|
423 | |
---|
424 | # We automatically generate rules for any file mentioned in AUTO_SRCS |
---|
425 | # using the following set of templates. It would be cleaner to use |
---|
426 | # $(eval ...), but this function exists only in GNU make >= 3.80. |
---|
427 | |
---|
428 | # src_template : generate Makefile rules for a given source file |
---|
429 | # |
---|
430 | # $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") |
---|
431 | # $(2) is the full path to the .d file (e.g. "bin/deps/drivers/net/rtl8139.d") |
---|
432 | # $(3) is the source type (e.g. "c") |
---|
433 | # $(4) is the source base name (e.g. "rtl8139") |
---|
434 | # |
---|
435 | define src_template |
---|
436 | |
---|
437 | @$(ECHO) " [DEPS] $(1)" |
---|
438 | @$(MKDIR) -p $(dir $(2)) |
---|
439 | @$(RM) $(2) |
---|
440 | @$(TOUCH) $(2) |
---|
441 | @$(CPP) $(CFLAGS) $(CFLAGS_$(3)) $(CFLAGS_$(4)) -DOBJECT=$(4) \ |
---|
442 | -Wno-error -MM $(1) -MG -MP | \ |
---|
443 | sed 's/\.o\s*:/_DEPS =/' >> $(2) |
---|
444 | @$(ECHO_E) '\n$$(BIN)/$(4).o :' \ |
---|
445 | '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(4)_DEPS)' \ |
---|
446 | '\n\t$$(QM)$(ECHO) " [BUILD] $$@"' \ |
---|
447 | '\n\t$$(RULE_$(3))\n' \ |
---|
448 | '\nBOBJS += $$(BIN)/$(4).o\n' \ |
---|
449 | $(foreach TGT,$(DEBUG_TARGETS), \ |
---|
450 | $(if $(RULE_$(3)_to_$(TGT)), \ |
---|
451 | '\n$$(BIN)/$(4).$(TGT) :' \ |
---|
452 | '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(4)_DEPS)' \ |
---|
453 | '\n\t$$(QM)$(ECHO) " [BUILD] $$@"' \ |
---|
454 | '\n\t$$(RULE_$(3)_to_$(TGT))\n' \ |
---|
455 | '\n$(TGT)_OBJS += $$(BIN)/$(4).$(TGT)\n' ) ) \ |
---|
456 | '\n$(2) : $$($(4)_DEPS)\n' \ |
---|
457 | '\nTAGS : $$($(4)_DEPS)\n' \ |
---|
458 | >> $(2) |
---|
459 | @$(PARSEROM) $(1) >> $(2) |
---|
460 | |
---|
461 | endef |
---|
462 | |
---|
463 | # Rule to generate the Makefile rules files to be included |
---|
464 | # |
---|
465 | $(BIN)/deps/%.d : % $(MAKEDEPS) $(PARSEROM) |
---|
466 | $(if $(filter $(AUTO_SRCS),$<),$(call src_template,$<,$@,$(subst .,,$(suffix $<)),$(basename $(notdir $<))),@$(ECHO) 'ERROR: $< is not an AUTO_SRC' ; exit 1) |
---|
467 | |
---|
468 | # Calculate and include the list of Makefile rules files |
---|
469 | # |
---|
470 | AUTO_DEPS = $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS)) |
---|
471 | ifdef NEED_DEPS |
---|
472 | ifneq ($(AUTO_DEPS),) |
---|
473 | -include $(AUTO_DEPS) |
---|
474 | endif |
---|
475 | endif |
---|
476 | autodeps : |
---|
477 | @$(ECHO) $(AUTO_DEPS) |
---|
478 | VERYCLEANUP += $(BIN)/deps |
---|
479 | |
---|
480 | # The following variables are created by the Makefile rules files |
---|
481 | # |
---|
482 | bobjs : |
---|
483 | @$(ECHO) $(BOBJS) |
---|
484 | drivers : |
---|
485 | @$(ECHO) $(DRIVERS) |
---|
486 | .PHONY : drivers |
---|
487 | roms : |
---|
488 | @$(ECHO) $(ROMS) |
---|
489 | |
---|
490 | # List of embedded images included in the last build of embedded.o. |
---|
491 | # This is needed in order to correctly rebuild embedded.o whenever the |
---|
492 | # list of objects changes. |
---|
493 | # |
---|
494 | EMBEDDED_LIST := $(BIN)/.embedded.list |
---|
495 | ifeq ($(wildcard $(EMBEDDED_LIST)),) |
---|
496 | EMBEDDED_LIST_IMAGE := <invalid> |
---|
497 | else |
---|
498 | EMBEDDED_LIST_IMAGE := $(shell cat $(EMBEDDED_LIST)) |
---|
499 | endif |
---|
500 | ifneq ($(EMBEDDED_LIST_IMAGE),$(EMBEDDED_IMAGE)) |
---|
501 | $(shell $(ECHO) "$(EMBEDDED_IMAGE)" > $(EMBEDDED_LIST)) |
---|
502 | endif |
---|
503 | |
---|
504 | $(EMBEDDED_LIST) : |
---|
505 | |
---|
506 | VERYCLEANUP += $(EMBEDDED_LIST) |
---|
507 | |
---|
508 | EMBEDDED_FILES := $(subst $(COMMA), ,$(EMBEDDED_IMAGE)) |
---|
509 | EMBED_ALL := $(foreach i,$(call seq,1,$(words $(EMBEDDED_FILES))),\ |
---|
510 | EMBED ( $(i), \"$(word $(i), $(EMBEDDED_FILES))\",\ |
---|
511 | \"$(notdir $(word $(i),$(EMBEDDED_FILES)))\" )) |
---|
512 | |
---|
513 | $(BIN)/embedded.o : $(EMBEDDED_FILES) $(EMBEDDED_LIST) |
---|
514 | CFLAGS_embedded = -DEMBED_ALL="$(EMBED_ALL)" |
---|
515 | |
---|
516 | # Generate the NIC file from the parsed source files. The NIC file is |
---|
517 | # only for rom-o-matic. |
---|
518 | # |
---|
519 | $(BIN)/NIC : $(AUTO_DEPS) |
---|
520 | @$(ECHO) '# This is an automatically generated file, do not edit' > $@ |
---|
521 | @$(ECHO) '# It does not affect anything in the build, ' \ |
---|
522 | 'it is only for rom-o-matic' >> $@ |
---|
523 | @$(ECHO) >> $@ |
---|
524 | @perl -ne 'chomp; print "$$1\n" if /\# NIC\t(.*)$$/' $^ >> $@ |
---|
525 | CLEANUP += $(BIN)/NIC # Doesn't match the $(BIN)/*.* pattern |
---|
526 | |
---|
527 | # Analyse a target name (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and |
---|
528 | # derive the variables: |
---|
529 | # |
---|
530 | # TGT_ELEMENTS : the elements of the target (e.g. "dfe538 prism2_pci") |
---|
531 | # TGT_PREFIX : the prefix type (e.g. "zrom") |
---|
532 | # TGT_DRIVERS : the driver for each element (e.g. "rtl8139 prism2_pci") |
---|
533 | # TGT_ROM_NAME : the ROM name (e.g. "dfe538") |
---|
534 | # TGT_MEDIA : the media type (e.g. "rom") |
---|
535 | # |
---|
536 | DRIVERS_gpxe = $(DRIVERS) |
---|
537 | CARD_DRIVER = $(firstword $(DRIVER_$(1)) $(1)) |
---|
538 | TGT_ELEMENTS = $(subst --, ,$(firstword $(subst ., ,$(notdir $@)))) |
---|
539 | TGT_PREFIX = $(word 2,$(subst ., ,$(notdir $@))) |
---|
540 | TGT_ROM_NAME = $(firstword $(TGT_ELEMENTS)) |
---|
541 | TGT_DRIVERS = $(strip $(if $(DRIVERS_$(TGT_ROM_NAME)), \ |
---|
542 | $(DRIVERS_$(TGT_ROM_NAME)), \ |
---|
543 | $(foreach TGT_ELEMENT,$(TGT_ELEMENTS), \ |
---|
544 | $(call CARD_DRIVER,$(TGT_ELEMENT))) )) |
---|
545 | TGT_MEDIA = $(subst z,,$(TGT_PREFIX)) |
---|
546 | |
---|
547 | # Look up ROM IDs for the current target |
---|
548 | # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables: |
---|
549 | # |
---|
550 | # TGT_PCI_VENDOR : the PCI vendor ID (e.g. "0x1186") |
---|
551 | # TGT_PCI_DEVICE : the PCI device ID (e.g. "0x1300") |
---|
552 | # |
---|
553 | TGT_PCI_VENDOR = $(PCI_VENDOR_$(TGT_ROM_NAME)) |
---|
554 | TGT_PCI_DEVICE = $(PCI_DEVICE_$(TGT_ROM_NAME)) |
---|
555 | |
---|
556 | # Calculate link-time options for the current target |
---|
557 | # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables: |
---|
558 | # |
---|
559 | # TGT_LD_DRIVERS : symbols to require in order to drag in the relevant drivers |
---|
560 | # (e.g. "obj_rtl8139 obj_prism2_pci") |
---|
561 | # TGT_LD_IDS : symbols to define in order to fill in ID structures in the |
---|
562 | # ROM header (e.g."pci_vendor_id=0x1186 pci_device_id=0x1300") |
---|
563 | # |
---|
564 | TGT_LD_DRIVERS = $(subst -,_,$(patsubst %,obj_%,$(TGT_DRIVERS))) |
---|
565 | TGT_LD_PREFIX = obj_$(TGT_PREFIX)prefix |
---|
566 | TGT_LD_IDS = pci_vendor_id=$(firstword $(TGT_PCI_VENDOR) 0) \ |
---|
567 | pci_device_id=$(firstword $(TGT_PCI_DEVICE) 0) |
---|
568 | |
---|
569 | # Calculate linker flags based on link-time options for the current |
---|
570 | # target type (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the |
---|
571 | # variables: |
---|
572 | # |
---|
573 | # TGT_LD_FLAGS : target-specific flags to pass to linker (e.g. |
---|
574 | # "-u obj_zpciprefix -u obj_rtl8139 -u obj_prism2_pci |
---|
575 | # --defsym pci_vendor=0x1186 --defsym pci_device=0x1300") |
---|
576 | # |
---|
577 | TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_PREFIX) $(TGT_LD_DRIVERS) obj_config,\ |
---|
578 | -u $(SYM) --defsym check_$(SYM)=$(SYM) ) \ |
---|
579 | $(patsubst %,--defsym %,$(TGT_LD_IDS)) |
---|
580 | |
---|
581 | # Calculate makerom flags for the specific target |
---|
582 | # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables: |
---|
583 | # |
---|
584 | # TGT_MAKEROM_FLAGS : target-specific flags for makerom (e.g. |
---|
585 | # "-p 0x1186,0x1300") |
---|
586 | # |
---|
587 | TGT_MAKEROM_FLAGS = $(strip $(MAKEROM_FLAGS_$(TGT_ROM_NAME)) \ |
---|
588 | $(if $(TGT_PCI_VENDOR),$(strip -p $(TGT_PCI_VENDOR),$(TGT_PCI_DEVICE)))) |
---|
589 | |
---|
590 | # Calculate list of debugging versions of objects to be included in |
---|
591 | # the target. |
---|
592 | # |
---|
593 | DEBUG_LIST = $(subst $(COMMA), ,$(DEBUG)) |
---|
594 | DEBUG_OBJ_LEVEL = $(firstword $(word 2,$(subst :, ,$(1))) 1) |
---|
595 | DEBUG_OBJ_BASE = $(word 1,$(subst :, ,$(1))).dbg$(call DEBUG_OBJ_LEVEL,$(1)) |
---|
596 | DEBUG_OBJ = $(BIN)/$(call DEBUG_OBJ_BASE,$(1)).o |
---|
597 | DEBUG_ORIG_OBJ = $(BIN)/$(word 1,$(subst :, ,$(1))).o |
---|
598 | DEBUG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_OBJ,$(D))) |
---|
599 | DEBUG_ORIG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_ORIG_OBJ,$(D))) |
---|
600 | BLIB_OBJS = $(DEBUG_OBJS) $(filter-out $(DEBUG_ORIG_OBJS),$(BOBJS)) |
---|
601 | |
---|
602 | # Print out all derived information for a given target. |
---|
603 | # |
---|
604 | $(BIN)/%.info : |
---|
605 | @$(ECHO) 'Elements : $(TGT_ELEMENTS)' |
---|
606 | @$(ECHO) 'Prefix : $(TGT_PREFIX)' |
---|
607 | @$(ECHO) 'Drivers : $(TGT_DRIVERS)' |
---|
608 | @$(ECHO) 'ROM name : $(TGT_ROM_NAME)' |
---|
609 | @$(ECHO) 'Media : $(TGT_MEDIA)' |
---|
610 | @$(ECHO) |
---|
611 | @$(ECHO) 'PCI vendor : $(TGT_PCI_VENDOR)' |
---|
612 | @$(ECHO) 'PCI device : $(TGT_PCI_DEVICE)' |
---|
613 | @$(ECHO) |
---|
614 | @$(ECHO) 'LD driver symbols : $(TGT_LD_DRIVERS)' |
---|
615 | @$(ECHO) 'LD prefix symbols : $(TGT_LD_PREFIX)' |
---|
616 | @$(ECHO) 'LD ID symbols : $(TGT_LD_IDS)' |
---|
617 | @$(ECHO) |
---|
618 | @$(ECHO) 'LD target flags : $(TGT_LD_FLAGS)' |
---|
619 | @$(ECHO) |
---|
620 | @$(ECHO) 'makerom target flags : $(TGT_MAKEROM_FLAGS)' |
---|
621 | @$(ECHO) |
---|
622 | @$(ECHO) 'Debugging objects : $(DEBUG_OBJS)' |
---|
623 | @$(ECHO) 'Replaced objects : $(DEBUG_ORIG_OBJS)' |
---|
624 | |
---|
625 | # List of objects included in the last build of blib. This is needed |
---|
626 | # in order to correctly rebuild blib whenever the list of objects |
---|
627 | # changes. |
---|
628 | # |
---|
629 | BLIB_LIST := $(BIN)/.blib.list |
---|
630 | ifeq ($(wildcard $(BLIB_LIST)),) |
---|
631 | BLIB_LIST_OBJS := <invalid> |
---|
632 | else |
---|
633 | BLIB_LIST_OBJS := $(shell cat $(BLIB_LIST)) |
---|
634 | endif |
---|
635 | ifneq ($(BLIB_LIST_OBJS),$(BLIB_OBJS)) |
---|
636 | $(shell $(ECHO) "$(BLIB_OBJS)" > $(BLIB_LIST)) |
---|
637 | endif |
---|
638 | |
---|
639 | $(BLIB_LIST) : |
---|
640 | |
---|
641 | VERYCLEANUP += $(BLIB_LIST) |
---|
642 | |
---|
643 | # Library of all objects |
---|
644 | # |
---|
645 | BLIB = $(BIN)/blib.a |
---|
646 | $(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS) |
---|
647 | $(Q)$(RM) $(BLIB) |
---|
648 | $(QM)$(ECHO) " [AR] $@" |
---|
649 | $(Q)$(AR) r $@ $(BLIB_OBJS) |
---|
650 | $(Q)$(RANLIB) $@ |
---|
651 | blib : $(BLIB) |
---|
652 | |
---|
653 | # Build an intermediate object file from the objects required for the |
---|
654 | # specified target. |
---|
655 | # |
---|
656 | $(BIN)/%.tmp : $(BLIB) $(MAKEDEPS) $(LDSCRIPT) |
---|
657 | $(QM)$(ECHO) " [LD] $@" |
---|
658 | $(Q)$(LD) $(LDFLAGS) -T $(LDSCRIPT) $(TGT_LD_FLAGS) $(BLIB) -o $@ \ |
---|
659 | -Map $(BIN)/$*.tmp.map |
---|
660 | $(Q)$(OBJDUMP) -ht $@ | $(SORTOBJDUMP) >> $(BIN)/$*.tmp.map |
---|
661 | |
---|
662 | # Keep intermediate object file (useful for debugging) |
---|
663 | .PRECIOUS : $(BIN)/%.tmp |
---|
664 | |
---|
665 | # Show a linker map for the specified target |
---|
666 | # |
---|
667 | $(BIN)/%.map : $(BIN)/%.tmp |
---|
668 | @less $(BIN)/$*.tmp.map |
---|
669 | |
---|
670 | # Get objects list for the specified target |
---|
671 | # |
---|
672 | define objs_list |
---|
673 | $(sort $(foreach OBJ_SYMBOL,\ |
---|
674 | $(filter obj_%,$(shell $(NM) $(1) | cut -d" " -f3)),\ |
---|
675 | $(patsubst obj_%,%,$(OBJ_SYMBOL)))) |
---|
676 | endef |
---|
677 | $(BIN)/%.objs : $(BIN)/%.tmp |
---|
678 | $(Q)$(ECHO) $(call objs_list,$<) |
---|
679 | $(BIN)/%.sizes : $(BIN)/%.tmp |
---|
680 | $(Q)$(SIZE) -t $(foreach OBJ,$(call objs_list,$<),$(wildcard $(BIN)/$(subst _,?,$(OBJ)).o)) | \ |
---|
681 | sort -g |
---|
682 | |
---|
683 | # Get dependency list for the specified target |
---|
684 | # |
---|
685 | define deps_list |
---|
686 | $(sort $(foreach OBJ,$(call objs_list,$(1)),$($(OBJ)_DEPS))) |
---|
687 | endef |
---|
688 | $(BIN)/%.deps : $(BIN)/%.tmp |
---|
689 | $(Q)$(ECHO) $(call deps_list,$<) |
---|
690 | |
---|
691 | # Get unneeded source files for the specified target |
---|
692 | # |
---|
693 | define nodeps_list |
---|
694 | $(sort $(filter-out $(call deps_list,$(1)),\ |
---|
695 | $(foreach BOBJ,$(BOBJS),\ |
---|
696 | $($(basename $(notdir $(BOBJ)))_DEPS)))) |
---|
697 | endef |
---|
698 | $(BIN)/%.nodeps : $(BIN)/%.tmp |
---|
699 | $(Q)$(ECHO) $(call nodeps_list,$<) |
---|
700 | |
---|
701 | # Get licensing verdict for the specified target |
---|
702 | # |
---|
703 | define unlicensed_deps_list |
---|
704 | $(shell grep -L FILE_LICENCE $(call deps_list,$(1))) |
---|
705 | endef |
---|
706 | define licence_list |
---|
707 | $(patsubst __licence_%,%,\ |
---|
708 | $(filter __licence_%,$(shell $(NM) $(1) | cut -d" " -f3))) |
---|
709 | endef |
---|
710 | $(BIN)/%.licence : $(BIN)/%.tmp |
---|
711 | $(QM)$(ECHO) " [LICENCE] $@" |
---|
712 | $(Q)$(if $(strip $(call unlicensed_deps_list,$<)),\ |
---|
713 | echo -n "Unable to determine licence because the following " ;\ |
---|
714 | echo "files are missing a licence declaration:" ;\ |
---|
715 | echo $(call unlicensed_deps_list,$<);\ |
---|
716 | exit 1,\ |
---|
717 | $(LICENCE) $(call licence_list,$<)) |
---|
718 | |
---|
719 | # Extract compression information from intermediate object file |
---|
720 | # |
---|
721 | $(BIN)/%.zinfo : $(BIN)/%.tmp |
---|
722 | $(QM)$(ECHO) " [ZINFO] $@" |
---|
723 | $(Q)$(OBJCOPY) -O binary -j .zinfo $< $@ |
---|
724 | |
---|
725 | # Build raw binary file from intermediate object file |
---|
726 | # |
---|
727 | $(BIN)/%.bin : $(BIN)/%.tmp |
---|
728 | $(QM)$(ECHO) " [BIN] $@" |
---|
729 | $(Q)$(OBJCOPY) -O binary -R .zinfo $< $@ |
---|
730 | |
---|
731 | # Compress raw binary file |
---|
732 | # |
---|
733 | $(BIN)/%.zbin : $(BIN)/%.bin $(BIN)/%.zinfo $(ZBIN) |
---|
734 | $(QM)$(ECHO) " [ZBIN] $@" |
---|
735 | $(Q)$(ZBIN) $(BIN)/$*.bin $(BIN)/$*.zinfo > $@ |
---|
736 | |
---|
737 | # Rules for each media format. These are generated and placed in an |
---|
738 | # external Makefile fragment. We could do this via $(eval ...), but |
---|
739 | # that would require make >= 3.80. |
---|
740 | # |
---|
741 | # Note that there's an alternative way to generate most .rom images: |
---|
742 | # they can be copied from their 'master' ROM image using cp and |
---|
743 | # reprocessed with makerom to add the PCI IDs and ident string. The |
---|
744 | # relevant rule would look something like: |
---|
745 | # |
---|
746 | # $(BIN)/dfe538%rom : $(BIN)/rtl8139%rom |
---|
747 | # cat $< $@ |
---|
748 | # $(FINALISE_rom) |
---|
749 | # |
---|
750 | # You can derive the ROM/driver relationships using the variables |
---|
751 | # DRIVER_<rom> and/or ROMS_<driver>. |
---|
752 | # |
---|
753 | # We don't currently do this, because (a) it would require generating |
---|
754 | # yet more Makefile fragments (since you need a rule for each ROM in |
---|
755 | # ROMS), and (b) the linker is so fast that it probably wouldn't make |
---|
756 | # much difference to the overall build time. |
---|
757 | |
---|
758 | media : |
---|
759 | @$(ECHO) $(MEDIA) |
---|
760 | |
---|
761 | AUTO_MEDIA = $(filter-out $(NON_AUTO_MEDIA),$(MEDIA)) |
---|
762 | automedia : |
---|
763 | @$(ECHO) $(AUTO_MEDIA) |
---|
764 | |
---|
765 | # media_template : create Makefile rules for specified media |
---|
766 | # |
---|
767 | # $(1) is the media name (e.g. "rom") |
---|
768 | # $(2) is the full path to the .d file (e.g. "bin/deps/rom.media.d") |
---|
769 | # |
---|
770 | define media_template |
---|
771 | |
---|
772 | @$(ECHO) " [MEDIADEPS] $(1)" |
---|
773 | @$(MKDIR) -p $(dir $(2)) |
---|
774 | @$(RM) $(2) |
---|
775 | @$(TOUCH) $(2) |
---|
776 | @$(ECHO_E) '$$(BIN)/%.$(1) : $$(BIN)/%.$(1).zbin' \ |
---|
777 | '\n\t$$(QM)$(ECHO) " [FINISH] $$@"' \ |
---|
778 | '\n\t$$(Q)$$(CP) $$< $$@' \ |
---|
779 | '\n\t$$(Q)$$(PAD_$(1))' \ |
---|
780 | '\n\t$$(Q)$$(FINALISE_$(1))' \ |
---|
781 | > $(2) |
---|
782 | |
---|
783 | endef |
---|
784 | |
---|
785 | # Rule to generate the Makefile rules to be included |
---|
786 | # |
---|
787 | $(BIN)/deps/%.media.d : $(MAKEDEPS) |
---|
788 | $(if $(filter $(AUTO_MEDIA),$*), \ |
---|
789 | $(call media_template,$*,$@), \ |
---|
790 | @$(ECHO) 'ERROR: $* is not an AUTO_MEDIA' ; exit 1) |
---|
791 | |
---|
792 | # Calculate and include the list of Makefile rules files |
---|
793 | # |
---|
794 | MEDIA_DEPS = $(patsubst %,$(BIN)/deps/%.media.d,$(AUTO_MEDIA)) |
---|
795 | mediadeps : |
---|
796 | @$(ECHO) $(MEDIA_DEPS) |
---|
797 | ifdef NEED_DEPS |
---|
798 | ifneq ($(MEDIA_DEPS),) |
---|
799 | -include $(MEDIA_DEPS) |
---|
800 | endif |
---|
801 | endif |
---|
802 | |
---|
803 | # Wrap up binary blobs (for embedded images) |
---|
804 | # |
---|
805 | $(BIN)/%.o : payload/%.img |
---|
806 | $(QM)echo " [WRAP] $@" |
---|
807 | $(Q)$(LD) -b binary -r -o $@ $< --undefined obj_payload \ |
---|
808 | --defsym obj_$*=0 |
---|
809 | |
---|
810 | BOBJS += $(patsubst payload/%.img,$(BIN)/%.o,$(wildcard payload/*.img)) |
---|
811 | |
---|
812 | # The "allXXXs" targets for each suffix |
---|
813 | # |
---|
814 | allall: allroms allzroms allpxes allisos alldsks |
---|
815 | allroms allzroms : all%s : $(foreach ROM,$(ROMS),$(BIN)/$(ROM).%) |
---|
816 | allpxes allisos alldsks : all%s : $(foreach DRIVER,$(DRIVERS),$(BIN)/$(DRIVER).%) |
---|
817 | |
---|
818 | # Alias for gpxe.% |
---|
819 | # |
---|
820 | $(BIN)/etherboot.% : $(BIN)/gpxe.% |
---|
821 | ln -sf $(notdir $<) $@ |
---|
822 | |
---|
823 | endif # defined(BIN) |
---|
824 | |
---|
825 | ############################################################################### |
---|
826 | # |
---|
827 | # Rules for finalising files. TGT_MAKEROM_FLAGS is defined as part of |
---|
828 | # the automatic build system and varies by target; it includes the |
---|
829 | # "-p 0x1234,0x5678" string to set the PCI IDs. |
---|
830 | # |
---|
831 | FINALISE_rom = $(MAKEROM) $(MAKEROM_FLAGS) $(TGT_MAKEROM_FLAGS) \ |
---|
832 | -i$(IDENT) -s 0 $@ |
---|
833 | FINALISE_hrom = $(FINALISE_rom) |
---|
834 | FINALISE_xrom = $(MAKEROM) $(MAKEROM_FLAGS) $(TGT_MAKEROM_FLAGS) \ |
---|
835 | -i$(IDENT) -n -s 0 $@ |
---|
836 | |
---|
837 | # Some ROMs require specific flags to be passed to makerom.pl |
---|
838 | # |
---|
839 | MAKEROM_FLAGS_3c503 = -3 |
---|
840 | |
---|
841 | ############################################################################### |
---|
842 | # |
---|
843 | # The compression utilities |
---|
844 | # |
---|
845 | $(NRV2B) : util/nrv2b.c $(MAKEDEPS) |
---|
846 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
847 | $(Q)$(HOST_CC) -O2 -DENCODE -DDECODE -DMAIN -DVERBOSE -DNDEBUG \ |
---|
848 | -DBITSIZE=32 -DENDIAN=0 -o $@ $< |
---|
849 | CLEANUP += $(NRV2B) |
---|
850 | |
---|
851 | $(ZBIN) : util/zbin.c util/nrv2b.c $(MAKEDEPS) |
---|
852 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
853 | $(Q)$(HOST_CC) -O2 -o $@ $< |
---|
854 | CLEANUP += $(ZBIN) |
---|
855 | |
---|
856 | ############################################################################### |
---|
857 | # |
---|
858 | # The EFI image converter |
---|
859 | # |
---|
860 | ELF2EFI_CFLAGS := -I$(BINUTILS_DIR)/include -I$(BFD_DIR)/include \ |
---|
861 | -idirafter include -L$(BINUTILS_DIR)/lib -L$(BFD_DIR)/lib \ |
---|
862 | -lbfd -liberty -lz |
---|
863 | |
---|
864 | $(ELF2EFI32) : util/elf2efi.c $(MAKEDEPS) |
---|
865 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
866 | $(Q)$(HOST_CC) $(ELF2EFI_CFLAGS) -DMDE_CPU_IA32 -O2 -o $@ $< |
---|
867 | CLEANUP += $(ELF2EFI32) |
---|
868 | |
---|
869 | $(ELF2EFI64) : util/elf2efi.c $(MAKEDEPS) |
---|
870 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
871 | $(Q)$(HOST_CC) $(ELF2EFI_CFLAGS) -DMDE_CPU_X64 -O2 -o $@ $< |
---|
872 | CLEANUP += $(ELF2EFI64) |
---|
873 | |
---|
874 | $(EFIROM) : util/efirom.c $(MAKEDEPS) |
---|
875 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
876 | $(Q)$(HOST_CC) -idirafter include -O2 -o $@ $< |
---|
877 | CLEANUP += $(EFIROM) |
---|
878 | |
---|
879 | ############################################################################### |
---|
880 | # |
---|
881 | # The ICC fixup utility |
---|
882 | # |
---|
883 | $(ICCFIX) : util/iccfix.c $(MAKEDEPS) |
---|
884 | $(QM)$(ECHO) " [HOSTCC] $@" |
---|
885 | $(Q)$(HOST_CC) -idirafter include -O2 -o $@ $< |
---|
886 | CLEANUP += $(ICCFIX) |
---|
887 | |
---|
888 | ############################################################################### |
---|
889 | # |
---|
890 | # Auto-incrementing build serial number. Append "bs" to your list of |
---|
891 | # build targets to get a serial number printed at the end of the |
---|
892 | # build. Enable -DBUILD_SERIAL in order to see it when the code runs. |
---|
893 | # |
---|
894 | BUILDSERIAL_H = config/.buildserial.h |
---|
895 | BUILDSERIAL_NOW = config/.buildserial.now |
---|
896 | BUILDSERIAL_NEXT = config/.buildserial.next |
---|
897 | |
---|
898 | $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) : |
---|
899 | $(ECHO) 1 > $@ |
---|
900 | |
---|
901 | $(BUILDSERIAL_H) : $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) |
---|
902 | $(ECHO) '#define BUILD_SERIAL_NUM $(shell cat $<)' > $@ |
---|
903 | |
---|
904 | ifeq ($(filter bs,$(MAKECMDGOALS)),bs) |
---|
905 | $(shell diff -q $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) > /dev/null || \ |
---|
906 | cp -f $(BUILDSERIAL_NEXT) $(BUILDSERIAL_NOW)) |
---|
907 | endif |
---|
908 | |
---|
909 | bs : $(BUILDSERIAL_NOW) |
---|
910 | @$(ECHO) $$(( $(shell cat $<) + 1 )) > $(BUILDSERIAL_NEXT) |
---|
911 | @$(ECHO) "Build serial number is $(shell cat $<)" |
---|
912 | |
---|
913 | ############################################################################### |
---|
914 | # |
---|
915 | # Build the TAGS file(s) for emacs |
---|
916 | # |
---|
917 | TAGS : |
---|
918 | ctags -e -R -f $@ --exclude=bin |
---|
919 | |
---|
920 | CLEANUP += TAGS |
---|
921 | |
---|
922 | ############################################################################### |
---|
923 | # |
---|
924 | # Force rebuild for any given target |
---|
925 | # |
---|
926 | %.rebuild : |
---|
927 | rm -f $* |
---|
928 | $(Q)$(MAKE) $* |
---|
929 | |
---|
930 | ############################################################################### |
---|
931 | # |
---|
932 | # Symbol table checks |
---|
933 | # |
---|
934 | |
---|
935 | ifdef BIN |
---|
936 | |
---|
937 | SYMTAB = $(BIN)/symtab |
---|
938 | $(SYMTAB) : $(BLIB) |
---|
939 | $(OBJDUMP) -w -t $< > $@ |
---|
940 | |
---|
941 | CLEANUP += $(BIN)/symtab |
---|
942 | |
---|
943 | symcheck : $(SYMTAB) |
---|
944 | $(SYMCHECK) $< |
---|
945 | |
---|
946 | endif # defined(BIN) |
---|
947 | |
---|
948 | ############################################################################### |
---|
949 | # |
---|
950 | # Build bochs symbol table |
---|
951 | # |
---|
952 | |
---|
953 | ifdef BIN |
---|
954 | |
---|
955 | $(BIN)/%.bxs : $(BIN)/%.tmp |
---|
956 | $(NM) $< | cut -d" " -f1,3 > $@ |
---|
957 | |
---|
958 | endif # defined(BIN) |
---|
959 | |
---|
960 | ############################################################################### |
---|
961 | # |
---|
962 | # Documentation |
---|
963 | # |
---|
964 | |
---|
965 | ifdef BIN |
---|
966 | |
---|
967 | $(BIN)/doxygen.cfg : doxygen.cfg $(MAKEDEPS) |
---|
968 | $(Q)$(PERL) -pe 's{\@SRCDIRS\@}{$(SRCDIRS)}; ' \ |
---|
969 | -e 's{\@INCDIRS\@}{$(filter-out .,$(INCDIRS))}; ' \ |
---|
970 | -e 's{\@BIN\@}{$(BIN)}; ' \ |
---|
971 | -e 's{\@ARCH\@}{$(ARCH)}; ' \ |
---|
972 | $< > $@ |
---|
973 | |
---|
974 | $(BIN)/doc : $(BIN)/doxygen.cfg |
---|
975 | $(Q)$(DOXYGEN) $< |
---|
976 | |
---|
977 | .PHONY : $(BIN)/doc |
---|
978 | |
---|
979 | doc : $(BIN)/doc |
---|
980 | |
---|
981 | doc-clean : |
---|
982 | $(Q)$(RM) -r $(BIN)/doc |
---|
983 | |
---|
984 | VERYCLEANUP += $(BIN)/doc |
---|
985 | |
---|
986 | docview : |
---|
987 | @[ -f $(BIN)/doc/html/index.html ] || $(MAKE) $(BIN)/doc |
---|
988 | @if [ -n "$$BROWSER" ] ; then \ |
---|
989 | ( $$BROWSER $(BIN)/doc/html/index.html & ) ; \ |
---|
990 | else \ |
---|
991 | $(ECHO) "Documentation index in $(BIN)/doc/html/index.html" ; \ |
---|
992 | fi |
---|
993 | |
---|
994 | endif # defined(BIN) |
---|
995 | |
---|
996 | ############################################################################### |
---|
997 | # |
---|
998 | # Clean-up |
---|
999 | # |
---|
1000 | clean : |
---|
1001 | $(RM) $(CLEANUP) |
---|
1002 | |
---|
1003 | veryclean : clean |
---|
1004 | $(RM) -r $(VERYCLEANUP) |
---|