150 lines
4.1 KiB
Makefile
150 lines
4.1 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_WITH_ROM_VARS))
|
|
.PHONY: all
|
|
|
|
# Pretty print output. Use "make Q=" to see full commands
|
|
Q ?= @
|
|
define pretty
|
|
@printf "%8s %s\n" "$1" "$2"
|
|
endef
|
|
|
|
# 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 -u_start -Wl,-Map=$(@:.elf=.map)
|
|
|
|
# Assembler flags
|
|
AFLAGS ?= -Wa,-gstabs $(CFLAGS)
|
|
|
|
# Misc tool options
|
|
OBJCOPYFLAGS ?= --gap-fill=0xff
|
|
ARFLAGS = cr
|
|
|
|
#####
|
|
|
|
include $(MC1322X)/board/Makefile.board
|
|
include $(MC1322X)/lib/Makefile.lib
|
|
include $(MC1322X)/src/Makefile.src
|
|
|
|
#####
|
|
# Rule for building ELF files. We use both a wildcard rule that links
|
|
# $(SRCLIB) as well as target-specific rules that link $(SRCLIB_ROMVARS)
|
|
|
|
# Normal targets (wildcard rule):
|
|
%_$(BOARD).elf: $(OBJDIR)/%.o $(OBJDIR)/board.a $(MC1322X)/lib/libmc1322x.a $(SRCLIB)
|
|
$(call pretty,LINK,$@)
|
|
$Q$(CC) $(LDFLAGS) -o $@ -Wl,--start-group $^ -lm -Wl,--end-group
|
|
|
|
# Targets that need space for rom variables:
|
|
define build_elf_rule
|
|
$(1)_$$(BOARD).elf: $$(OBJDIR)/$(1).o $$(OBJDIR)/board.a $$(MC1322X)/lib/libmc1322x.a $$(SRCLIB_ROMVARS)
|
|
$$(call pretty,LINK (romvars),$$@)
|
|
$$Q$$(CC) $$(LDFLAGS) -o $$@ -Wl,--start-group $$^ -lm -Wl,--end-group
|
|
endef
|
|
$(foreach t, $(TARGETS_WITH_ROM_VARS), $(eval $(call build_elf_rule,$(t))))
|
|
|
|
|
|
# Generic rules
|
|
%.srec: %.elf
|
|
$(call pretty,OBJCOPY,$@)
|
|
$Q$(OBJCOPY) $(OBJCOPYFLAGS) -O srec $< $@
|
|
|
|
%.ihex: %.elf
|
|
$(call pretty,OBJCOPY,$@)
|
|
$Q$(OBJCOPY) $(OBJCOPYFLAGS) -O ihex $< $@
|
|
|
|
%.bin: %.elf
|
|
$(call pretty,OBJCOPY,$@)
|
|
$Q$(OBJCOPY) $(OBJCOPYFLAGS) -O binary $< $@
|
|
|
|
%.dis: %.elf
|
|
$(call pretty,OBJDUMP,$@)
|
|
$Q$(OBJDUMP) -Sd $< > $@ || rm -f $@
|
|
|
|
%.dis: %.o
|
|
$(call pretty,OBJDUMP,$@)
|
|
$Q$(OBJDUMP) -d $< > $@ || rm -f $@
|
|
|
|
%.o: %.c
|
|
$(call pretty,CC,$@)
|
|
$Q$(CC) $(CFLAGS) $(CFLAGS_THUMB) -MMD -c -o $@ $<
|
|
@$(FINALIZE_DEPENDENCY)
|
|
|
|
%.o: %.S
|
|
$(call pretty,AS,$@)
|
|
$Q$(CC) $(AFLAGS) -MMD -c -o $@ $<
|
|
@$(FINALIZE_DEPENDENCY)
|
|
|
|
(%): %
|
|
$(call pretty,AR,$@($<))
|
|
@$(AR) $(ARFLAGS) $@ $<
|
|
|
|
# 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} *~
|
|
|
|
.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
|