|
|
1.1 ! root 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: ! 92: ifeq ($(CCTYPE),gcc) ! 93: GCC_2_96_BANNER := $(shell $(CC) -v 2>&1 | grep -is 'gcc version 2\.96') ! 94: ifneq ($(GCC_2_96_BANNER),) ! 95: $(warning gcc 2.96 is unsuitable for compiling iPXE) ! 96: $(warning Use gcc 2.95 or a newer version instead) ! 97: $(error Unsuitable build environment found) ! 98: endif ! 99: endif ! 100: ! 101: PERL_UNICODE_CHECK := $(shell $(PERL) -e 'use bytes; print chr(255)' | wc -c) ! 102: ifeq ($(PERL_UNICODE_CHECK),2) ! 103: $(warning Your Perl version has a Unicode handling bug) ! 104: $(warning Execute this command before building iPXE:) ! 105: $(warning export LANG=$${LANG%.UTF-8}) ! 106: $(error Unsuitable build environment found) ! 107: endif ! 108: ! 109: LD_GOLD_BANNER := $(shell $(LD) -v 2>&1 | grep 'GNU gold') ! 110: ifneq ($(LD_GOLD_BANNER),) ! 111: $(warning GNU gold is unsuitable for building iPXE) ! 112: $(warning Use GNU ld instead) ! 113: $(error Unsuitable build environment found) ! 114: endif ! 115: ! 116: ############################################################################### ! 117: # ! 118: # Check for various tool workarounds ! 119: # ! 120: ! 121: WORKAROUND_CFLAGS := ! 122: WORKAROUND_ASFLAGS := ! 123: WORKAROUND_LDFLAGS := ! 124: ! 125: # Make syntax does not allow use of comma or space in certain places. ! 126: # This ugly workaround is suggested in the manual. ! 127: # ! 128: COMMA := , ! 129: EMPTY := ! 130: SPACE := $(EMPTY) $(EMPTY) ! 131: ! 132: # Check for an old version of gas (binutils 2.9.1) ! 133: # ! 134: OLDGAS := $(shell $(AS) --version | grep -q '2\.9\.1' && $(ECHO) -DGAS291) ! 135: WORKAROUND_CFLAGS += $(OLDGAS) ! 136: oldgas : ! 137: @$(ECHO) $(oldgas) ! 138: ! 139: # Some widespread patched versions of gcc include -fstack-protector by ! 140: # default, even when -ffreestanding is specified. We therefore need ! 141: # to disable -fstack-protector if the compiler supports it. ! 142: # ! 143: ifeq ($(CCTYPE),gcc) ! 144: SP_TEST = $(CC) -fno-stack-protector -x c -c /dev/null \ ! 145: -o /dev/null >/dev/null 2>&1 ! 146: SP_FLAGS := $(shell $(SP_TEST) && $(ECHO) '-fno-stack-protector') ! 147: WORKAROUND_CFLAGS += $(SP_FLAGS) ! 148: endif ! 149: ! 150: # Some widespread patched versions of gcc include -fPIE -Wl,-pie by ! 151: # default. Note that gcc will exit *successfully* if it fails to ! 152: # recognise an option that starts with "no", so we have to test for ! 153: # output on stderr instead of checking the exit status. ! 154: # ! 155: ifeq ($(CCTYPE),gcc) ! 156: PIE_TEST = [ -z "`$(CC) -fno-PIE -nopie -x c -c /dev/null -o /dev/null 2>&1`" ] ! 157: PIE_FLAGS := $(shell $(PIE_TEST) && $(ECHO) '-fno-PIE -nopie') ! 158: WORKAROUND_CFLAGS += $(PIE_FLAGS) ! 159: endif ! 160: ! 161: # gcc 4.4 generates .eh_frame sections by default, which distort the ! 162: # output of "size". Inhibit this. ! 163: # ! 164: ifeq ($(CCTYPE),gcc) ! 165: CFI_TEST = $(CC) -fno-dwarf2-cfi-asm -x c -c /dev/null \ ! 166: -o /dev/null >/dev/null 2>&1 ! 167: CFI_FLAGS := $(shell $(CFI_TEST) && $(ECHO) '-fno-dwarf2-cfi-asm') ! 168: WORKAROUND_CFLAGS += $(CFI_FLAGS) ! 169: endif ! 170: ! 171: # gcc 4.6 generates spurious warnings if -Waddress is in force. ! 172: # Inhibit this. ! 173: # ! 174: ifeq ($(CCTYPE),gcc) ! 175: WNA_TEST = $(CC) -Wno-address -x c -c /dev/null -o /dev/null >/dev/null 2>&1 ! 176: WNA_FLAGS := $(shell $(WNA_TEST) && $(ECHO) '-Wno-address') ! 177: WORKAROUND_CFLAGS += $(WNA_FLAGS) ! 178: endif ! 179: ! 180: # Some versions of gas choke on division operators, treating them as ! 181: # comment markers. Specifying --divide will work around this problem, ! 182: # but isn't available on older gas versions. ! 183: # ! 184: DIVIDE_TEST = $(AS) --divide /dev/null -o /dev/null 2>/dev/null ! 185: DIVIDE_FLAGS := $(shell $(DIVIDE_TEST) && $(ECHO) '--divide') ! 186: WORKAROUND_ASFLAGS += $(DIVIDE_FLAGS) ! 187: ! 188: ############################################################################### ! 189: # ! 190: # Build verbosity ! 191: # ! 192: ifeq ($(V),1) ! 193: Q := ! 194: QM := @\# ! 195: else ! 196: Q := @ ! 197: QM := @ ! 198: endif ! 199: ! 200: ############################################################################### ! 201: # ! 202: # Set BIN according to whatever was specified on the command line as ! 203: # the build target. ! 204: # ! 205: ! 206: # Determine how many different BIN directories are mentioned in the ! 207: # make goals. ! 208: # ! 209: BIN_GOALS := $(filter bin/% bin-%,$(MAKECMDGOALS)) ! 210: BIN_GOALS_BINS := $(sort $(foreach BG,$(BIN_GOALS),\ ! 211: $(firstword $(subst /, ,$(BG))))) ! 212: NUM_BINS := $(words $(BIN_GOALS_BINS)) ! 213: ! 214: ifeq ($(NUM_BINS),0) ! 215: ! 216: # No BIN directory was specified. Set BIN to "bin" as a sensible ! 217: # default. ! 218: ! 219: BIN := bin ! 220: ! 221: else # NUM_BINS == 0 ! 222: ! 223: ifeq ($(NUM_BINS),1) ! 224: ! 225: # If exactly one BIN directory was specified, set BIN to match this ! 226: # directory. ! 227: # ! 228: BIN := $(firstword $(BIN_GOALS_BINS)) ! 229: ! 230: else # NUM_BINS == 1 ! 231: ! 232: # More than one BIN directory was specified. We cannot handle the ! 233: # latter case within a single make invocation, so set up recursive ! 234: # targets for each BIN directory. Use exactly one target for each BIN ! 235: # directory since running multiple make invocations within the same ! 236: # BIN directory is likely to cause problems. ! 237: # ! 238: # Leave $(BIN) undefined. This has implications for any target that ! 239: # depends on $(BIN); such targets should be made conditional upon the ! 240: # existence of $(BIN). ! 241: # ! 242: BIN_GOALS_FIRST := $(foreach BGB,$(BIN_GOALS_BINS),\ ! 243: $(firstword $(filter $(BGB)/%,$(BIN_GOALS)))) ! 244: BIN_GOALS_OTHER := $(filter-out $(BIN_GOALS_FIRST),$(BIN_GOALS)) ! 245: ! 246: $(BIN_GOALS_FIRST) : % : BIN_RECURSE ! 247: $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) \ ! 248: $(filter $(firstword $(subst /, ,$@))/%, $(BIN_GOALS)) ! 249: $(BIN_GOALS_OTHER) : % : BIN_RECURSE ! 250: $(Q)$(TRUE) ! 251: .PHONY : BIN_RECURSE ! 252: ! 253: endif # NUM_BINS == 1 ! 254: endif # NUM_BINS == 0 ! 255: ! 256: ifdef BIN ! 257: ! 258: # Create $(BIN) directory if it doesn't exist yet ! 259: # ! 260: ifeq ($(wildcard $(BIN)),) ! 261: $(shell $(MKDIR) -p $(BIN)) ! 262: endif ! 263: ! 264: # Target to allow e.g. "make bin-efi arch" ! 265: # ! 266: $(BIN) : ! 267: @# Do nothing, silently ! 268: .PHONY : $(BIN) ! 269: ! 270: # Remove everything in $(BIN) for a "make clean" ! 271: # ! 272: CLEANUP += $(BIN)/*.* # Avoid picking up directories ! 273: ! 274: endif # defined(BIN) ! 275: ! 276: # Determine whether or not we need to include the dependency files ! 277: # ! 278: NO_DEP_TARGETS := $(BIN) clean veryclean ! 279: ifeq ($(MAKECMDGOALS),) ! 280: NEED_DEPS := 1 ! 281: endif ! 282: ifneq ($(strip $(filter-out $(NO_DEP_TARGETS),$(MAKECMDGOALS))),) ! 283: NEED_DEPS := 1 ! 284: endif ! 285: ! 286: ############################################################################### ! 287: # ! 288: # Select build architecture and platform based on $(BIN) ! 289: # ! 290: # BIN has the form bin[-[arch-]platform] ! 291: ! 292: ARCHS := $(patsubst arch/%,%,$(wildcard arch/*)) ! 293: PLATFORMS := $(patsubst config/defaults/%.h,%,\ ! 294: $(wildcard config/defaults/*.h)) ! 295: archs : ! 296: @$(ECHO) $(ARCHS) ! 297: ! 298: platforms : ! 299: @$(ECHO) $(PLATFORMS) ! 300: ! 301: ifdef BIN ! 302: ! 303: # Determine architecture portion of $(BIN), if present ! 304: BIN_ARCH := $(strip $(foreach A,$(ARCHS),\ ! 305: $(patsubst bin-$(A)-%,$(A),\ ! 306: $(filter bin-$(A)-%,$(BIN))))) ! 307: ! 308: # Determine platform portion of $(BIN), if present ! 309: ifeq ($(BIN_ARCH),) ! 310: BIN_PLATFORM := $(patsubst bin-%,%,$(filter bin-%,$(BIN))) ! 311: else ! 312: BIN_PLATFORM := $(patsubst bin-$(BIN_ARCH)-%,%,$(BIN)) ! 313: endif ! 314: ! 315: # Determine build architecture ! 316: DEFAULT_ARCH := i386 ! 317: ARCH := $(firstword $(BIN_ARCH) $(DEFAULT_ARCH)) ! 318: CFLAGS += -DARCH=$(ARCH) ! 319: arch : ! 320: @$(ECHO) $(ARCH) ! 321: .PHONY : arch ! 322: ! 323: # Determine build platform ! 324: DEFAULT_PLATFORM := pcbios ! 325: PLATFORM := $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM)) ! 326: CFLAGS += -DPLATFORM=$(PLATFORM) ! 327: platform : ! 328: @$(ECHO) $(PLATFORM) ! 329: ! 330: endif # defined(BIN) ! 331: ! 332: # Include architecture-specific Makefile ! 333: ifdef ARCH ! 334: MAKEDEPS += arch/$(ARCH)/Makefile ! 335: include arch/$(ARCH)/Makefile ! 336: endif ! 337: ! 338: # Include architecture-specific include path ! 339: ifdef ARCH ! 340: INCDIRS += arch/$(ARCH)/include ! 341: INCDIRS += arch/$(ARCH)/include/$(PLATFORM) ! 342: endif ! 343: ! 344: ############################################################################### ! 345: # ! 346: # Source file handling ! 347: ! 348: # SRCDIRS lists all directories containing source files. ! 349: srcdirs : ! 350: @$(ECHO) $(SRCDIRS) ! 351: ! 352: # SRCS lists all .c or .S files found in any SRCDIR ! 353: # ! 354: SRCS += $(wildcard $(patsubst %,%/*.c,$(SRCDIRS))) ! 355: SRCS += $(wildcard $(patsubst %,%/*.S,$(SRCDIRS))) ! 356: srcs : ! 357: @$(ECHO) $(SRCS) ! 358: ! 359: # AUTO_SRCS lists all files in SRCS that are not mentioned in ! 360: # NON_AUTO_SRCS. Files should be added to NON_AUTO_SRCS if they ! 361: # cannot be built using the standard build template. ! 362: # ! 363: AUTO_SRCS = $(filter-out $(NON_AUTO_SRCS),$(SRCS)) ! 364: autosrcs : ! 365: @$(ECHO) $(AUTO_SRCS) ! 366: ! 367: # Just about everything else in this section depends upon having ! 368: # $(BIN) set ! 369: ! 370: ifdef BIN ! 371: ! 372: # INCDIRS lists the include path ! 373: incdirs : ! 374: @$(ECHO) $(INCDIRS) ! 375: ! 376: # Common flags ! 377: # ! 378: CFLAGS += $(foreach INC,$(INCDIRS),-I$(INC)) ! 379: CFLAGS += -Os ! 380: CFLAGS += -g ! 381: ifeq ($(CCTYPE),gcc) ! 382: CFLAGS += -ffreestanding ! 383: CFLAGS += -Wall -W -Wformat-nonliteral ! 384: endif ! 385: ifeq ($(CCTYPE),icc) ! 386: CFLAGS += -fno-builtin ! 387: CFLAGS += -no-ip ! 388: CFLAGS += -no-gcc ! 389: CFLAGS += -diag-disable 111 # Unreachable code ! 390: CFLAGS += -diag-disable 128 # Unreachable loop ! 391: CFLAGS += -diag-disable 170 # Array boundary checks ! 392: CFLAGS += -diag-disable 177 # Unused functions ! 393: CFLAGS += -diag-disable 181 # printf() format checks ! 394: CFLAGS += -diag-disable 188 # enum strictness ! 395: CFLAGS += -diag-disable 193 # Undefined preprocessor identifiers ! 396: CFLAGS += -diag-disable 280 # switch ( constant ) ! 397: CFLAGS += -diag-disable 310 # K&R parameter lists ! 398: CFLAGS += -diag-disable 424 # Extra semicolon ! 399: CFLAGS += -diag-disable 589 # Declarations mid-code ! 400: CFLAGS += -diag-disable 593 # Unused variables ! 401: CFLAGS += -diag-disable 810 # Casting ints to smaller ints ! 402: CFLAGS += -diag-disable 981 # Sequence point violations ! 403: CFLAGS += -diag-disable 1292 # Ignored attributes ! 404: CFLAGS += -diag-disable 1338 # void pointer arithmetic ! 405: CFLAGS += -diag-disable 1361 # Variable-length arrays ! 406: CFLAGS += -diag-disable 1418 # Missing prototypes ! 407: CFLAGS += -diag-disable 1419 # Missing prototypes ! 408: CFLAGS += -diag-disable 1599 # Hidden variables ! 409: CFLAGS += -Wall -Wmissing-declarations ! 410: endif ! 411: CFLAGS += $(WORKAROUND_CFLAGS) $(EXTRA_CFLAGS) ! 412: ASFLAGS += $(WORKAROUND_ASFLAGS) $(EXTRA_ASFLAGS) ! 413: LDFLAGS += $(WORKAROUND_LDFLAGS) $(EXTRA_LDFLAGS) ! 414: ! 415: # Inhibit -Werror if NO_WERROR is specified on make command line ! 416: # ! 417: ifneq ($(NO_WERROR),1) ! 418: CFLAGS += -Werror ! 419: ASFLAGS += --fatal-warnings ! 420: endif ! 421: ! 422: # Function trace recorder state in the last build. This is needed ! 423: # in order to correctly rebuild whenever the function recorder is ! 424: # enabled/disabled. ! 425: # ! 426: FNREC_STATE := $(BIN)/.fnrec.state ! 427: ifeq ($(wildcard $(FNREC_STATE)),) ! 428: FNREC_OLD := <invalid> ! 429: else ! 430: FNREC_OLD := $(shell cat $(FNREC_STATE)) ! 431: endif ! 432: ifeq ($(FNREC_OLD),$(FNREC)) ! 433: $(FNREC_STATE) : ! 434: else ! 435: $(FNREC_STATE) : clean ! 436: $(shell $(ECHO) "$(FNREC)" > $(FNREC_STATE)) ! 437: endif ! 438: ! 439: VERYCLEANUP += $(FNREC_STATE) ! 440: MAKEDEPS += $(FNREC_STATE) ! 441: ! 442: ifeq ($(FNREC),1) ! 443: # Enabling -finstrument-functions affects gcc's analysis and leads to spurious ! 444: # warnings about use of uninitialised variables. ! 445: # ! 446: CFLAGS += -Wno-uninitialized ! 447: CFLAGS += -finstrument-functions ! 448: CFLAGS += -finstrument-functions-exclude-file-list=core/fnrec.c ! 449: endif ! 450: ! 451: # Enable per-item sections and section garbage collection. Note that ! 452: # some older versions of gcc support -fdata-sections but treat it as ! 453: # implying -fno-common, which would break our build. ! 454: # ! 455: ifeq ($(CCTYPE),gcc) ! 456: DS_TEST = $(ECHO) 'char x;' | \ ! 457: $(CC) -fdata-sections -S -x c - -o - 2>/dev/null | \ ! 458: grep -E '\.comm' > /dev/null ! 459: DS_FLAGS := $(shell $(DS_TEST) && $(ECHO) '-fdata-sections') ! 460: CFLAGS += -ffunction-sections $(DS_FLAGS) ! 461: endif ! 462: LDFLAGS += --gc-sections ! 463: ! 464: # compiler.h is needed for our linking and debugging system ! 465: # ! 466: CFLAGS += -include compiler.h ! 467: ! 468: # CFLAGS for specific object types ! 469: # ! 470: CFLAGS_c += ! 471: CFLAGS_S += -DASSEMBLY ! 472: ! 473: # Base object name of the current target ! 474: # ! 475: OBJECT = $(firstword $(subst ., ,$(@F))) ! 476: ! 477: # CFLAGS for specific object files. You can define ! 478: # e.g. CFLAGS_rtl8139, and have those flags automatically used when ! 479: # compiling bin/rtl8139.o. ! 480: # ! 481: OBJ_CFLAGS = $(CFLAGS_$(OBJECT)) -DOBJECT=$(subst -,_,$(OBJECT)) ! 482: $(BIN)/%.flags : ! 483: @$(ECHO) $(OBJ_CFLAGS) ! 484: ! 485: # ICC requires postprocessing objects to fix up table alignments ! 486: # ! 487: ifeq ($(CCTYPE),icc) ! 488: POST_O = && $(ICCFIX) $@ ! 489: POST_O_DEPS := $(ICCFIX) ! 490: else ! 491: POST_O := ! 492: POST_O_DEPS := ! 493: endif ! 494: ! 495: # Rules for specific object types. ! 496: # ! 497: COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS) ! 498: RULE_c = $(Q)$(COMPILE_c) -c $< -o $@ $(POST_O) ! 499: RULE_c_to_dbg%.o = $(Q)$(COMPILE_c) -Ddebug_$(subst -,_,$(OBJECT))=$* -c $< -o $@ $(POST_O) ! 500: RULE_c_to_c = $(Q)$(COMPILE_c) -E -c $< > $@ ! 501: RULE_c_to_s = $(Q)$(COMPILE_c) -S -g0 -c $< -o $@ ! 502: ! 503: PREPROCESS_S = $(CPP) $(CFLAGS) $(CFLAGS_S) $(OBJ_CFLAGS) ! 504: ASSEMBLE_S = $(AS) $(ASFLAGS) ! 505: RULE_S = $(Q)$(PREPROCESS_S) $< | $(ASSEMBLE_S) -o $@ ! 506: RULE_S_to_dbg%.o = $(Q)$(PREPROCESS_S) -Ddebug_$(subst -,_,$(OBJECT))=$* $< | $(ASSEMBLE_S) -o $@ ! 507: RULE_S_to_s = $(Q)$(PREPROCESS_S) $< > $@ ! 508: ! 509: DEBUG_TARGETS += dbg%.o c s ! 510: ! 511: # We automatically generate rules for any file mentioned in AUTO_SRCS ! 512: # using the following set of templates. It would be cleaner to use ! 513: # $(eval ...), but this function exists only in GNU make >= 3.80. ! 514: ! 515: # deps_template : generate dependency list for a given source file ! 516: # ! 517: # $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") ! 518: # $(2) is the source type (e.g. "c") ! 519: # $(3) is the source base name (e.g. "rtl8139") ! 520: # ! 521: define deps_template ! 522: @$(ECHO) " [DEPS] $(1)" ! 523: @$(MKDIR) -p $(BIN)/deps/$(dir $(1)) ! 524: @$(CPP) $(CFLAGS) $(CFLAGS_$(2)) $(CFLAGS_$(3)) -DOBJECT=$(3) \ ! 525: -Wno-error -M $(1) -MG -MP | \ ! 526: sed 's/\.o\s*:/_DEPS =/' > $(BIN)/deps/$(1).d ! 527: endef ! 528: ! 529: # rules_template : generate rules for a given source file ! 530: # ! 531: # $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") ! 532: # $(2) is the source type (e.g. "c") ! 533: # $(3) is the source base name (e.g. "rtl8139") ! 534: # ! 535: define rules_template ! 536: @$(ECHO) " [RULES] $(1)" ! 537: @$(MKDIR) -p $(BIN)/rules/$(dir $(1)) ! 538: @$(ECHO_E) '\n$$(BIN)/$(3).o :' \ ! 539: '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)' \ ! 540: '\n\t$$(QM)$(ECHO) " [BUILD] $$@"' \ ! 541: '\n\t$$(RULE_$(2))\n' \ ! 542: '\nBOBJS += $$(BIN)/$(3).o\n' \ ! 543: $(foreach TGT,$(DEBUG_TARGETS), \ ! 544: $(if $(RULE_$(2)_to_$(TGT)), \ ! 545: '\n$$(BIN)/$(3).$(TGT) :' \ ! 546: '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)' \ ! 547: '\n\t$$(QM)$(ECHO) " [BUILD] $$@"' \ ! 548: '\n\t$$(RULE_$(2)_to_$(TGT))\n' \ ! 549: '\n$(TGT)_OBJS += $$(BIN)/$(3).$(TGT)\n' ) ) \ ! 550: '\n$(BIN)/deps/$(1).d : $$($(3)_DEPS)\n' \ ! 551: '\nTAGS : $$($(3)_DEPS)\n' > $(BIN)/rules/$(1).r ! 552: @$(PERL) $(PARSEROM) $(1) >> $(BIN)/rules/$(1).r ! 553: endef ! 554: ! 555: # Rule to generate the dependency list file ! 556: # ! 557: $(BIN)/deps/%.d : % $(MAKEDEPS) ! 558: $(call deps_template,$<,$(subst .,,$(suffix $<)),$(basename $(notdir $<))) ! 559: ! 560: # Calculate and include the list of dependency list files ! 561: # ! 562: AUTO_DEPS = $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS)) ! 563: ifdef NEED_DEPS ! 564: ifneq ($(AUTO_DEPS),) ! 565: -include $(AUTO_DEPS) ! 566: endif ! 567: endif ! 568: autodeps : ! 569: @$(ECHO) $(AUTO_DEPS) ! 570: VERYCLEANUP += $(BIN)/deps ! 571: ! 572: # Rule to generate the rules file ! 573: # ! 574: $(BIN)/rules/%.r : % $(MAKEDEPS) $(PARSEROM) ! 575: $(call rules_template,$<,$(subst .,,$(suffix $<)),$(basename $(notdir $<))) ! 576: ! 577: # Calculate and include the list of rules files ! 578: # ! 579: AUTO_RULES = $(patsubst %,$(BIN)/rules/%.r,$(AUTO_SRCS)) ! 580: ifdef NEED_DEPS ! 581: ifneq ($(AUTO_RULES),) ! 582: -include $(AUTO_RULES) ! 583: endif ! 584: endif ! 585: autorules : ! 586: @$(ECHO) $(AUTO_RULES) ! 587: VERYCLEANUP += $(BIN)/rules ! 588: ! 589: # The following variables are created by the rules files ! 590: # ! 591: bobjs : ! 592: @$(ECHO) $(BOBJS) ! 593: drivers : ! 594: @$(ECHO) $(DRIVERS) ! 595: .PHONY : drivers ! 596: roms : ! 597: @$(ECHO) $(ROMS) ! 598: ! 599: # List of embedded images included in the last build of embedded.o. ! 600: # This is needed in order to correctly rebuild embedded.o whenever the ! 601: # list of objects changes. ! 602: # ! 603: EMBEDDED_LIST := $(BIN)/.embedded.list ! 604: ifeq ($(wildcard $(EMBEDDED_LIST)),) ! 605: EMBEDDED_IMAGE_OLD := <invalid> ! 606: else ! 607: EMBEDDED_IMAGE_OLD := $(shell cat $(EMBEDDED_LIST)) ! 608: endif ! 609: ifneq ($(EMBEDDED_IMAGE_OLD),$(EMBEDDED_IMAGE)) ! 610: $(shell $(ECHO) "$(EMBEDDED_IMAGE)" > $(EMBEDDED_LIST)) ! 611: endif ! 612: ! 613: $(EMBEDDED_LIST) : ! 614: ! 615: VERYCLEANUP += $(EMBEDDED_LIST) ! 616: ! 617: EMBEDDED_FILES := $(subst $(COMMA), ,$(EMBEDDED_IMAGE)) ! 618: EMBED_ALL := $(foreach i,$(call seq,1,$(words $(EMBEDDED_FILES))),\ ! 619: EMBED ( $(i), \"$(word $(i), $(EMBEDDED_FILES))\",\ ! 620: \"$(notdir $(word $(i),$(EMBEDDED_FILES)))\" )) ! 621: ! 622: $(BIN)/embedded.o : $(EMBEDDED_FILES) $(EMBEDDED_LIST) ! 623: ! 624: # This file uses .incbin inline assembly to include a binary file. ! 625: # Unfortunately ccache does not detect this dependency and caches builds even ! 626: # when the binary file has changed. ! 627: # ! 628: $(BIN)/embedded.o : override CC := env CCACHE_DISABLE=1 $(CC) ! 629: ! 630: CFLAGS_embedded = -DEMBED_ALL="$(EMBED_ALL)" ! 631: ! 632: # Generate error usage information ! 633: # ! 634: $(BIN)/%.einfo : $(BIN)/%.o ! 635: $(QM)$(ECHO) " [EINFO] $@" ! 636: $(Q)$(OBJCOPY) -O binary -j .einfo --set-section-flags .einfo=alloc \ ! 637: $< $@ ! 638: ! 639: EINFOS := $(patsubst $(BIN)/%.o,$(BIN)/%.einfo,$(BOBJS)) ! 640: $(BIN)/errors : $(EINFOS) $(EINFO) ! 641: $(QM)$(ECHO) " [EINFO] $@" ! 642: $(Q)$(EINFO) $(EINFOS) | sort > $@ ! 643: CLEANUP += $(BIN)/errors # Doesn't match the $(BIN)/*.* pattern ! 644: ! 645: # Generate the NIC file from the parsed source files. The NIC file is ! 646: # only for rom-o-matic. ! 647: # ! 648: $(BIN)/NIC : $(AUTO_DEPS) ! 649: @$(ECHO) '# This is an automatically generated file, do not edit' > $@ ! 650: @$(ECHO) '# It does not affect anything in the build, ' \ ! 651: 'it is only for rom-o-matic' >> $@ ! 652: @$(ECHO) >> $@ ! 653: @perl -ne 'chomp; print "$$1\n" if /\# NIC\t(.*)$$/' $^ >> $@ ! 654: CLEANUP += $(BIN)/NIC # Doesn't match the $(BIN)/*.* pattern ! 655: ! 656: # Analyse a target name (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and ! 657: # derive the variables: ! 658: # ! 659: # TGT_ELEMENTS : the elements of the target (e.g. "dfe538 prism2_pci") ! 660: # TGT_PREFIX : the prefix type (e.g. "zrom") ! 661: # TGT_DRIVERS : the driver for each element (e.g. "rtl8139 prism2_pci") ! 662: # TGT_ROM_NAME : the ROM name (e.g. "dfe538") ! 663: # TGT_MEDIA : the media type (e.g. "rom") ! 664: # ! 665: DRIVERS_ipxe = $(DRIVERS) ! 666: CARD_DRIVER = $(firstword $(DRIVER_$(1)) $(1)) ! 667: TGT_ELEMENTS = $(subst --, ,$(firstword $(subst ., ,$(notdir $@)))) ! 668: TGT_PREFIX = $(word 2,$(subst ., ,$(notdir $@))) ! 669: TGT_ROM_NAME = $(firstword $(TGT_ELEMENTS)) ! 670: TGT_DRIVERS = $(strip $(if $(DRIVERS_$(TGT_ROM_NAME)), \ ! 671: $(DRIVERS_$(TGT_ROM_NAME)), \ ! 672: $(foreach TGT_ELEMENT,$(TGT_ELEMENTS), \ ! 673: $(call CARD_DRIVER,$(TGT_ELEMENT))) )) ! 674: TGT_MEDIA = $(subst z,,$(TGT_PREFIX)) ! 675: ! 676: # Look up ROM IDs for the current target ! 677: # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables: ! 678: # ! 679: # TGT_PCI_VENDOR : the PCI vendor ID (e.g. "0x1186") ! 680: # TGT_PCI_DEVICE : the PCI device ID (e.g. "0x1300") ! 681: # ! 682: TGT_PCI_VENDOR = $(PCI_VENDOR_$(TGT_ROM_NAME)) ! 683: TGT_PCI_DEVICE = $(PCI_DEVICE_$(TGT_ROM_NAME)) ! 684: ! 685: # Calculate link-time options for the current target ! 686: # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables: ! 687: # ! 688: # TGT_LD_DRIVERS : symbols to require in order to drag in the relevant drivers ! 689: # (e.g. "obj_rtl8139 obj_prism2_pci") ! 690: # TGT_LD_IDS : symbols to define in order to fill in ID structures in the ! 691: # ROM header (e.g."pci_vendor_id=0x1186 pci_device_id=0x1300") ! 692: # ! 693: TGT_LD_DRIVERS = $(subst -,_,$(patsubst %,obj_%,$(TGT_DRIVERS))) ! 694: TGT_LD_IDS = pci_vendor_id=$(firstword $(TGT_PCI_VENDOR) 0) \ ! 695: pci_device_id=$(firstword $(TGT_PCI_DEVICE) 0) ! 696: TGT_LD_ENTRY = _$(TGT_PREFIX)_start ! 697: ! 698: # Calculate linker flags based on link-time options for the current ! 699: # target type (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the ! 700: # variables: ! 701: # ! 702: # TGT_LD_FLAGS : target-specific flags to pass to linker (e.g. ! 703: # "-u obj_zpciprefix -u obj_rtl8139 -u obj_prism2_pci ! 704: # --defsym pci_vendor=0x1186 --defsym pci_device=0x1300") ! 705: # ! 706: TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_ENTRY) $(TGT_LD_DRIVERS) obj_config,\ ! 707: -u $(SYM) --defsym check_$(SYM)=$(SYM) ) \ ! 708: $(patsubst %,--defsym %,$(TGT_LD_IDS)) \ ! 709: -e $(TGT_LD_ENTRY) ! 710: ! 711: # Calculate list of debugging versions of objects to be included in ! 712: # the target. ! 713: # ! 714: DEBUG_LIST = $(subst $(COMMA), ,$(DEBUG)) ! 715: DEBUG_OBJ_LEVEL = $(firstword $(word 2,$(subst :, ,$(1))) 1) ! 716: DEBUG_OBJ_BASE = $(word 1,$(subst :, ,$(1))).dbg$(call DEBUG_OBJ_LEVEL,$(1)) ! 717: DEBUG_OBJ = $(BIN)/$(call DEBUG_OBJ_BASE,$(1)).o ! 718: DEBUG_ORIG_OBJ = $(BIN)/$(word 1,$(subst :, ,$(1))).o ! 719: DEBUG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_OBJ,$(D))) ! 720: DEBUG_ORIG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_ORIG_OBJ,$(D))) ! 721: BLIB_OBJS = $(DEBUG_OBJS) $(filter-out $(DEBUG_ORIG_OBJS),$(BOBJS)) ! 722: ! 723: # Print out all derived information for a given target. ! 724: # ! 725: $(BIN)/%.info : ! 726: @$(ECHO) 'Elements : $(TGT_ELEMENTS)' ! 727: @$(ECHO) 'Prefix : $(TGT_PREFIX)' ! 728: @$(ECHO) 'Drivers : $(TGT_DRIVERS)' ! 729: @$(ECHO) 'ROM name : $(TGT_ROM_NAME)' ! 730: @$(ECHO) 'Media : $(TGT_MEDIA)' ! 731: @$(ECHO) ! 732: @$(ECHO) 'PCI vendor : $(TGT_PCI_VENDOR)' ! 733: @$(ECHO) 'PCI device : $(TGT_PCI_DEVICE)' ! 734: @$(ECHO) ! 735: @$(ECHO) 'LD driver symbols : $(TGT_LD_DRIVERS)' ! 736: @$(ECHO) 'LD ID symbols : $(TGT_LD_IDS)' ! 737: @$(ECHO) 'LD entry point : $(TGT_LD_ENTRY)' ! 738: @$(ECHO) ! 739: @$(ECHO) 'LD target flags : $(TGT_LD_FLAGS)' ! 740: @$(ECHO) ! 741: @$(ECHO) 'Debugging objects : $(DEBUG_OBJS)' ! 742: @$(ECHO) 'Replaced objects : $(DEBUG_ORIG_OBJS)' ! 743: ! 744: # List of objects included in the last build of blib. This is needed ! 745: # in order to correctly rebuild blib whenever the list of objects ! 746: # changes. ! 747: # ! 748: BLIB_LIST := $(BIN)/.blib.list ! 749: ifeq ($(wildcard $(BLIB_LIST)),) ! 750: BLIB_OBJS_OLD := <invalid> ! 751: else ! 752: BLIB_OBJS_OLD := $(shell cat $(BLIB_LIST)) ! 753: endif ! 754: ifneq ($(BLIB_OBJS_OLD),$(BLIB_OBJS)) ! 755: $(shell $(ECHO) "$(BLIB_OBJS)" > $(BLIB_LIST)) ! 756: endif ! 757: ! 758: $(BLIB_LIST) : ! 759: ! 760: VERYCLEANUP += $(BLIB_LIST) ! 761: ! 762: # Library of all objects ! 763: # ! 764: BLIB = $(BIN)/blib.a ! 765: $(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS) ! 766: $(Q)$(RM) $(BLIB) ! 767: $(QM)$(ECHO) " [AR] $@" ! 768: $(Q)$(AR) r $@ $(BLIB_OBJS) ! 769: $(Q)$(RANLIB) $@ ! 770: blib : $(BLIB) ! 771: ! 772: # Command to generate build ID. Must be unique for each $(BIN)/%.tmp, ! 773: # even within the same build run. ! 774: # ! 775: BUILD_ID_CMD := perl -e 'printf "0x%08x", int ( rand ( 0xffffffff ) );' ! 776: ! 777: # Build an intermediate object file from the objects required for the ! 778: # specified target. ! 779: # ! 780: $(BIN)/%.tmp : $(BLIB) $(MAKEDEPS) $(LDSCRIPT) ! 781: $(QM)$(ECHO) " [LD] $@" ! 782: $(Q)$(LD) $(LDFLAGS) -T $(LDSCRIPT) $(TGT_LD_FLAGS) $(BLIB) -o $@ \ ! 783: --defsym _build_id=`$(BUILD_ID_CMD)` -Map $(BIN)/$*.tmp.map ! 784: $(Q)$(OBJDUMP) -ht $@ | $(PERL) $(SORTOBJDUMP) >> $(BIN)/$*.tmp.map ! 785: ! 786: # Keep intermediate object file (useful for debugging) ! 787: .PRECIOUS : $(BIN)/%.tmp ! 788: ! 789: # Show a linker map for the specified target ! 790: # ! 791: $(BIN)/%.map : $(BIN)/%.tmp ! 792: @less $(BIN)/$*.tmp.map ! 793: ! 794: # Get objects list for the specified target ! 795: # ! 796: define objs_list ! 797: $(sort $(foreach OBJ_SYMBOL,\ ! 798: $(filter obj_%,$(shell $(NM) $(1) | cut -d" " -f3)),\ ! 799: $(patsubst obj_%,%,$(OBJ_SYMBOL)))) ! 800: endef ! 801: $(BIN)/%.objs : $(BIN)/%.tmp ! 802: $(Q)$(ECHO) $(call objs_list,$<) ! 803: $(BIN)/%.sizes : $(BIN)/%.tmp ! 804: $(Q)$(SIZE) -t $(foreach OBJ,$(call objs_list,$<),$(wildcard $(BIN)/$(subst _,?,$(OBJ)).o)) | \ ! 805: sort -g ! 806: ! 807: # Get dependency list for the specified target ! 808: # ! 809: define deps_list ! 810: $(sort $(foreach OBJ,$(call objs_list,$(1)),$($(OBJ)_DEPS))) ! 811: endef ! 812: $(BIN)/%.deps : $(BIN)/%.tmp ! 813: $(Q)$(ECHO) $(call deps_list,$<) ! 814: ! 815: # Get unneeded source files for the specified target ! 816: # ! 817: define nodeps_list ! 818: $(sort $(filter-out $(call deps_list,$(1)),\ ! 819: $(foreach BOBJ,$(BOBJS),\ ! 820: $($(basename $(notdir $(BOBJ)))_DEPS)))) ! 821: endef ! 822: $(BIN)/%.nodeps : $(BIN)/%.tmp ! 823: $(Q)$(ECHO) $(call nodeps_list,$<) ! 824: ! 825: # Get licensing verdict for the specified target ! 826: # ! 827: define licensable_deps_list ! 828: $(filter-out config/local/%.h,$(call deps_list,$(1))) ! 829: endef ! 830: define unlicensed_deps_list ! 831: $(shell grep -L FILE_LICENCE $(call licensable_deps_list,$(1))) ! 832: endef ! 833: define licence_list ! 834: $(patsubst __licence_%,%,\ ! 835: $(filter __licence_%,$(shell $(NM) $(1) | cut -d" " -f3))) ! 836: endef ! 837: $(BIN)/%.licence : $(BIN)/%.tmp ! 838: $(QM)$(ECHO) " [LICENCE] $@" ! 839: $(Q)$(if $(strip $(call unlicensed_deps_list,$<)),\ ! 840: echo -n "Unable to determine licence because the following " ;\ ! 841: echo "files are missing a licence declaration:" ;\ ! 842: echo $(call unlicensed_deps_list,$<);\ ! 843: exit 1,\ ! 844: $(PERL) $(LICENCE) $(call licence_list,$<)) ! 845: ! 846: # Extract compression information from intermediate object file ! 847: # ! 848: $(BIN)/%.zinfo : $(BIN)/%.tmp ! 849: $(QM)$(ECHO) " [ZINFO] $@" ! 850: $(Q)$(OBJCOPY) -O binary -j .zinfo $< $@ ! 851: ! 852: # Build raw binary file from intermediate object file ! 853: # ! 854: $(BIN)/%.bin : $(BIN)/%.tmp ! 855: $(QM)$(ECHO) " [BIN] $@" ! 856: $(Q)$(OBJCOPY) -O binary -R .zinfo $< $@ ! 857: ! 858: # Compress raw binary file ! 859: # ! 860: $(BIN)/%.zbin : $(BIN)/%.bin $(BIN)/%.zinfo $(ZBIN) ! 861: $(QM)$(ECHO) " [ZBIN] $@" ! 862: $(Q)$(ZBIN) $(BIN)/$*.bin $(BIN)/$*.zinfo > $@ ! 863: ! 864: # Rules for each media format. These are generated and placed in an ! 865: # external Makefile fragment. We could do this via $(eval ...), but ! 866: # that would require make >= 3.80. ! 867: # ! 868: # Note that there's an alternative way to generate most .rom images: ! 869: # they can be copied from their 'master' ROM image using cp and ! 870: # reprocessed with makerom to add the PCI IDs and ident string. The ! 871: # relevant rule would look something like: ! 872: # ! 873: # $(BIN)/dfe538%rom : $(BIN)/rtl8139%rom ! 874: # cat $< $@ ! 875: # $(FINALISE_rom) ! 876: # ! 877: # You can derive the ROM/driver relationships using the variables ! 878: # DRIVER_<rom> and/or ROMS_<driver>. ! 879: # ! 880: # We don't currently do this, because (a) it would require generating ! 881: # yet more Makefile fragments (since you need a rule for each ROM in ! 882: # ROMS), and (b) the linker is so fast that it probably wouldn't make ! 883: # much difference to the overall build time. ! 884: ! 885: # Add NON_AUTO_MEDIA to the media list, so that they show up in the ! 886: # output of "make" ! 887: # ! 888: MEDIA += $(NON_AUTO_MEDIA) ! 889: ! 890: media : ! 891: @$(ECHO) $(MEDIA) ! 892: ! 893: AUTO_MEDIA = $(filter-out $(NON_AUTO_MEDIA),$(MEDIA)) ! 894: automedia : ! 895: @$(ECHO) $(AUTO_MEDIA) ! 896: ! 897: # media_template : create Makefile rules for specified media ! 898: # ! 899: # $(1) is the media name (e.g. "rom") ! 900: # ! 901: define media_template ! 902: @$(ECHO) " [MEDIARULES] $(1)" ! 903: @$(MKDIR) -p $(BIN)/rules/$(dir $(1)) ! 904: @$(ECHO_E) '$$(BIN)/%.$(1) : $$(BIN)/%.$(1).zbin' \ ! 905: '\n\t$$(QM)$(ECHO) " [FINISH] $$@"' \ ! 906: '\n\t$$(Q)$$(CP) $$< $$@' \ ! 907: '\n\t$$(Q)$$(PAD_$(1))' \ ! 908: '\n\t$$(Q)$$(FINALISE_$(1))' \ ! 909: > $(BIN)/rules/$(1).media.r ! 910: endef ! 911: ! 912: # Rule to generate the Makefile rules to be included ! 913: # ! 914: $(BIN)/rules/%.media.r : $(MAKEDEPS) ! 915: $(call media_template,$*) ! 916: ! 917: # Calculate and include the list of Makefile rules files ! 918: # ! 919: MEDIA_RULES = $(patsubst %,$(BIN)/rules/%.media.r,$(AUTO_MEDIA)) ! 920: mediarules : ! 921: @$(ECHO) $(MEDIA_RULES) ! 922: ifdef NEED_DEPS ! 923: ifneq ($(MEDIA_RULES),) ! 924: -include $(MEDIA_RULES) ! 925: endif ! 926: endif ! 927: ! 928: # Wrap up binary blobs (for embedded images) ! 929: # ! 930: $(BIN)/%.o : payload/%.img ! 931: $(QM)echo " [WRAP] $@" ! 932: $(Q)$(LD) -b binary -r -o $@ $< --undefined obj_payload \ ! 933: --defsym obj_$*=0 ! 934: ! 935: BOBJS += $(patsubst payload/%.img,$(BIN)/%.o,$(wildcard payload/*.img)) ! 936: ! 937: # The "allXXXs" targets for each suffix ! 938: # ! 939: allall: allroms allmroms allpxes allisos alldsks ! 940: allroms allmroms : all%s : $(foreach ROM,$(ROMS),$(BIN)/$(ROM).%) ! 941: allpxes allisos alldsks : all%s : $(foreach DRIVER,$(DRIVERS),$(BIN)/$(DRIVER).%) ! 942: ! 943: # Alias for ipxe.% ! 944: # ! 945: $(BIN)/etherboot.% : $(BIN)/ipxe.% ! 946: ln -sf $(notdir $<) $@ ! 947: ! 948: endif # defined(BIN) ! 949: ! 950: ############################################################################### ! 951: # ! 952: # The compression utilities ! 953: # ! 954: $(NRV2B) : util/nrv2b.c $(MAKEDEPS) ! 955: $(QM)$(ECHO) " [HOSTCC] $@" ! 956: $(Q)$(HOST_CC) -O2 -DENCODE -DDECODE -DMAIN -DVERBOSE -DNDEBUG \ ! 957: -DBITSIZE=32 -DENDIAN=0 -o $@ $< ! 958: CLEANUP += $(NRV2B) ! 959: ! 960: $(ZBIN) : util/zbin.c util/nrv2b.c $(MAKEDEPS) ! 961: $(QM)$(ECHO) " [HOSTCC] $@" ! 962: $(Q)$(HOST_CC) -O2 -o $@ $< ! 963: CLEANUP += $(ZBIN) ! 964: ! 965: ############################################################################### ! 966: # ! 967: # The EFI image converter ! 968: # ! 969: ELF2EFI_CFLAGS := -I$(BINUTILS_DIR)/include -I$(BFD_DIR)/include \ ! 970: -I$(ZLIB_DIR)/include -idirafter include \ ! 971: -L$(BINUTILS_DIR)/lib -L$(BFD_DIR)/lib -L$(ZLIB_DIR)/lib \ ! 972: -lbfd -ldl -liberty -lz -Wl,--no-warn-search-mismatch ! 973: ! 974: $(ELF2EFI32) : util/elf2efi.c $(MAKEDEPS) ! 975: $(QM)$(ECHO) " [HOSTCC] $@" ! 976: $(Q)$(HOST_CC) $< $(ELF2EFI_CFLAGS) -DEFI_TARGET_IA32 -O2 -o $@ ! 977: CLEANUP += $(ELF2EFI32) ! 978: ! 979: $(ELF2EFI64) : util/elf2efi.c $(MAKEDEPS) ! 980: $(QM)$(ECHO) " [HOSTCC] $@" ! 981: $(Q)$(HOST_CC) $< $(ELF2EFI_CFLAGS) -DEFI_TARGET_X64 -O2 -o $@ ! 982: CLEANUP += $(ELF2EFI64) ! 983: ! 984: $(EFIROM) : util/efirom.c $(MAKEDEPS) ! 985: $(QM)$(ECHO) " [HOSTCC] $@" ! 986: $(Q)$(HOST_CC) -idirafter include -O2 -o $@ $< ! 987: CLEANUP += $(EFIROM) ! 988: ! 989: ############################################################################### ! 990: # ! 991: # The ICC fixup utility ! 992: # ! 993: $(ICCFIX) : util/iccfix.c $(MAKEDEPS) ! 994: $(QM)$(ECHO) " [HOSTCC] $@" ! 995: $(Q)$(HOST_CC) -idirafter include -O2 -o $@ $< ! 996: CLEANUP += $(ICCFIX) ! 997: ! 998: ############################################################################### ! 999: # ! 1000: # The error usage information utility ! 1001: # ! 1002: $(EINFO) : util/einfo.c $(MAKEDEPS) ! 1003: $(QM)$(ECHO) " [HOSTCC] $@" ! 1004: $(Q)$(HOST_CC) -idirafter include -O2 -o $@ $< ! 1005: CLEANUP += $(EINFO) ! 1006: ! 1007: ############################################################################### ! 1008: # ! 1009: # Local configs ! 1010: # ! 1011: config/local/%.h : ! 1012: $(Q)touch $@ ! 1013: ! 1014: ############################################################################### ! 1015: # ! 1016: # Auto-incrementing build serial number. Append "bs" to your list of ! 1017: # build targets to get a serial number printed at the end of the ! 1018: # build. Enable -DBUILD_SERIAL in order to see it when the code runs. ! 1019: # ! 1020: BUILDSERIAL_H = config/.buildserial.h ! 1021: BUILDSERIAL_NOW = config/.buildserial.now ! 1022: BUILDSERIAL_NEXT = config/.buildserial.next ! 1023: ! 1024: $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) : ! 1025: $(ECHO) 1 > $@ ! 1026: ! 1027: $(BUILDSERIAL_H) : $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) ! 1028: $(ECHO) '#define BUILD_SERIAL_NUM $(shell cat $<)' > $@ ! 1029: ! 1030: ifeq ($(filter bs,$(MAKECMDGOALS)),bs) ! 1031: $(shell diff -q $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) > /dev/null || \ ! 1032: cp -f $(BUILDSERIAL_NEXT) $(BUILDSERIAL_NOW)) ! 1033: endif ! 1034: ! 1035: bs : $(BUILDSERIAL_NOW) ! 1036: @$(ECHO) $$(( $(shell cat $<) + 1 )) > $(BUILDSERIAL_NEXT) ! 1037: @$(ECHO) "Build serial number is $(shell cat $<)" ! 1038: ! 1039: ############################################################################### ! 1040: # ! 1041: # Build the TAGS file(s) for emacs ! 1042: # ! 1043: TAGS : ! 1044: ctags -e -R -f $@ --exclude=bin ! 1045: ! 1046: CLEANUP += TAGS ! 1047: ! 1048: ############################################################################### ! 1049: # ! 1050: # Force rebuild for any given target ! 1051: # ! 1052: %.rebuild : ! 1053: rm -f $* ! 1054: $(Q)$(MAKE) $* ! 1055: ! 1056: ############################################################################### ! 1057: # ! 1058: # Symbol table checks ! 1059: # ! 1060: ! 1061: ifdef BIN ! 1062: ! 1063: SYMTAB = $(BIN)/symtab ! 1064: $(SYMTAB) : $(BLIB) ! 1065: $(OBJDUMP) -w -t $< > $@ ! 1066: ! 1067: CLEANUP += $(BIN)/symtab ! 1068: ! 1069: symcheck : $(SYMTAB) ! 1070: $(PERL) $(SYMCHECK) $< ! 1071: ! 1072: endif # defined(BIN) ! 1073: ! 1074: ############################################################################### ! 1075: # ! 1076: # Build bochs symbol table ! 1077: # ! 1078: ! 1079: ifdef BIN ! 1080: ! 1081: $(BIN)/%.bxs : $(BIN)/%.tmp ! 1082: $(NM) $< | cut -d" " -f1,3 > $@ ! 1083: ! 1084: endif # defined(BIN) ! 1085: ! 1086: ############################################################################### ! 1087: # ! 1088: # Documentation ! 1089: # ! 1090: ! 1091: ifdef BIN ! 1092: ! 1093: $(BIN)/doxygen.cfg : doxygen.cfg $(MAKEDEPS) ! 1094: $(Q)$(PERL) -pe 's{\@SRCDIRS\@}{$(SRCDIRS)}; ' \ ! 1095: -e 's{\@INCDIRS\@}{$(filter-out .,$(INCDIRS))}; ' \ ! 1096: -e 's{\@BIN\@}{$(BIN)}; ' \ ! 1097: -e 's{\@ARCH\@}{$(ARCH)}; ' \ ! 1098: $< > $@ ! 1099: ! 1100: $(BIN)/doc : $(BIN)/doxygen.cfg ! 1101: $(Q)$(DOXYGEN) $< ! 1102: ! 1103: .PHONY : $(BIN)/doc ! 1104: ! 1105: doc : $(BIN)/doc ! 1106: ! 1107: doc-clean : ! 1108: $(Q)$(RM) -r $(BIN)/doc ! 1109: ! 1110: VERYCLEANUP += $(BIN)/doc ! 1111: ! 1112: docview : ! 1113: @[ -f $(BIN)/doc/html/index.html ] || $(MAKE) $(BIN)/doc ! 1114: @if [ -n "$$BROWSER" ] ; then \ ! 1115: ( $$BROWSER $(BIN)/doc/html/index.html & ) ; \ ! 1116: else \ ! 1117: $(ECHO) "Documentation index in $(BIN)/doc/html/index.html" ; \ ! 1118: fi ! 1119: ! 1120: endif # defined(BIN) ! 1121: ! 1122: ############################################################################### ! 1123: # ! 1124: # Keyboard maps ! 1125: # ! 1126: ! 1127: hci/keymap/keymap_%.c : ! 1128: $(Q)$(PERL) $(GENKEYMAP) $* > $@ ! 1129: ! 1130: ############################################################################### ! 1131: # ! 1132: # Force deletion of incomplete targets ! 1133: # ! 1134: ! 1135: .DELETE_ON_ERROR : ! 1136: ! 1137: ############################################################################### ! 1138: # ! 1139: # Clean-up ! 1140: # ! 1141: clean : ! 1142: $(RM) $(CLEANUP) ! 1143: ! 1144: veryclean : clean ! 1145: $(RM) -r $(VERYCLEANUP)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.