From 979d492489aac93721f90918efa4ed75250a162b Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Wed, 26 Sep 2012 11:06:55 +0200 Subject: cesar/common/make: add eCos compilation per target, closes #3387 --- cesar/common/make/ecos.mk | 231 +++++++++++++++++--------------- cesar/common/make/func.mk | 9 ++ cesar/common/make/test/clean-output | 8 +- cesar/common/make/test/project/Makefile | 2 +- 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. -- cgit v1.2.3