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).
218 lines
5.5 KiB
Text
218 lines
5.5 KiB
Text
# $Id: Makefile.msp430,v 1.35 2011/01/19 07:30:31 adamdunkels Exp $
|
|
|
|
ifdef nodeid
|
|
CFLAGS += -DNODEID=$(nodeid)
|
|
endif
|
|
|
|
.SUFFIXES:
|
|
|
|
### Define the CPU directory
|
|
CONTIKI_CPU=$(CONTIKI)/cpu/msp430
|
|
|
|
### Define the source files we have in the MSP430 port
|
|
|
|
ifndef CONTIKI_CPU_FAM_DIR
|
|
ifneq (,$(findstring msp430f1,$(MCU)))
|
|
CONTIKI_CPU_FAM_DIR = f1xxx
|
|
endif
|
|
endif
|
|
ifndef CONTIKI_CPU_FAM_DIR
|
|
ifneq (,$(findstring msp430f5,$(MCU)))
|
|
CONTIKI_CPU_FAM_DIR = f5xxx
|
|
endif
|
|
endif
|
|
ifndef CONTIKI_CPU_FAM_DIR
|
|
ifneq (,$(findstring msp430f2,$(MCU)))
|
|
CONTIKI_CPU_FAM_DIR = f2xxx f1xxx
|
|
endif
|
|
endif
|
|
ifndef CONTIKI_CPU_FAM_DIR
|
|
${error Unhandled MSP430 family: "$(MCU)"}
|
|
endif
|
|
|
|
CONTIKI_CPU_DIRS = $(CONTIKI_CPU_FAM_DIR) . dev
|
|
|
|
MSP430 = msp430.c flash.c clock.c leds.c leds-arch.c \
|
|
watchdog.c lpm.c mtarch.c rtimer-arch.c
|
|
UIPDRIVERS = me.c me_tabs.c slip.c crc16.c
|
|
ELFLOADER = elfloader.c elfloader-msp430.c symtab.c
|
|
|
|
CONTIKI_TARGET_SOURCEFILES += $(MSP430) \
|
|
$(SYSAPPS) $(ELFLOADER) \
|
|
$(UIPDRIVERS)
|
|
|
|
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
|
|
|
|
### Compiler definitions
|
|
|
|
ifdef WERROR
|
|
CFLAGSWERROR=-Werror
|
|
endif
|
|
|
|
ifdef IAR
|
|
CC = icc430
|
|
LD = xlink
|
|
AS = iasm430
|
|
AR = xar
|
|
OBJCOPY = ielftool
|
|
STRIP = strip
|
|
|
|
ifndef IAR_PATH
|
|
# This works with cygwin...
|
|
IAR_BIN_PATH := $(shell dirname "`which $(CC)`")
|
|
IAR_PATH_C := $(shell dirname "$(IAR_BIN_PATH)")
|
|
IAR_PATH := $(shell cygpath -m "$(IAR_PATH_C)")
|
|
endif
|
|
|
|
CFLAGS += --diag_suppress=Pa050 --silent
|
|
|
|
#defaults on the MSP430X core include file here (xlfn.h)
|
|
ifndef CFLAGSNO
|
|
CFLAGSNO = --dlib_config "$(IAR_PATH)/LIB/DLIB/dl430xlfn.h" $(CFLAGSWERROR)
|
|
# CFLAGSNO = --dlib_config $(IAR_PATH)/LIB/DLIB/dl430xlfn.h -Ohz --multiplier=32 --multiplier_location=4C0 --hw_workaround=CPU40 --core=430X $(CFLAGSWERROR) --data_model large --double=32
|
|
endif
|
|
|
|
LDFLAGSNO += -B -l contiki-$(TARGET).map -s __program_start
|
|
# Stack and heap size in hex
|
|
ifndef IAR_STACK_SIZE
|
|
IAR_STACK_SIZE=300
|
|
endif
|
|
# Set this to a positive number (hex) to enable malloc/free with IAR compiler
|
|
ifndef IAR_DATA16_HEAP_SIZE
|
|
IAR_DATA16_HEAP_SIZE=100
|
|
endif
|
|
ifndef IAR_DATA20_HEAP_SIZE
|
|
IAR_DATA20_HEAP_SIZE=0
|
|
endif
|
|
LDFLAGSNO += -D_STACK_SIZE=$(IAR_STACK_SIZE) -D_DATA16_HEAP_SIZE=$(IAR_DATA16_HEAP_SIZE) -D_DATA20_HEAP_SIZE=$(IAR_DATA20_HEAP_SIZE)
|
|
|
|
CUSTOM_RULE_C_TO_O = 1
|
|
%.o: %.c
|
|
$(CC) $(CFLAGS) $< -o $@
|
|
|
|
define FINALIZE_CYGWIN_DEPENDENCY
|
|
sed -e 's/ \([A-Z]\):\\/ \/cygdrive\/\L\1\//' -e 's/\\/\//g' \
|
|
<$(@:.o=.P) >$(@:.o=.d); \
|
|
rm -f $(@:.o=.P)
|
|
endef
|
|
|
|
CUSTOM_RULE_C_TO_OBJECTDIR_O = 1
|
|
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
|
|
$(CC) $(CFLAGS) $< --dependencies=m $(@:.o=.P) -o $@
|
|
ifeq ($(HOST_OS),Windows)
|
|
@$(FINALIZE_CYGWIN_DEPENDENCY)
|
|
endif
|
|
|
|
CUSTOM_RULE_C_TO_CO = 1
|
|
%.co: %.c
|
|
$(CC) $(CFLAGS) -DAUTOSTART_ENABLE $< -o $@
|
|
|
|
AROPTS = -o
|
|
|
|
else
|
|
|
|
GCC = 1
|
|
CC = msp430-gcc
|
|
LD = msp430-gcc
|
|
AS = msp430-as
|
|
AR = msp430-ar
|
|
NM = msp430-nm
|
|
OBJCOPY = msp430-objcopy
|
|
STRIP = msp430-strip
|
|
BSL = msp430-bsl
|
|
|
|
# From version 4.6.x, mspgcc does not support generic MCU identifiers such as
|
|
# msp430x1611 in contrast to msp430f1611
|
|
ifndef CC_MCU
|
|
ifndef MSPGCC_VERSION
|
|
MSPGCC_VERSION := ${shell $(CC) -dumpversion}
|
|
endif
|
|
endif
|
|
ifndef CC_MCU
|
|
ifneq (,$(findstring 4.4.,$(MSPGCC_VERSION)))
|
|
CC_MCU := ${subst msp430f,msp430x,$(MCU)}
|
|
endif
|
|
endif
|
|
ifndef CC_MCU
|
|
ifneq (,$(findstring 3.2.,$(MSPGCC_VERSION)))
|
|
CC_MCU := ${subst msp430f,msp430x,$(MCU)}
|
|
endif
|
|
endif
|
|
ifndef CC_MCU
|
|
CC_MCU := $(MCU)
|
|
endif
|
|
|
|
ifndef CFLAGSNO
|
|
CFLAGSNO = -Wall -mmcu=$(CC_MCU) $(CFLAGSWERROR)
|
|
endif
|
|
CFLAGS += -Os -fno-strict-aliasing
|
|
LDFLAGS += -mmcu=$(CC_MCU) -Wl,-Map=contiki-$(TARGET).map
|
|
|
|
### These flags can reduce the code size and RAM usage with up to 10%
|
|
ifeq ($(SMALL),1)
|
|
CFLAGS += -ffunction-sections
|
|
# CFLAGS += -fdata-sections
|
|
LDFLAGS += -Wl,--gc-sections,--undefined=_reset_vector__,--undefined=InterruptVectors,--undefined=_copy_data_init__,--undefined=_clear_bss_init__,--undefined=_end_of_init__
|
|
endif # SMALL
|
|
|
|
endif # IAR
|
|
|
|
CFLAGS += $(CFLAGSNO)
|
|
|
|
PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)}
|
|
|
|
### Compilation rules
|
|
|
|
%-stripped.o: %.c
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(STRIP) --strip-unneeded -g -x $@
|
|
|
|
%.cm: %.co
|
|
$(LD) -i -r --unresolved-symbols=ignore-in-object-files -mmsp430x149 -o $@ $^
|
|
$(STRIP) --strip-unneeded -g -x $@
|
|
|
|
%-stripped.o: %.o
|
|
$(STRIP) --strip-unneeded -g -x -o $@ $<
|
|
|
|
%.o: ${CONTIKI_TARGET}/loader/%.S
|
|
$(AS) -o $(notdir $(<:.S=.o)) $<
|
|
|
|
%.firmware: %.${TARGET}
|
|
mv $< $@
|
|
|
|
ifdef IAR
|
|
%.ihex: %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
|
|
$(LD) $(LDFLAGSNO) -Fintel-extended $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@
|
|
else
|
|
%.ihex: %.$(TARGET)
|
|
$(OBJCOPY) $^ -O ihex $@
|
|
endif
|
|
|
|
%.mspsim: %.${TARGET}
|
|
java -jar ${CONTIKI}/tools/mspsim/mspsim.jar -platform=${TARGET} $<
|
|
|
|
mspsim-maptable: contiki-${TARGET}.map
|
|
java -classpath ${CONTIKI}/tools/mspsim/mspsim.jar se.sics.mspsim.util.MapTable $<
|
|
|
|
core-labels.o: core.${TARGET}
|
|
${CONTIKI}/tools/msp430-make-labels core.${TARGET} > core-labels.S
|
|
$(AS) -o $@ core-labels.S
|
|
# cp core-labels.o app/
|
|
|
|
core-globals.o: core.${TARGET}
|
|
${CONTIKI}/tools/msp430-make-globals core.${TARGET} > core-globals.S
|
|
$(AS) -o $@ core-globals.S
|
|
|
|
loader-init.o: ${CONTIKI_TARGET}/loader/loader-init.S
|
|
$(AS) -o $(notdir $(<:.S=.o)) $<
|
|
# cp loader-init.o build-app/
|
|
|
|
ifdef CORE
|
|
.PHONY: symbols.c symbols.h
|
|
symbols.c:
|
|
$(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c
|
|
else
|
|
symbols.c symbols.h:
|
|
cp ${CONTIKI}/tools/empty-symbols.c symbols.c
|
|
cp ${CONTIKI}/tools/empty-symbols.h symbols.h
|
|
endif
|