Annotation of qemu/roms/ipxe/src/Makefile.housekeeping, revision 1.1

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)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.