contiki/cpu/msp430/Makefile.msp430
Peter A. Bigot 5fc0575e99 Makefile.include: support make clean all
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).
2013-06-20 17:45:41 -05:00

219 lines
5.5 KiB
Makefile

# $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