0a41939407
This is an attempt to fix and cleanup all of the rules, and get rid of some of the recursion. We still need to invoke make several times when we're building for more than one board, and some things can get a bit weird when that happens, but it should generally work. A single BOARD=foo build should be fully correct, now. I attempted to keep things compatible, so existing Makefiles that include libmc1322x/Makefile.include should still work correctly.
124 lines
3.5 KiB
Makefile
124 lines
3.5 KiB
Makefile
# Hey Emacs, this is a -*- makefile -*-
|
|
|
|
# Set up a default target in case the user didn't already have one.
|
|
# "all" means to build .bin for all defined targets for the currently-defined board
|
|
all: $(addsuffix _$(BOARD).bin, $(TARGETS) $(TARGETS_ROMVARS))
|
|
.PHONY: all
|
|
|
|
# Don't delete intermediate targets
|
|
.SECONDARY:
|
|
|
|
#####
|
|
# Tools and flags
|
|
|
|
# Set up cross compiler and toolchain definitions.
|
|
CROSS_COMPILE ?= arm-linux-
|
|
AS = $(CROSS_COMPILE)as
|
|
LD = $(CROSS_COMPILE)ld
|
|
CC = $(CROSS_COMPILE)gcc
|
|
CPP = $(CC) -E
|
|
AR = $(CROSS_COMPILE)ar
|
|
NM = $(CROSS_COMPILE)nm
|
|
STRIP = $(CROSS_COMPILE)strip
|
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
|
OBJDUMP = $(CROSS_COMPILE)objdump
|
|
RANLIB = $(CROSS_COMPILE)ranlib
|
|
|
|
# Build CFLAGS and prepend it to user-supplied CFLAGS
|
|
CFLAGS_PLAT ?= -march=armv4t -mtune=arm7tdmi-s -mlong-calls -msoft-float \
|
|
-mthumb-interwork -fno-strict-aliasing -fno-common -ffixed-r8 \
|
|
-ffunction-sections -ffreestanding -fno-builtin
|
|
CFLAGS_WARN ?= -Wcast-align -Wall -Wstrict-prototypes -Wextra
|
|
CFLAGS_OPT ?= -Os
|
|
CFLAGS_DEBUG ?= -g -DDEBUG -Werror
|
|
CFLAGS_MISC ?= -pipe
|
|
CFLAGS := $(CFLAGS_PLAT) $(CFLAGS_WARN) $(CFLAGS_OPT) $(CFLAGS_DEBUG) $(CFLAGS_MISC) $(CFLAGS)
|
|
|
|
# Thumb flags, used for building most objects
|
|
CFLAGS_THUMB ?= -mthumb -mcallee-super-interworking
|
|
|
|
# Linker flags
|
|
LINKERSCRIPT ?= $(MC1322X)/mc1322x.lds
|
|
LDFLAGS ?= -T $(LINKERSCRIPT) -nostartfiles -static -export-dynamic -Wl,-Map=$(@:.elf=.map)
|
|
|
|
# Assembler flags
|
|
AFLAGS ?= -Wa,-gstabs $(CFLAGS)
|
|
|
|
# Misc tool options
|
|
OBJCOPYFLAGS ?= --gap-fill=0xff
|
|
|
|
#####
|
|
|
|
include $(MC1322X)/board/Makefile.board
|
|
include $(MC1322X)/lib/Makefile.lib
|
|
include $(MC1322X)/src/Makefile.src
|
|
|
|
#####
|
|
# Rule for building ELF files. We generate both a wildcard rule
|
|
# that links $(SRCLIB) as well as target-specific rules that link $(SRCLIB_ROMVARS)
|
|
define build_elf_rule
|
|
$(1)_$$(BOARD).elf: $$(OBJDIR)/$(1).o $$(OBJDIR)/board.a $$(MC1322X)/lib/libmc1322x.a $(2)
|
|
$$(CC) $$(LDFLAGS) -o $$@ -Wl,--start-group $$^ -lm -Wl,--end-group
|
|
endef
|
|
# Targets that need space for rom variables:
|
|
$(foreach t, $(TARGETS_ROMVARS), $(eval $(call build_elf_rule,$(t),$(SRCLIB_ROMVARS))))
|
|
# All other targets (wildcard rule):
|
|
$(eval $(call build_elf_rule,%,$(SRCLIB_ROMVARS)))
|
|
|
|
# Generic rules
|
|
%.srec: %.elf
|
|
$(OBJCOPY) $(OBJCOPYFLAGS) -O srec $< $@
|
|
|
|
%.ihex: %.elf
|
|
$(OBJCOPY) $(OBJCOPYFLAGS) -O ihex $< $@
|
|
|
|
%.bin: %.elf
|
|
$(OBJCOPY) $(OBJCOPYFLAGS) -O binary $< $@
|
|
|
|
%.dis: %.elf
|
|
$(OBJDUMP) -Sd $< > $@ || rm -f $@
|
|
|
|
%.o: %.c
|
|
$(CC) $(CFLAGS) $(CFLAGS_THUMB) -MMD -c -o $@ $<
|
|
@$(FINALIZE_DEPENDENCY)
|
|
|
|
%.o: %.S
|
|
$(CC) $(AFLAGS) -MMD -c -o $@ $<
|
|
@$(FINALIZE_DEPENDENCY)
|
|
|
|
# Fix the dependencies generated for a particular target .o
|
|
# See http://make.paulandlesley.org/autodep.html#advanced
|
|
define FINALIZE_DEPENDENCY
|
|
cp $(@:.o=.d) $(@:.o=.$$$$); \
|
|
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
|
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.$$$$) >> $(@:.o=.d); \
|
|
rm -f $(@:.o=.$$$$)
|
|
endef
|
|
|
|
clean::
|
|
rm -f *.{o,d,a,bin,elf,ihex,srec,dis,map,bak} *~
|
|
rm -rf obj_*
|
|
|
|
.PHONY: clean
|
|
|
|
##############################
|
|
|
|
# If no single board was specified, invoke make recursively for each
|
|
# board in $(BOARDS), or $(ALL_BOARDS) if that wasn't specified either.
|
|
# This is at the end so that it can override all other targets.
|
|
ifndef BOARD
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
.DEFAULT_GOAL=mc1322x-default
|
|
BOARDS ?= $(ALL_BOARDS)
|
|
define build_board
|
|
@echo "Building for board: $(1)"
|
|
@$(MAKE) --no-print-directory BOARD=$(1) $(2)
|
|
|
|
endef
|
|
$(MAKECMDGOALS):
|
|
$(foreach b, $(BOARDS), $(call build_board,$(b),$@))
|
|
mc1322x-default:
|
|
$(foreach b, $(BOARDS), $(call build_board,$(b),))
|
|
endif
|
|
endif
|