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) 1005