yann@1
|
1 |
# ===========================================================================
|
yann@945
|
2 |
# crosstool-NG genererated config files
|
yann@1
|
3 |
# These targets are used from top-level makefile
|
yann@1
|
4 |
|
yann@926
|
5 |
#-----------------------------------------------------------
|
yann@1001
|
6 |
# List all config files, wether sourced or generated
|
yann@97
|
7 |
|
yann@945
|
8 |
# The top-level config file to be used be configurators
|
yann@945
|
9 |
KCONFIG_TOP = config/config.in
|
yann@945
|
10 |
|
yann@926
|
11 |
# Build the list of all source config files
|
yann@1976
|
12 |
STATIC_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(shell find $(CT_LIB_DIR)/config -type f \( -name '*.in' -o -name '*.in.2' \) 2>/dev/null))
|
yann@926
|
13 |
# ... and how to access them:
|
yann@926
|
14 |
$(STATIC_CONFIG_FILES): config
|
yann@88
|
15 |
|
yann@926
|
16 |
# Build a list of per-component-type source config files
|
yann@1976
|
17 |
ARCH_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/arch/*.in))
|
yann@1976
|
18 |
ARCH_CONFIG_FILES_2 = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/arch/*.in.2))
|
yann@1976
|
19 |
KERNEL_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in))
|
yann@1976
|
20 |
KERNEL_CONFIG_FILES_2 = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/kernel/*.in.2))
|
yann@1976
|
21 |
CC_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in))
|
yann@1976
|
22 |
CC_CONFIG_FILES_2 = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/cc/*.in.2))
|
yann@1976
|
23 |
LIBC_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in))
|
yann@1976
|
24 |
LIBC_CONFIG_FILES_2 = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/libc/*.in.2))
|
yann@1976
|
25 |
DEBUG_CONFIG_FILES = $(patsubst $(CT_LIB_DIR)/%,%,$(wildcard $(CT_LIB_DIR)/config/debug/*.in))
|
yann@182
|
26 |
|
yann@926
|
27 |
# Build the list of generated config files
|
yann@926
|
28 |
GEN_CONFIG_FILES = config.gen/arch.in \
|
yann@926
|
29 |
config.gen/kernel.in \
|
yann@926
|
30 |
config.gen/cc.in \
|
yann@926
|
31 |
config.gen/libc.in \
|
yann@926
|
32 |
config.gen/debug.in
|
yann@926
|
33 |
# ... and how to access them:
|
yann@945
|
34 |
# Generated files depends on config.mk (this file) because it has the
|
yann@926
|
35 |
# functions needed to build the genrated files, and thus they might
|
yann@945
|
36 |
# need re-generation if config.mk changes
|
yann@926
|
37 |
$(GEN_CONFIG_FILES): config.gen \
|
yann@945
|
38 |
$(CT_LIB_DIR)/config/config.mk
|
yann@182
|
39 |
|
yann@945
|
40 |
# Helper entry for the configurators
|
yann@945
|
41 |
PHONY += config_files
|
yann@945
|
42 |
config_files: $(STATIC_CONFIG_FILES) $(GEN_CONFIG_FILES)
|
yann@182
|
43 |
|
yann@926
|
44 |
# Where to access to the source config files from
|
yann@926
|
45 |
config:
|
yann@940
|
46 |
@$(ECHO) " LN config"
|
yann@940
|
47 |
$(SILENT)ln -s $(CT_LIB_DIR)/config config
|
yann@926
|
48 |
|
yann@926
|
49 |
# Where to store the generated config files into
|
yann@926
|
50 |
config.gen:
|
yann@940
|
51 |
@$(ECHO) " MKDIR config.gen"
|
yann@940
|
52 |
$(SILENT)mkdir -p config.gen
|
yann@926
|
53 |
|
yann@926
|
54 |
#-----------------------------------------------------------
|
yann@926
|
55 |
# Build list of per-component-type items to easily build generated files
|
yann@926
|
56 |
|
yann@926
|
57 |
ARCHS = $(patsubst config/arch/%.in,%,$(ARCH_CONFIG_FILES))
|
yann@926
|
58 |
KERNELS = $(patsubst config/kernel/%.in,%,$(KERNEL_CONFIG_FILES))
|
yann@926
|
59 |
CCS = $(patsubst config/cc/%.in,%,$(CC_CONFIG_FILES))
|
yann@926
|
60 |
LIBCS = $(patsubst config/libc/%.in,%,$(LIBC_CONFIG_FILES))
|
yann@926
|
61 |
DEBUGS = $(patsubst config/debug/%.in,%,$(DEBUG_CONFIG_FILES))
|
yann@926
|
62 |
|
yann@926
|
63 |
#-----------------------------------------------------------
|
yann@926
|
64 |
# Helper functions to ease building generated config files
|
yann@926
|
65 |
|
yann@926
|
66 |
# The function 'build_gen_choice_in' builds a choice-menu of a list of
|
yann@926
|
67 |
# components in the given list, also adding source-ing of associazted
|
yann@926
|
68 |
# config files:
|
yann@912
|
69 |
# $1 : destination file
|
yann@912
|
70 |
# $2 : name for the entries family (eg. Architecture, kernel...)
|
yann@912
|
71 |
# $3 : prefix for the choice entries (eg. ARCH, KERNEL...)
|
yann@912
|
72 |
# $4 : base directory containing config files
|
yann@1868
|
73 |
# $5 : generate backend conditionals if Y, don't if anything else
|
yann@1868
|
74 |
# $6 : list of config entries (eg. for architectures: "alpha arm ia64"...,
|
yann@912
|
75 |
# and for kernels: "bare-metal linux"...)
|
yann@912
|
76 |
# Example to build the kernels generated config file:
|
yann@920
|
77 |
# $(call build_gen_choice_in,config.gen/kernel.in,Target OS,KERNEL,config/kernel,$(KERNELS))
|
yann@912
|
78 |
define build_gen_choice_in
|
yann@940
|
79 |
@$(ECHO) ' IN $(1)'
|
yann@1159
|
80 |
$(SILENT)(echo "# $(2) menu"; \
|
yann@1159
|
81 |
echo "# Generated file, do not edit!!!"; \
|
yann@1159
|
82 |
echo ""; \
|
yann@2444
|
83 |
echo "choice GEN_CHOICE_$(3)"; \
|
yann@1159
|
84 |
echo " bool"; \
|
yann@1159
|
85 |
echo " prompt \"$(2)\""; \
|
yann@1159
|
86 |
echo ""; \
|
yann@1868
|
87 |
for entry in $(6); do \
|
yann@1159
|
88 |
file="$(4)/$${entry}.in"; \
|
yann@1159
|
89 |
_entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \
|
yann@1159
|
90 |
echo "config $(3)_$${_entry}"; \
|
yann@1159
|
91 |
echo " bool"; \
|
yann@1269
|
92 |
echo " prompt \"$${entry}\""; \
|
yann@1868
|
93 |
if [ "$(5)" = "Y" ]; then \
|
yann@1877
|
94 |
echo " depends on $(3)_$${_entry}_AVAILABLE"; \
|
yann@1868
|
95 |
fi; \
|
yann@2444
|
96 |
sed -r -e '/^## depends on /!d; s/^## / /;' $${file} 2>/dev/null;\
|
yann@2444
|
97 |
sed -r -e '/^## select /!d; s/^## / /;' $${file} 2>/dev/null; \
|
yann@2445
|
98 |
if grep -E '^## help' $${file} >/dev/null 2>&1; then \
|
yann@2445
|
99 |
echo " help"; \
|
yann@2445
|
100 |
sed -r -e '/^## help ?/!d; s/^## help ?/ /;' $${file} 2>/dev/null; \
|
yann@2445
|
101 |
fi; \
|
yann@1256
|
102 |
echo ""; \
|
yann@1159
|
103 |
done; \
|
yann@1159
|
104 |
echo "endchoice"; \
|
yann@1868
|
105 |
for entry in $(6); do \
|
yann@1159
|
106 |
file="$(4)/$${entry}.in"; \
|
yann@1159
|
107 |
_entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \
|
yann@1159
|
108 |
echo ""; \
|
benoit@2484
|
109 |
if [ "$(5)" = "Y" ]; then \
|
benoit@2484
|
110 |
echo "config $(3)_$${_entry}_AVAILABLE"; \
|
benoit@2484
|
111 |
echo " bool"; \
|
benoit@2484
|
112 |
echo " default y if BACKEND_$(3) = \"$${entry}\" || BACKEND_$(3) = \"\" || ! BACKEND"; \
|
benoit@2484
|
113 |
fi; \
|
yann@1159
|
114 |
echo "if $(3)_$${_entry}"; \
|
yann@1159
|
115 |
echo "config $(3)"; \
|
yann@1159
|
116 |
echo " default \"$${entry}\" if $(3)_$${_entry}"; \
|
yann@1870
|
117 |
echo "source \"$${file}\""; \
|
yann@1159
|
118 |
echo "endif"; \
|
yann@1159
|
119 |
done; \
|
yann@912
|
120 |
) >$(1)
|
yann@1976
|
121 |
$(SILENT)(echo "# $(2) second part options"; \
|
yann@1976
|
122 |
echo "# Generated file, do not edit!!!"; \
|
yann@1976
|
123 |
for entry in $(6); do \
|
yann@1976
|
124 |
file="$(4)/$${entry}.in"; \
|
yann@1976
|
125 |
_entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \
|
yann@1976
|
126 |
if [ -f "$${file}.2" ]; then \
|
yann@1976
|
127 |
echo ""; \
|
yann@1976
|
128 |
echo "if $(3)_$${_entry}"; \
|
yann@1976
|
129 |
echo "comment \"$${entry} other options\""; \
|
yann@1976
|
130 |
echo "source \"$${file}.2\""; \
|
yann@1976
|
131 |
echo "endif"; \
|
yann@1976
|
132 |
fi; \
|
yann@1976
|
133 |
done; \
|
yann@1976
|
134 |
) >$(1).2
|
yann@912
|
135 |
endef
|
yann@628
|
136 |
|
yann@926
|
137 |
# The function 'build_gen_menu_in' builds a menuconfig for each component in
|
yann@926
|
138 |
# the given list, source-ing the associated files conditionnaly:
|
yann@916
|
139 |
# $1 : destination file
|
yann@916
|
140 |
# $2 : name of entries family (eg. Tools, Debug...)
|
yann@1854
|
141 |
# $3 : prefix for the menu entries (eg. DEBUG)
|
yann@916
|
142 |
# $4 : base directory containing config files
|
yann@1854
|
143 |
# $5 : list of config entries (eg. for debug: "dmalloc duma gdb"...)
|
yann@1854
|
144 |
# Example to build the generated debug config file:
|
yann@1854
|
145 |
# $(call build_gen_menu_in,config.gen/debug.in,Debug,DEBUG,config/debug,$(DEBUGS))
|
yann@916
|
146 |
define build_gen_menu_in
|
yann@940
|
147 |
@$(ECHO) ' IN $(1)'
|
yann@1159
|
148 |
$(SILENT)(echo "# $(2) facilities menu"; \
|
yann@1159
|
149 |
echo "# Generated file, do not edit!!!"; \
|
yann@1159
|
150 |
echo ""; \
|
yann@1159
|
151 |
for entry in $(5); do \
|
yann@1159
|
152 |
file="$(4)/$${entry}.in"; \
|
yann@1159
|
153 |
_entry=$$(echo "$${entry}" |$(sed) -r -s -e 's/[-.+]/_/g;'); \
|
yann@1159
|
154 |
echo "menuconfig $(3)_$${_entry}"; \
|
yann@1159
|
155 |
echo " bool"; \
|
yann@1269
|
156 |
echo " prompt \"$${entry}\""; \
|
yann@2444
|
157 |
sed -r -e '/^## depends on /!d; s/^## / /;' $${file} 2>/dev/null;\
|
yann@2444
|
158 |
sed -r -e '/^## select /!d; s/^## / /;' $${file} 2>/dev/null; \
|
yann@2445
|
159 |
if grep -E '^## help' $${file} >/dev/null 2>&1; then \
|
yann@2445
|
160 |
echo " help"; \
|
yann@2445
|
161 |
sed -r -e '/^## help ?/!d; s/^## help ?/ /;' $${file} 2>/dev/null; \
|
yann@2445
|
162 |
fi; \
|
yann@2444
|
163 |
echo ""; \
|
yann@1159
|
164 |
echo "if $(3)_$${_entry}"; \
|
yann@1870
|
165 |
echo "source \"$${file}\""; \
|
yann@1159
|
166 |
echo "endif"; \
|
yann@1159
|
167 |
echo ""; \
|
yann@1159
|
168 |
done; \
|
yann@916
|
169 |
) >$(1)
|
yann@916
|
170 |
endef
|
yann@916
|
171 |
|
yann@926
|
172 |
#-----------------------------------------------------------
|
yann@926
|
173 |
# The rules for the generated config files
|
yann@916
|
174 |
|
yann@1976
|
175 |
# WARNING! If a .in file disapears between two runs, that will NOT be detected!
|
yann@1976
|
176 |
|
yann@1976
|
177 |
config.gen/arch.in: $(ARCH_CONFIG_FILES) $(ARCH_CONFIG_FILES_2)
|
yann@1868
|
178 |
$(call build_gen_choice_in,$@,Target Architecture,ARCH,config/arch,Y,$(ARCHS))
|
yann@861
|
179 |
|
yann@1976
|
180 |
config.gen/kernel.in: $(KERNEL_CONFIG_FILES) $(KERNEL_CONFIG_FILES_2)
|
yann@1868
|
181 |
$(call build_gen_choice_in,$@,Target OS,KERNEL,config/kernel,Y,$(KERNELS))
|
yann@182
|
182 |
|
yann@1976
|
183 |
config.gen/cc.in: $(CC_CONFIG_FILES) $(CC_CONFIG_FILES_2)
|
yann@1868
|
184 |
$(call build_gen_choice_in,$@,C compiler,CC,config/cc,,$(CCS))
|
yann@926
|
185 |
|
yann@1976
|
186 |
config.gen/libc.in: $(LIBC_CONFIG_FILES) $(LIBC_CONFIG_FILES_2)
|
yann@1878
|
187 |
$(call build_gen_choice_in,$@,C library,LIBC,config/libc,Y,$(LIBCS))
|
yann@926
|
188 |
|
yann@926
|
189 |
config.gen/debug.in: $(DEBUG_CONFIG_FILES)
|
yann@926
|
190 |
$(call build_gen_menu_in,$@,Debug,DEBUG,config/debug,$(DEBUGS))
|
yann@926
|
191 |
|
yann@926
|
192 |
#-----------------------------------------------------------
|
yann@926
|
193 |
# Cleaning up the mess...
|
yann@926
|
194 |
|
yann@1
|
195 |
clean::
|
yann@940
|
196 |
@$(ECHO) " CLEAN config"
|
yann@940
|
197 |
$(SILENT)rm -f config 2>/dev/null || true
|
yann@940
|
198 |
@$(ECHO) " CLEAN config.gen"
|
yann@940
|
199 |
$(SILENT)rm -rf config.gen
|