summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Schodet2012-09-26 11:06:55 +0200
committerNicolas Schodet2012-10-19 15:24:57 +0200
commit979d492489aac93721f90918efa4ed75250a162b (patch)
treed4693d51555d3b11566da992d2f6255d57016a3a
parent6ba3993d4908eac19b260d82f31aac593e2bdaee (diff)
cesar/common/make: add eCos compilation per target, closes #3387
-rw-r--r--cesar/common/make/ecos.mk231
-rw-r--r--cesar/common/make/func.mk9
-rw-r--r--cesar/common/make/test/clean-output8
-rw-r--r--cesar/common/make/test/project/Makefile2
4 files changed, 136 insertions, 114 deletions
diff --git a/cesar/common/make/ecos.mk b/cesar/common/make/ecos.mk
index a4b9f08c84..8e97c14135 100644
--- a/cesar/common/make/ecos.mk
+++ b/cesar/common/make/ecos.mk
@@ -1,27 +1,7 @@
-ifneq ($(ECOS),)
+# Define ECOS specific machinery.
-# Ecos files and directories.
-ECOS_DIR := $(OBJ_DIR)/ecos
-ECOS_INSTALL_DIR := $(ECOS_DIR)/install
-ECOS_BUILD_DIR := $(ECOS_DIR)/build
-ECOS_TREE_STAMP := $(ECOS_DIR)/tree.stamp
-ECOS_HEADERS_STAMP := $(ECOS_DIR)/headers.stamp
-ECOS_DEFS := $(ECOS_INSTALL_DIR)/include/pkgconf/ecos.mak
-ECOS_CONFIG_COMPACT ?= $(if $(VARIANT),$(VARIANT)-)ecos.ecc.sh
-ECOS_CONFIG := $(ECOS_DIR)/ecos.ecc
-ECOS_CONFIG_COV := $(ECOS_CONFIG:%.ecc=%-cov.ecc)
-ECOS_CONFIG_FOR_TREE := $(ECOS_CONFIG)
-ifneq ($(TARGET_COV)$(COV),)
- ECOS_CONFIG_FOR_TREE := $(ECOS_CONFIG_COV)
-endif
-ECOS_NEW_CONFIG_COMPACT := new-ecos.ecc.sh
-ECOS_NEW_CONFIG := new-ecos.ecc
-ECOS_INCLUDE_DIR := $(ECOS_INSTALL_DIR)/include
-ECOS_LIB_DIR := $(ECOS_INSTALL_DIR)/lib
-ECOS_LIB_FILES := vectors.o extras.o libtarget.a
-ECOS_LIBS := $(ECOS_LIB_FILES:%=$(ECOS_LIB_DIR)/%)
-ECOS_LD_SCRIPT := $(ECOS_LIB_DIR)/target.ld
-ECOS_SILENT := -s --no-print-directory
+# Backward compatibility.
+TARGET_ECOS ?= $(ECOS)
# Ecos packages repository.
ifdef ECOS_REPOSITORY
@@ -30,124 +10,157 @@ endif
override ECOS_REPOSITORY := $(CURDIR)/$(BASE)/ecos/packages
export ECOS_REPOSITORY
+# For each target build type, define ECOS machinery.
+# Call with: type, typevar, shorttype
+define ECOS_template
+
+ifneq ($$($2_ECOS),)
+
+# Ecos files and directories.
+$2_ECOS_DIR := $$($2_OBJ_TYPE_DIR)/ecos
+$2_ECOS_INSTALL_DIR := $$($2_ECOS_DIR)/install
+$2_ECOS_BUILD_DIR := $$($2_ECOS_DIR)/build
+$2_ECOS_TREE_STAMP := $$($2_ECOS_DIR)/tree.stamp
+$2_ECOS_HEADERS_STAMP := $$($2_ECOS_DIR)/headers.stamp
+$2_ECOS_DEFS := $$($2_ECOS_INSTALL_DIR)/include/pkgconf/ecos.mak
+$2_ECOS_CONFIG_COMPACT ?= $$(if $$(VARIANT),$$(VARIANT)-)$3ecos.ecc.sh
+$2_ECOS_CONFIG := $$($2_ECOS_DIR)/ecos.ecc
+$2_ECOS_CONFIG_COV := $$($2_ECOS_CONFIG:%.ecc=%-cov.ecc)
+$2_ECOS_CONFIG_FOR_TREE := $$($2_ECOS_CONFIG)
+ifneq ($$($2_COV)$$(COV),)
+ ECOS_CONFIG_FOR_TREE := $$($2_ECOS_CONFIG_COV)
+endif
+$2_ECOS_NEW_CONFIG_COMPACT := $3new-ecos.ecc.sh
+$2_ECOS_NEW_CONFIG := $3new-ecos.ecc
+$2_ECOS_INCLUDE_DIR := $$($2_ECOS_INSTALL_DIR)/include
+$2_ECOS_LIB_DIR := $$($2_ECOS_INSTALL_DIR)/lib
+$2_ECOS_LIB_FILES := vectors.o extras.o libtarget.a
+$2_ECOS_LIBS := $$($2_ECOS_LIB_FILES:%=$$($2_ECOS_LIB_DIR)/%)
+$2_ECOS_LD_SCRIPT := $$($2_ECOS_LIB_DIR)/target.ld
+$2_ECOS_SILENT := -s --no-print-directory
+
# Only include ecos definitions if needed (do not include it if clean or
# *.clean).
-ifneq ($(if $(MAKECMDGOALS),$(filter-out \
- %.clean clean,$(MAKECMDGOALS)),default),)
+ifneq ($$(if $$(MAKECMDGOALS),$$(filter-out \
+ %.clean clean,$$(MAKECMDGOALS)),default),)
# Include and filter ecos defined flags.
- -include $(ECOS_DEFS)
+ -include $$($2_ECOS_DEFS)
endif
ifdef ECOS_GLOBAL_CFLAGS
# GCC since 2.95 does -finit-priority by default so remove it from old HALs.
- ECOS_GLOBAL_CFLAGS := $(subst -finit-priority,,$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(subst -finit-priority,,$$(ECOS_GLOBAL_CFLAGS))
# -fvtable-gc is known to be broken in all recent GCC.
- ECOS_GLOBAL_CFLAGS := $(subst -fvtable-gc,,$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(subst -fvtable-gc,,$$(ECOS_GLOBAL_CFLAGS))
# To support more recent GCC whilst preserving existing behaviour, we need
# to increase the inlining limit globally from the default 600. Note this
# will break GCC 2.95 based tools and earlier. You must use "make OLDGCC=1"
# to avoid this.
- ifneq ($(OLDGCC),1)
- ECOS_GLOBAL_CFLAGS := -finline-limit=7000 $(ECOS_GLOBAL_CFLAGS)
+ ifneq ($$(OLDGCC),1)
+ ECOS_GLOBAL_CFLAGS := -finline-limit=7000 $$(ECOS_GLOBAL_CFLAGS)
endif
# Filter out unwanted options.
- ECOS_GLOBAL_CFLAGS := $(subst -O2,,$(ECOS_GLOBAL_CFLAGS))
- ECOS_GLOBAL_CFLAGS := $(subst -fdata-sections,,$(ECOS_GLOBAL_CFLAGS))
- ECOS_GLOBAL_CFLAGS := $(subst -ffunction-sections,,$(ECOS_GLOBAL_CFLAGS))
- ECOS_GLOBAL_CFLAGS := $(filter-out -I%,$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(subst -O2,,$$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(subst -fdata-sections,,$$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(subst -ffunction-sections,,$$(ECOS_GLOBAL_CFLAGS))
+ ECOS_GLOBAL_CFLAGS := $$(filter-out -I%,$$(ECOS_GLOBAL_CFLAGS))
# Separate C++ flags out from C flags.
- ECOS_CFLAGS := $(ECOS_GLOBAL_CFLAGS)
- ECOS_CFLAGS := $(subst -fno-rtti,,$(ECOS_CFLAGS))
- ECOS_CFLAGS := $(subst -frtti,,$(ECOS_CFLAGS))
- ECOS_CFLAGS := $(subst -Woverloaded-virtual,,$(ECOS_CFLAGS))
- ECOS_CFLAGS := $(subst -fvtable-gc,,$(ECOS_CFLAGS))
+ $2_ECOS_CFLAGS := $$(ECOS_GLOBAL_CFLAGS)
+ $2_ECOS_CFLAGS := $$(subst -fno-rtti,,$$($2_ECOS_CFLAGS))
+ $2_ECOS_CFLAGS := $$(subst -frtti,,$$($2_ECOS_CFLAGS))
+ $2_ECOS_CFLAGS := $$(subst -Woverloaded-virtual,,$$($2_ECOS_CFLAGS))
+ $2_ECOS_CFLAGS := $$(subst -fvtable-gc,,$$($2_ECOS_CFLAGS))
- ECOS_CXXFLAGS := $(ECOS_GLOBAL_CFLAGS)
- ECOS_CXXFLAGS := $(subst -Wstrict-prototypes,,$(ECOS_CXXFLAGS))
+ $2_ECOS_CXXFLAGS := $$(ECOS_GLOBAL_CFLAGS)
+ $2_ECOS_CXXFLAGS := $$(subst -Wstrict-prototypes,,$$($2_ECOS_CXXFLAGS))
- ECOS_LDFLAGS := $(ECOS_GLOBAL_LDFLAGS)
+ $2_ECOS_LDFLAGS := $$(ECOS_GLOBAL_LDFLAGS)
# Use ecos defined flags.
- TARGET_DEFS += -DECOS=1
- TARGET_CFLAGS := $(sort $(TARGET_CFLAGS) $(ECOS_CFLAGS))
- TARGET_CXXFLAGS := $(sort $(TARGET_CXXFLAGS) $(ECOS_CXXFLAGS))
- TARGET_INCLUDES += -I$(ECOS_INCLUDE_DIR)
- TARGET_LDFLAGS := $(sort $(TARGET_LDFLAGS) $(ECOS_LDFLAGS))
- TARGET_LDFLAGS += -L$(ECOS_LIB_DIR) -T$(ECOS_LD_SCRIPT)
- TARGET_COMPILE_DEPS += $(ECOS_HEADERS_STAMP)
- TARGET_LINK_DEPS += $(ECOS_LIBS) $(ECOS_LD_SCRIPT)
- ifneq ($(TARGET_CROSS_COMPILE),$(ECOS_COMMAND_PREFIX))
- ECOS_MAKEFLAGS := COMMAND_PREFIX=$(TARGET_CROSS_COMPILE)
+ $2_DEFS += -DECOS=1
+ $2_CFLAGS := $$(sort $$($2_CFLAGS) $$($2_ECOS_CFLAGS))
+ $2_CXXFLAGS := $$(sort $$($2_CXXFLAGS) $$($2_ECOS_CXXFLAGS))
+ $2_INCLUDES += -I$$($2_ECOS_INCLUDE_DIR)
+ $2_LDFLAGS := $$(sort $$($2_LDFLAGS) $$($2_ECOS_LDFLAGS))
+ $2_LDFLAGS += -L$$($2_ECOS_LIB_DIR) -T$$($2_ECOS_LD_SCRIPT)
+ $2_COMPILE_DEPS += $$($2_ECOS_HEADERS_STAMP)
+ $2_LINK_DEPS += $$($2_ECOS_LIBS) $$($2_ECOS_LD_SCRIPT)
+ ifneq ($$($2_CROSS_COMPILE),$$(ECOS_COMMAND_PREFIX))
+ $2_ECOS_MAKEFLAGS := COMMAND_PREFIX=$$($2_CROSS_COMPILE)
endif
else
# Catch errors.
- TARGET_CC = $(error no ecos definitions included)
- TARGET_CXX = $(error no ecos definitions included)
+ $2_CC = $$(error no ecos definitions included)
+ $2_CXX = $$(error no ecos definitions included)
endif
# Exports for include paths.
-ECOS_MAKEFLAGS += BASE=$(CURDIR)/$(BASE) OBJ_DIR=$(CURDIR)/$(OBJ_DIR) \
- EXTRA_INCLUDES='-I$(CURDIR)/$(OBJ_INC_DIR) -I$(CURDIR)/$(TARGET_OBJ_INC_DIR)'
-
-EXTRA_CLEAN += ecos.clean
-
-.PHONY: ecos.all ecos.headers ecos.tree ecos.config ecos.compact-config ecos.clean
-
-$(ECOS_LIBS) $(ECOS_LD_SCRIPT): ecos.all
-ecos.all: $(ECOS_HEADERS_STAMP)
- @echo "MAKE [target] ecos.all"
- $Q$(MAKE) $(ECOS_MAKEFLAGS) $(ECOS_SILENT) -C $(ECOS_BUILD_DIR)
-
-ecos.headers: $(ECOS_HEADERS_STAMP)
-$(ECOS_HEADERS_STAMP): $(ECOS_TREE_STAMP)
- @echo "MAKE [target] ecos.headers"
- $Q$(MAKE) $(ECOS_MAKEFLAGS) $(ECOS_SILENT) -C $(ECOS_BUILD_DIR) headers
- touch $@
-
-ecos.tree: $(ECOS_TREE_STAMP) ; @:
-$(ECOS_TREE_STAMP): $(ECOS_CONFIG_FOR_TREE)
- @echo "ECOS [target] tree"
- mkdir -p $(ECOS_BUILD_DIR)
- cd $(ECOS_BUILD_DIR) && \
- ecosconfig --config=$(CURDIR)/$(ECOS_CONFIG_FOR_TREE) \
- --prefix=$(CURDIR)/$(ECOS_INSTALL_DIR) tree
- touch $@
-
-$(ECOS_DEFS): $(ECOS_TREE_STAMP)
- @echo "MAKE [target] ecos.defs"
- $Q$(MAKE) $(ECOS_MAKEFLAGS) $(ECOS_SILENT) -C $(ECOS_BUILD_DIR) $(CURDIR)/$@
-
-ecos.config: $(ECOS_CONFIG)
-$(ECOS_CONFIG): $(ECOS_CONFIG_COMPACT)
- @echo "ECOS [target] conf"
- mkdir -p $(ECOS_DIR)
- sh -e $< $@
-
-$(ECOS_CONFIG_COV): $(ECOS_CONFIG)
- @echo "ECOS [target] conf cov"
- cp $< $@
- ecosconfig --config=$(CURDIR)/$@ add CYGPKG_GCOV
+$2_ECOS_MAKEFLAGS += BASE=$$(CURDIR)/$$(BASE) OBJ_DIR=$$(CURDIR)/$$(OBJ_DIR) \
+ EXTRA_INCLUDES='-I$$(CURDIR)/$$(OBJ_INC_DIR) -I$$(CURDIR)/$$($2_OBJ_INC_DIR)'
+
+EXTRA_CLEAN += $1.ecos.clean
+
+.PHONY: $1.ecos.all $1.ecos.headers $1.ecos.tree $1.ecos.config $1.ecos.compact-config $1.ecos.clean
+
+$$($2_ECOS_LIBS) $$($2_ECOS_LD_SCRIPT): $1.ecos.all
+$1.ecos.all: $$($2_ECOS_HEADERS_STAMP)
+ @echo "MAKE [$1] ecos.all"
+ $$Q$$(MAKE) $$($2_ECOS_MAKEFLAGS) $$($2_ECOS_SILENT) -C $$($2_ECOS_BUILD_DIR)
+
+$1.ecos.headers: $$($2_ECOS_HEADERS_STAMP)
+$$($2_ECOS_HEADERS_STAMP): $$($2_ECOS_TREE_STAMP)
+ @echo "MAKE [$1] ecos.headers"
+ $$Q$$(MAKE) $$($2_ECOS_MAKEFLAGS) $$($2_ECOS_SILENT) -C $$($2_ECOS_BUILD_DIR) headers
+ touch $$@
+
+$1.ecos.tree: $$($2_ECOS_TREE_STAMP) ; @:
+$$($2_ECOS_TREE_STAMP): $$($2_ECOS_CONFIG_FOR_TREE)
+ @echo "ECOS [$1] tree"
+ mkdir -p $$($2_ECOS_BUILD_DIR)
+ cd $$($2_ECOS_BUILD_DIR) && \
+ ecosconfig --config=$$(CURDIR)/$$($2_ECOS_CONFIG_FOR_TREE) \
+ --prefix=$$(CURDIR)/$$($2_ECOS_INSTALL_DIR) tree
+ touch $$@
+
+$$($2_ECOS_DEFS): $$($2_ECOS_TREE_STAMP)
+ @echo "MAKE [$1] ecos.defs"
+ $$Q$$(MAKE) $$($2_ECOS_MAKEFLAGS) $$($2_ECOS_SILENT) -C $$($2_ECOS_BUILD_DIR) $$(CURDIR)/$$@
+
+$1.ecos.config: $$($2_ECOS_CONFIG)
+$$($2_ECOS_CONFIG): $$($2_ECOS_CONFIG_COMPACT)
+ @echo "ECOS [$1] conf"
+ mkdir -p $$($2_ECOS_DIR)
+ sh -e $$< $$@
+
+$$($2_ECOS_CONFIG_COV): $$($2_ECOS_CONFIG)
+ @echo "ECOS [$1] conf cov"
+ cp $$< $$@
+ ecosconfig --config=$$(CURDIR)/$$@ add CYGPKG_GCOV
# Generate the compacted ecos configuration.
-$(ECOS_NEW_CONFIG_COMPACT): $(ECOS_CONFIG)
- $(TOOLS_DIR)/compact-ecos-config $< > $@
+$$($2_ECOS_NEW_CONFIG_COMPACT): $$($2_ECOS_CONFIG)
+ $$(TOOLS_DIR)/compact-ecos-config $$< > $$@
-$(ECOS_NEW_CONFIG): $(ECOS_NEW_CONFIG_COMPACT)
- @echo "ECOS [target] new-conf"
- sh -e $< $@
+$$($2_ECOS_NEW_CONFIG): $$($2_ECOS_NEW_CONFIG_COMPACT)
+ @echo "ECOS [$1] new-conf"
+ sh -e $$< $$@
-ecos.compact-config: $(ECOS_NEW_CONFIG)
- -diff $(ECOS_NEW_CONFIG) $(ECOS_CONFIG)
- @echo copy $(ECOS_NEW_CONFIG_COMPACT) to $(ECOS_CONFIG_COMPACT) if satisfied.
+$1.ecos.compact-config: $$($2_ECOS_NEW_CONFIG)
+ -diff $$($2_ECOS_NEW_CONFIG) $$($2_ECOS_CONFIG)
+ @echo copy $$($2_ECOS_NEW_CONFIG_COMPACT) to $$($2_ECOS_CONFIG_COMPACT) if satisfied.
false # Stop make
-ecos.clean:
- rm -rf $(ECOS_TREE_STAMP) $(ECOS_BUILD_DIR)
- rm -rf $(ECOS_HEADERS_STAMP) $(ECOS_INSTALL_DIR)
- rm -f $(ECOS_CONFIG) $(ECOS_CONFIG_COV) $(ECOS_NEW_CONFIG)
- -if [ -d $(ECOS_DIR) ]; then rmdir $(ECOS_DIR); fi
+$1.ecos.clean:
+ rm -rf $$($2_ECOS_TREE_STAMP) $$($2_ECOS_BUILD_DIR)
+ rm -rf $$($2_ECOS_HEADERS_STAMP) $$($2_ECOS_INSTALL_DIR)
+ rm -f $$($2_ECOS_CONFIG) $$($2_ECOS_CONFIG_COV) $$($2_ECOS_NEW_CONFIG)
+ -if [ -d $$($2_ECOS_DIR) ]; then rmdir $$($2_ECOS_DIR); fi
+
+endif # ifneq ($$($2_ECOS),)
-endif # ifneq ($(ECOS),)
+endef
+$(foreach type,$(filter-out host,$(BUILD_TYPES)),\
+$(eval $(call ECOS_template,$(type),$(call type2var,$(type)),$(call type2short,$(type)))))
diff --git a/cesar/common/make/func.mk b/cesar/common/make/func.mk
index 73f70b4f17..a1bf744363 100644
--- a/cesar/common/make/func.mk
+++ b/cesar/common/make/func.mk
@@ -79,6 +79,15 @@ prog2size = $(patsubst %,$(OBJ_DIR)/%.size,$1)
# => TARGET_arm_CC
type2var = $(if $(filter host,$1),HOST,$(if $(filter target,$1),TARGET,$(if $(filter target-%,$1),$(subst -,_,$(subst target,TARGET,$1)),$(error unknown type))))
+# Build type (target or host) to short form
+# $(call type2short,host)
+# => host-
+# $(call type2short,target)
+# =>
+# $(call type2short,target-arm)
+# => arm-
+type2short = $(if $(filter host,$1),host-,$(if $(filter target,$1),,$(if $(filter target-%,$1),$(subst target-,,$1)-,$(error unknown type))))
+
# Find whether a C++ link should be made.
# $(call iscxx,prog), if prog sources include a c++ file
# => _CXX
diff --git a/cesar/common/make/test/clean-output b/cesar/common/make/test/clean-output
index 0abd840d2f..13ee707cd6 100644
--- a/cesar/common/make/test/clean-output
+++ b/cesar/common/make/test/clean-output
@@ -7,10 +7,10 @@ rm -f obj/test_make_ecos.elf obj/test_make_ecos.bin obj/test_make_ecos.rom obj/
rm -f [ target .o and .d files ]
rm -f obj/test_make_target_arm.a
rm -f [ target-arm .o and .d files ]
-rm -rf obj/ecos/tree.stamp obj/ecos/build
-rm -rf obj/ecos/headers.stamp obj/ecos/install
-rm -f obj/ecos/ecos.ecc obj/ecos/ecos-cov.ecc new-ecos.ecc
-if [ -d obj/ecos ]; then rmdir obj/ecos; fi
+rm -rf obj/target/ecos/tree.stamp obj/target/ecos/build
+rm -rf obj/target/ecos/headers.stamp obj/target/ecos/install
+rm -f obj/target/ecos/ecos.ecc obj/target/ecos/ecos-cov.ecc target-new-ecos.ecc
+if [ -d obj/target/ecos ]; then rmdir obj/target/ecos; fi
rm -f obj/inc/dir.stamp obj/host/inc/dir.stamp obj/target/inc/dir.stamp obj/target-arm/inc/dir.stamp obj/host/dir.stamp obj/target/dir.stamp obj/target-arm/dir.stamp obj/dir.stamp
rm -rf
if [ -d obj/inc ]; then rmdir obj/inc; fi; if [ -d obj/host/inc ]; then rmdir obj/host/inc; fi; if [ -d obj/target/inc ]; then rmdir obj/target/inc; fi; if [ -d obj/target-arm/inc ]; then rmdir obj/target-arm/inc; fi; if [ -d obj/host ]; then rmdir obj/host; fi; if [ -d obj/target ]; then rmdir obj/target; fi; if [ -d obj/target-arm ]; then rmdir obj/target-arm; fi; if [ -d obj ]; then rmdir obj; fi;
diff --git a/cesar/common/make/test/project/Makefile b/cesar/common/make/test/project/Makefile
index 81f027ab00..6caed6c201 100644
--- a/cesar/common/make/test/project/Makefile
+++ b/cesar/common/make/test/project/Makefile
@@ -2,8 +2,8 @@ BASE = ../../../..
BUILD_TYPES = host target target-arm
-ECOS = y
TARGET = sparc
+TARGET_ECOS = y
TARGET_arm = arm
# This is an extra include.