[e16e8f2] | 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) |
---|