summaryrefslogtreecommitdiff
path: root/common/make/ecos.mk
blob: 5c9d70735cda45159a82bb9720d808314eed5141 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
ifneq ($(ECOS),)

# 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

# Ecos packages repository.
ifdef ECOS_REPOSITORY
 $(warning overiding ECOS_REPOSITORY)
endif
override ECOS_REPOSITORY := $(CURDIR)/$(BASE)/ecos/packages
export ECOS_REPOSITORY

# Only include ecos definitions if needed (do not include it if clean or
# *.clean).
ifneq ($(if $(MAKECMDGOALS),$(filter-out \
	%.clean clean,$(MAKECMDGOALS)),default),)
 # Include and filter ecos defined flags.
 -include $(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))
 # -fvtable-gc is known to be broken in all recent GCC.
 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)
 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))

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

 ECOS_CXXFLAGS := $(ECOS_GLOBAL_CFLAGS)
 ECOS_CXXFLAGS := $(subst -Wstrict-prototypes,,$(ECOS_CXXFLAGS))

 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 ($(CROSS_COMPILE),$(ECOS_COMMAND_PREFIX))
  ECOS_MAKEFLAGS := COMMAND_PREFIX=$(CROSS_COMPILE)
 endif
 ECOS_MAKEFLAGS += BASE=$(CURDIR)/$(BASE) OBJ_DIR=$(CURDIR)/$(OBJ_DIR)
else
 # Catch errors.
 TARGET_CC = $(error no ecos definitions included)
 TARGET_CXX = $(error no ecos definitions included)
endif

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_TREE_STAMP)
	@echo MAKE 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 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 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 ecos.defs
	$Q$(MAKE) $(ECOS_MAKEFLAGS) $(ECOS_SILENT) -C $(ECOS_BUILD_DIR) $(CURDIR)/$@

ecos.config: $(ECOS_CONFIG)
$(ECOS_CONFIG): $(ECOS_CONFIG_COMPACT)
	@echo ECOS conf
	mkdir -p $(ECOS_DIR)
	sh -e $< $@

$(ECOS_CONFIG_COV): $(ECOS_CONFIG)
	@echo ECOS 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 $< > $@

$(ECOS_NEW_CONFIG): $(ECOS_NEW_CONFIG_COMPACT)
	@echo ECOS 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.
	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

endif # ifneq ($(ECOS),)