5fc0575e99
Historically $(OBJECTDIR) was created when Makefile.include is read. A consequence is that combining "clean" with "all" (or any other build target) results in an error because the clean removes the object directory that is required to exist when building dependencies. Creating $(OBJECTDIR) on-demand ensures it is present when needed. Removed creation of $(OBJECTDIR) on initial read, and added an order-only dependency forcing its creation all Makefile* rules where the target is explicitly or implicitly in $(OBJECTDIR).
217 lines
6.8 KiB
Makefile
217 lines
6.8 KiB
Makefile
### Compiler definitions
|
|
CC = sdcc
|
|
LD = sdcc
|
|
AS = sdcc
|
|
AR = sdcclib
|
|
OBJCOPY = objcopy
|
|
STRIP = strip
|
|
|
|
### Hex file conversions
|
|
PACKIHX = packihx
|
|
SREC_CAT = srec_cat
|
|
SREC_FLAGS = -disable_sequence_warnings
|
|
|
|
BANK_ALLOC = $(CONTIKI_CPU)/bank-alloc.py
|
|
SEGMENT_RULES = $(OBJECTDIR)/segment.rules
|
|
|
|
CFLAGS += --model-$(MEMORY_MODEL) --stack-auto --std-c99
|
|
CFLAGS += -DCC2530_LAST_FLASH_BANK=$(HIGH_FLASH_BANK)
|
|
CFLAGS += --fomit-frame-pointer
|
|
|
|
LDFLAGS += --model-$(MEMORY_MODEL) --stack-auto --out-fmt-ihx
|
|
LDFLAGS += --xram-loc 0x0000 --xram-size 0x1F00
|
|
LDFLAGS += --code-loc $(START_ADDR) --code-size $(CODE_SIZE)
|
|
|
|
ASFLAGS += -plosgff
|
|
|
|
AROPTS = -a
|
|
|
|
### Our object files are .rel, so we can't use the default finalize dependency
|
|
### generation. Override here.
|
|
define FINALIZE_SDCC_DEPENDENCY
|
|
cp $(@:.rel=.d) $(@:.rel=.$$$$); \
|
|
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
|
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.rel=.$$$$) >> $(@:.rel=.d); \
|
|
rm -f $(@:.rel=.$$$$)
|
|
endef
|
|
|
|
### SoC flavor (F256, F128, F64, F32) as the ID of the last flash bank (0...7)
|
|
### We assume F256, project Makefile can override
|
|
###
|
|
### ToDo:
|
|
### Fix --code-size accordingly
|
|
### Fix the bank allocator to play for all flavors
|
|
ifndef HIGH_FLASH_BANK
|
|
HIGH_FLASH_BANK=7
|
|
endif
|
|
|
|
### Banking Guesswork:
|
|
### Generic examples do not specify banking.
|
|
### We automatically turn it on if its unspecified and if we are building with
|
|
### UIP_CONF_IPV6
|
|
ifndef HAVE_BANKING
|
|
ifeq ($(UIP_CONF_IPV6),1)
|
|
HAVE_BANKING=1
|
|
else
|
|
HAVE_BANKING=0
|
|
endif
|
|
endif
|
|
|
|
### Does the project want us to offset the firmware?
|
|
### define start address and max code size accordingly
|
|
ifeq ($(OFFSET_FIRMWARE),1)
|
|
START_ADDR = 0x01000
|
|
HOME_START = 00001000
|
|
ifeq ($(HAVE_BANKING),1)
|
|
CODE_SIZE = 0x3F000
|
|
else
|
|
CODE_SIZE = 0x0F000
|
|
endif
|
|
else
|
|
START_ADDR = 0x00000
|
|
HOME_START = 00000000
|
|
ifeq ($(HAVE_BANKING),1)
|
|
CODE_SIZE = 0x40000
|
|
else
|
|
CODE_SIZE = 0x10000
|
|
endif
|
|
endif
|
|
|
|
### Are we building with BANKing supoprt?
|
|
ifeq ($(HAVE_BANKING),1)
|
|
## Yes
|
|
MEMORY_MODEL=huge
|
|
LDFLAGS += -Wl-r
|
|
LD_PRE_FLAGS += -Wl-bBANK1=0x018000
|
|
CFLAGS += -DHAVE_SDCC_BANKING
|
|
#use this in $(call c_seg,$<) to get segment for a source file.
|
|
c_seg = --codeseg $(shell python $(BANK_ALLOC) $1 $(SEGMENT_RULES) $2)
|
|
else
|
|
## No banking
|
|
MEMORY_MODEL=large
|
|
c_seg =
|
|
endif
|
|
|
|
### CPU-dependent cleanup files
|
|
CLEAN += *.lnk *.lk *.sym *.lib *.ihx *.rel *.mem *.rst *.asm *.hex
|
|
CLEAN += *.omf *.cdb *.banks *.flags *.banked-hex
|
|
CLEAN += symbols.c symbols.h
|
|
|
|
### CPU-dependent directories
|
|
CONTIKI_CPU_DIRS = . dev
|
|
|
|
### CPU-dependent source files
|
|
CONTIKI_SOURCEFILES += soc.c clock.c stack.c
|
|
CONTIKI_SOURCEFILES += uart0.c uart1.c uart-intr.c
|
|
CONTIKI_SOURCEFILES += dma.c dma_intr.c
|
|
CONTIKI_SOURCEFILES += cc2530-rf.c
|
|
CONTIKI_SOURCEFILES += watchdog.c rtimer-arch.c
|
|
CONTIKI_SOURCEFILES += port2-intr.c port2.c
|
|
CONTIKI_ASMFILES +=
|
|
|
|
include $(CONTIKI_CPU)/usb/Makefile.usb
|
|
|
|
CONTIKI_SOURCEFILES += $(USB_SOURCEFILES)
|
|
|
|
CONTIKI_ASMOBJECTFILES = $(addprefix $(OBJECTDIR)/,$(CONTIKI_ASMFILES:.S=.rel))
|
|
|
|
CONTIKI_CASMOBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(CONTIKI_CASMFILES:.cS=.rel))
|
|
|
|
CONTIKI_PLATFORM_DIRS = $(PLATFORM_APPDIRS) \
|
|
$(addprefix $(CONTIKI)/platform/$(TARGET)/, $(CONTIKI_TARGET_DIRS))
|
|
|
|
CONTIKI_CPU_DIRS_LIST = $(addprefix $(CONTIKI_CPU)/, \
|
|
$(CONTIKI_CPU_DIRS))
|
|
|
|
oname = $(patsubst %.c,%.rel,$(patsubst %.S,%.rel,$(1)))
|
|
|
|
CONTIKI_OBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(call oname, $(CONTIKI_SOURCEFILES)))
|
|
|
|
PROJECT_OBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(call oname, $(PROJECT_SOURCEFILES)))
|
|
|
|
### Compilation rules
|
|
|
|
SEGMENT_RULE_FILES = $(foreach dir, . $(CONTIKI_PLATFORM_DIRS) \
|
|
$(CONTIKI_CPU_DIRS_LIST), $(wildcard $(dir)/segment.rules) )
|
|
|
|
# NB: Assumes SEGMENT_RULES was not overridden and is in $(OBJECTDIR)
|
|
$(SEGMENT_RULES): $(SEGMENT_RULE_FILES) | $(OBJECTDIR)
|
|
cat $(SEGMENT_RULE_FILES) | \
|
|
sed -e 's/#.*$$//' -e 's/^\s*//' -e '/^$$/d' > $@
|
|
|
|
CUSTOM_RULE_LINK=1
|
|
CUSTOM_RULE_C_TO_OBJECTDIR_O=1
|
|
CUSTOM_RULE_ALLOBJS_TO_TARGETLIB=1
|
|
|
|
$(OBJECTDIR)/%.rel: %.c $(SEGMENT_RULES) | $(OBJECTDIR)
|
|
$(CC) $(call c_seg,$<,$@) $(CFLAGS) -c $< -o $@ -Wp,-MMD,$(@:.rel=.d),-MQ,$@
|
|
@$(FINALIZE_SDCC_DEPENDENCY)
|
|
|
|
$(OBJECTDIR)/%.rel: %.cS | $(OBJECTDIR)
|
|
cp $< $(OBJECTDIR)/$*.c
|
|
$(CC) $(CFLAGS) -E $(OBJECTDIR)/$*.c > $(OBJECTDIR)/tmp
|
|
perl -pe "s/^#(.*)/;$$1/" $(OBJECTDIR)/tmp > $(OBJECTDIR)/$*.S
|
|
$(AS) $(ASFLAGS) -o $@ $(OBJECTDIR)/$*.S
|
|
rm -f $(OBJECTDIR)/tmp
|
|
|
|
contiki-$(TARGET).lib: $(CONTIKI_OBJECTFILES) $(PROJECT_OBJECTFILES) \
|
|
$(CONTIKI_ASMOBJECTFILES) $(CONTIKI_CASMOBJECTFILES)
|
|
rm -f $@
|
|
for target in $^; do echo $$target >> $@; done
|
|
|
|
.PRECIOUS: %.$(TARGET) %.hex
|
|
|
|
# build app/example local object files. We need a separate rule so that we can
|
|
# pass -DAUTOSTART_ENABLE for those files only
|
|
$(OBJECTDIR)/%.app.rel: %.c $(SEGMENT_RULES) | $(OBJECTDIR)
|
|
$(CC) $(call c_seg,$<,$@) -DAUTOSTART_ENABLE $(CFLAGS) -c $< -o $@
|
|
|
|
# .ihx is the sdcc binary output file
|
|
ifeq ($(HAVE_BANKING),1)
|
|
### Build bankable firmware
|
|
%.ihx: $(OBJECTDIR)/%.app.rel $(CONTIKI_TARGET_MAIN) contiki-$(TARGET).lib
|
|
@echo "\nFirst Link"
|
|
@echo "==============="
|
|
$(CC) $(LDFLAGS) $(LD_PRE_FLAGS) -o $@ $(CONTIKI_TARGET_MAIN) $(OBJECTDIR)/$*.app.rel -llibsdcc.lib -lcontiki-$(TARGET).lib > /dev/null
|
|
|
|
%.flags: %.ihx
|
|
### Allocate modules to banks and relocate object files
|
|
@echo "\nBank Allocation"
|
|
@echo "==============="
|
|
python $(BANK_ALLOC) $(basename $(@F)) $(SEGMENT_RULES) $(OFFSET_FIRMWARE)
|
|
|
|
%.banked-hex: %.flags
|
|
### Link again with new bank allocations
|
|
@echo "\nFinal Link"
|
|
@echo "==============="
|
|
$(CC) $(LDFLAGS) $(shell cat $<) -o $@ $(CONTIKI_TARGET_MAIN) $(OBJECTDIR)/$*.app.rel -llibsdcc.lib -lcontiki-$(TARGET).lib > /dev/null
|
|
|
|
%.hex: %.banked-hex
|
|
### Post-process the hex file for programmers which dislike SDCC output hex format
|
|
$(eval BANKS := $(shell egrep '(^BANK[0-9])=' $(@:.hex=.map) | sed -e 's/BANK\([0-9]\).*/\1/' | uniq))
|
|
$(eval FILES := $(addsuffix .hex,$(addprefix bank,$(BANKS))))
|
|
@echo "\nPack hex file"
|
|
@echo "==============="
|
|
@for bank in $(BANKS); do \
|
|
echo $(SREC_CAT) $(SREC_FLAGS) $(@:.hex=.banked-hex) -intel \
|
|
-crop 0x"$$bank"8000 "0x"$$bank"FFFF" \
|
|
-offset -$$((0x8000 * $$bank + 0x08000)) -o bank"$$bank".hex -intel; \
|
|
$(SREC_CAT) $(SREC_FLAGS) $(@:.hex=.banked-hex) -intel \
|
|
-crop 0x"$$bank"8000 "0x"$$bank"FFFF" \
|
|
-offset -$$((0x8000 * $$bank + 0x08000)) -o bank"$$bank".hex -intel; \
|
|
done
|
|
$(SREC_CAT) $(SREC_FLAGS) $(@:.hex=.banked-hex) -intel -crop 0x00000 0x07FFF -o home.ihx -intel
|
|
srec_cat home.ihx -intel $(foreach file,$(FILES),$(file) -intel) -o $@ -intel
|
|
rm -f home.ihx $(FILES)
|
|
else
|
|
### Build non-banked firmware
|
|
%.ihx: $(OBJECTDIR)/%.app.rel $(CONTIKI_TARGET_MAIN) contiki-$(TARGET).lib
|
|
$(CC) $(LDFLAGS) -o $@ $(CONTIKI_TARGET_MAIN) $(OBJECTDIR)/$*.app.rel -llibsdcc.lib -lcontiki-$(TARGET).lib > /dev/null
|
|
|
|
%.hex: %.ihx
|
|
$(PACKIHX) $< > $@
|
|
endif
|