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