299 lines
7.8 KiB
Makefile
299 lines
7.8 KiB
Makefile
# -*- makefile -*-
|
|
|
|
ifndef CONTIKI
|
|
${error CONTIKI not defined! You must specify where Contiki resides}
|
|
endif
|
|
|
|
ifeq ($(TARGET),)
|
|
-include Makefile.target
|
|
ifeq ($(TARGET),)
|
|
${info TARGET not defined, using target 'native'}
|
|
TARGET=native
|
|
else
|
|
${info using saved target '$(TARGET)'}
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(DEFINES),)
|
|
-include Makefile.$(TARGET).defines
|
|
ifneq ($(DEFINES),)
|
|
${info using saved defines '$(DEFINES)'}
|
|
endif
|
|
endif
|
|
|
|
ifndef HOST_OS
|
|
ifeq ($(OS),Windows_NT)
|
|
## TODO: detect more specific Windows set-ups,
|
|
## e.g. CygWin, MingW, VisualC, Watcom, Interix
|
|
HOST_OS := Windows
|
|
else
|
|
HOST_OS := $(shell uname)
|
|
endif
|
|
endif
|
|
|
|
#More debug information when running in CI
|
|
ifdef CI
|
|
ifeq ($(CI),true)
|
|
V = 1
|
|
endif
|
|
endif
|
|
|
|
usage:
|
|
@echo "make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets]"
|
|
|
|
targets:
|
|
@ls -1 $(CONTIKI)/drivers/platform $(TARGETDIRS) | grep -v CVS
|
|
|
|
savetarget:
|
|
-@rm -f Makefile.target
|
|
@echo "saving Makefile.target"
|
|
@echo >Makefile.target "TARGET = $(TARGET)"
|
|
|
|
savedefines:
|
|
-@rm -f Makefile.$(TARGET).defines
|
|
@echo "saving Makefile.$(TARGET).defines"
|
|
@echo >Makefile.$(TARGET).defines "DEFINES = $(DEFINES)"
|
|
|
|
OBJECTDIR = obj_$(TARGET)
|
|
|
|
LOWERCASE = -abcdefghijklmnopqrstuvwxyz
|
|
UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}}
|
|
CFLAGS += -DCONTIKI=1 -DCONTIKI_TARGET_$(TARGET_UPPERCASE)=1
|
|
|
|
MODULES += core/sys core/dev core/lib
|
|
|
|
# Include IPv6, IPv4, and/or Rime
|
|
|
|
HAS_STACK = 0
|
|
ifeq ($(CONTIKI_WITH_IPV4),1)
|
|
HAS_STACK = 1
|
|
CFLAGS += -DNETSTACK_CONF_WITH_IPV4=1
|
|
MODULES += core/net/ipv4 core/net/ip
|
|
endif
|
|
|
|
# Make IPv6 the default stack
|
|
ifeq ($(HAS_STACK),0)
|
|
ifneq ($(CONTIKI_WITH_IPV6),0)
|
|
CONTIKI_WITH_IPV6 = 1
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONTIKI_WITH_IPV6),1)
|
|
CFLAGS += -DNETSTACK_CONF_WITH_IPV6=1
|
|
ifneq ($(CONTIKI_WITH_RPL),0)
|
|
CONTIKI_WITH_RPL = 1
|
|
endif
|
|
MODULES += core/net/ipv6 core/net/ip
|
|
endif
|
|
|
|
ifeq ($(CONTIKI_WITH_RPL),1)
|
|
CFLAGS += -DUIP_CONF_IPV6_RPL=1
|
|
MODULES += core/net/rpl
|
|
else
|
|
CFLAGS += -DUIP_CONF_IPV6_RPL=0
|
|
endif
|
|
|
|
CONTIKI_SOURCEFILES += $(CONTIKIFILES)
|
|
|
|
CONTIKIDIRS += ${addprefix $(CONTIKI)/core/,dev lib net net/mac \
|
|
net/rpl sys cfs . }
|
|
|
|
oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}}
|
|
|
|
CONTIKI_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(CONTIKI_SOURCEFILES)}}
|
|
|
|
PROJECT_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(PROJECT_SOURCEFILES)}}
|
|
|
|
# Provide way to create $(OBJECTDIR) if it has been removed by make clean
|
|
$(OBJECTDIR):
|
|
mkdir $@
|
|
|
|
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
|
|
|
|
### Include application makefiles
|
|
|
|
ifdef APPS
|
|
APPDS = ${wildcard ${foreach DIR, $(APPDIRS), ${addprefix $(DIR)/, $(APPS)}}} \
|
|
${wildcard ${addprefix $(CONTIKI)/apps/, $(APPS)} \
|
|
${addprefix $(CONTIKI)/drivers/platform/$(TARGET)/apps/, $(APPS)} \
|
|
$(APPS)}
|
|
APPINCLUDES = ${foreach APP, $(APPS), ${wildcard ${foreach DIR, $(APPDS), $(DIR)/Makefile.$(APP)}}}
|
|
-include $(APPINCLUDES)
|
|
APP_SOURCES = ${foreach APP, $(APPS), $($(APP)_src)}
|
|
CONTIKI_SOURCEFILES += $(APP_SOURCES)
|
|
endif
|
|
|
|
### Include target makefile (TODO Unsafe?)
|
|
|
|
target_makefile := $(wildcard $(CONTIKI)/drivers/platform/$(TARGET)/Makefile.$(TARGET) ${foreach TDIR, $(TARGETDIRS), $(TDIR)/$(TARGET)/Makefile.$(TARGET)})
|
|
|
|
# Check if the target makefile exists, and create the object directory if necessary.
|
|
ifeq ($(strip $(target_makefile)),)
|
|
${error The target platform "$(TARGET)" does not exist (maybe it was misspelled?)}
|
|
else
|
|
ifneq (1, ${words $(target_makefile)})
|
|
${error More than one TARGET Makefile found: $(target_makefile)}
|
|
endif
|
|
include $(target_makefile)
|
|
endif
|
|
|
|
ifdef MODULES
|
|
UNIQUEMODULES = $(call uniq,$(MODULES))
|
|
MODULEDIRS = ${wildcard ${addprefix $(CONTIKI)/, $(UNIQUEMODULES)}}
|
|
MODULES_SOURCES = ${foreach d, $(MODULEDIRS), ${subst ${d}/,,${wildcard $(d)/*.c}}}
|
|
CONTIKI_SOURCEFILES += $(MODULES_SOURCES)
|
|
APPDS += $(MODULEDIRS)
|
|
endif
|
|
|
|
### Verbosity control. Use make V=1 to get verbose builds.
|
|
|
|
ifeq ($(V),1)
|
|
TRACE_CC =
|
|
TRACE_LD =
|
|
TRACE_AR =
|
|
TRACE_AS =
|
|
Q=
|
|
else
|
|
TRACE_CC = @echo " CC " $<
|
|
TRACE_LD = @echo " LD " $@
|
|
TRACE_AR = @echo " AR " $@
|
|
TRACE_AS = @echo " AS " $<
|
|
Q=@
|
|
endif
|
|
|
|
### Forward comma-separated list of arbitrary defines to the compiler
|
|
|
|
COMMA := ,
|
|
CFLAGS += ${addprefix -D,${subst $(COMMA), ,$(DEFINES)}}
|
|
|
|
### Setup directory search path for source and header files
|
|
|
|
CONTIKI_TARGET_DIRS_CONCAT = ${addprefix ${dir $(target_makefile)}, \
|
|
$(CONTIKI_TARGET_DIRS)}
|
|
CONTIKI_CPU_DIRS_CONCAT = ${addprefix $(CONTIKI_CPU)/, \
|
|
$(CONTIKI_CPU_DIRS)}
|
|
CONTIKI_DRIVERS_DIRS = ${addprefix $(CONTIKI)/, drivers}
|
|
|
|
SOURCEDIRS = . $(PROJECTDIRS) $(CONTIKI_TARGET_DIRS_CONCAT) $(CONTIKI_DRIVERS_DIRS) \
|
|
$(CONTIKI_CPU_DIRS_CONCAT) $(CONTIKIDIRS) $(APPDS) $(EXTERNALDIRS) ${dir $(target_makefile)}
|
|
|
|
vpath %.c $(SOURCEDIRS)
|
|
vpath %.S $(SOURCEDIRS)
|
|
|
|
CFLAGS += ${addprefix -I,$(SOURCEDIRS) $(CONTIKI)}
|
|
|
|
### Check for a git repo and pass version if found
|
|
### git.exe in Windows cmd shells may require no stderr redirection
|
|
ifndef RELSTR
|
|
RELSTR:=${shell git --git-dir ${CONTIKI}/.git describe --tags --always}
|
|
endif
|
|
|
|
ifneq ($(RELSTR),)
|
|
CFLAGS += -DCONTIKI_VERSION_STRING=\"Contiki-$(RELSTR)\"
|
|
endif
|
|
|
|
### Automatic dependency generation
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
-include ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \
|
|
$(PROJECT_SOURCEFILES:.c=.d)}
|
|
endif
|
|
|
|
### 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 *~ *core core *.srec \
|
|
*.lst *.map \
|
|
*.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \
|
|
*.ce *.co
|
|
rm -rf $(CLEAN)
|
|
-rm -rf $(OBJECTDIR)
|
|
|
|
distclean: clean
|
|
-rm -f ${addsuffix .$(TARGET),$(CONTIKI_PROJECT)}
|
|
|
|
-include $(CONTIKI)/drivers/platform/$(TARGET)/Makefile.customrules-$(TARGET)
|
|
|
|
ifndef CUSTOM_RULE_C_TO_CE
|
|
%.ce: %.c
|
|
$(TRACE_CC)
|
|
$(Q)$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
|
|
$(STRIP) --strip-unneeded -g -x $@
|
|
endif
|
|
|
|
ifndef CUSTOM_RULE_C_TO_OBJECTDIR_O
|
|
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
|
|
$(TRACE_CC)
|
|
$(Q)$(CC) $(CFLAGS) -MMD -c $< -o $@
|
|
@$(FINALIZE_DEPENDENCY)
|
|
endif
|
|
|
|
ifndef CUSTOM_RULE_S_TO_OBJECTDIR_O
|
|
$(OBJECTDIR)/%.o: %.S | $(OBJECTDIR)
|
|
$(TRACE_AS)
|
|
$(Q)$(AS) $(ASFLAGS) -o $@ $<
|
|
endif
|
|
|
|
ifndef CUSTOM_RULE_C_TO_O
|
|
%.o: %.c
|
|
$(TRACE_CC)
|
|
$(Q)$(CC) $(CFLAGS) -c $< -o $@
|
|
endif
|
|
|
|
|
|
ifndef CUSTOM_RULE_C_TO_CO
|
|
%.co: %.c
|
|
$(TRACE_CC)
|
|
$(Q)$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
|
|
endif
|
|
|
|
ifndef AROPTS
|
|
AROPTS = rcf
|
|
endif
|
|
|
|
ifndef CUSTOM_RULE_ALLOBJS_TO_TARGETLIB
|
|
contiki-$(TARGET).a: $(CONTIKI_OBJECTFILES)
|
|
$(TRACE_AR)
|
|
$(Q)$(AR) $(AROPTS) $@ $^
|
|
endif
|
|
|
|
ifndef LD
|
|
LD = $(CC)
|
|
endif
|
|
|
|
ifndef CUSTOM_RULE_LINK
|
|
%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
|
|
$(TRACE_LD)
|
|
$(Q)$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} \
|
|
${filter %.a,$^} $(TARGET_LIBFILES) -o $@
|
|
endif
|
|
|
|
%.ramprof: %.$(TARGET)
|
|
$(NM) -S -td --size-sort $< | grep -i " [abdrw] " | cut -d' ' -f2,4
|
|
|
|
%.flashprof: %.$(TARGET)
|
|
$(NM) -S -td --size-sort $< | grep -i " [t] " | cut -d' ' -f2,4
|
|
|
|
# Don't treat %.$(TARGET) as an intermediate file because it is
|
|
# in fact the primary target.
|
|
.PRECIOUS: %.$(TARGET)
|
|
|
|
# Cancel the predefined implict rule for compiling and linking
|
|
# a single C source into a binary to force GNU make to consider
|
|
# the match-anything rule below instead.
|
|
%: %.c
|
|
|
|
# Match-anything pattern rule to allow the project makefiles to
|
|
# abstract from the actual binary name. It needs to contain some
|
|
# command in order to be a rule, not just a prerequisite.
|
|
%: %.$(TARGET)
|
|
@
|