summaryrefslogtreecommitdiff
path: root/cesar/common/make/ecos.mk
blob: 2c6cc6b63b7c6c62272baf5b275937beada77ccc (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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Define ECOS specific machinery.

# Backward compatibility.
TARGET_ECOS ?= $(ECOS)

# Ecos packages repository.
ifdef ECOS_REPOSITORY
 $(warning overiding ECOS_REPOSITORY)
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),)
 $2_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),)
 # Include and filter ecos defined flags.
 -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))
 # -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))
 ECOS_GLOBAL_CFLAGS := $$(filter-out -I%,$$(ECOS_GLOBAL_CFLAGS))

 # Separate C++ flags out from C flags.
 $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))

 $2_ECOS_CXXFLAGS := $$(ECOS_GLOBAL_CFLAGS)
 $2_ECOS_CXXFLAGS := $$(subst -Wstrict-prototypes,,$$($2_ECOS_CXXFLAGS))

 $2_ECOS_LDFLAGS := $$(ECOS_GLOBAL_LDFLAGS)

 # Use ecos defined flags.
 $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.
 $2_CC = $$(error no ecos definitions included)
 $2_CXX = $$(error no ecos definitions included)
endif

# Exports for include paths.
$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.
$$($2_ECOS_NEW_CONFIG_COMPACT): $$($2_ECOS_CONFIG)
	$$(TOOLS_DIR)/compact-ecos-config $$< > $$@

$$($2_ECOS_NEW_CONFIG): $$($2_ECOS_NEW_CONFIG_COMPACT)
	@echo "ECOS [$1] new-conf"
	sh -e $$< $$@

$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

$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),)

endef
$(foreach type,$(filter-out host,$(BUILD_TYPES)),\
$(eval $(call ECOS_template,$(type),$(call type2var,$(type)),$(call type2short,$(type)))))