summaryrefslogtreecommitdiffstats
path: root/doc/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'doc/Makefile')
-rw-r--r--doc/Makefile374
1 files changed, 374 insertions, 0 deletions
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..2149730
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,374 @@
1#2017-04-13 Created first version of virtualization profile
2
3#Path to this subsystem's root directory
4SUBSYSROOT := $(shell pwd)
5
6# NOTE: MANIFESTHASH in manifest_conf.mk needs to be the final release tag before a release
7# The manifest_conf.mk defines MANIFESTHASH and MANIFESTURL and PROFILE_NAME(on front+footers)
8include manifest_conf.mk
9MANIFESTDIR := $(shell echo "$(MANIFESTURL)" | sed 's/.*\///;s/\.git//')
10
11# Further down we extract the list of target manifest file names from the manifest itself
12
13
14
15# ***************** Generic docbuild.git auto-clone + s_docbuild symlink ***
16# This also defines TMPCLONEROOT which optionally can be nondefault using BOOK_GLOBALCLONEROOT=yes or a path
17include init.mk
18
19TMPCLONEROOT_MANIFEST := $(TMPCLONEROOT)/manifest
20
21
22# ******************* AutoGenerated chapter from template and target READMEs *******
23BUILDBOOT_XML := book-enea-linux-release-info/doc/build_boot_generated.xml
24BUILDBOOT_TEMPLATE := book-enea-linux-release-info/doc/build_boot_template.xml
25
26PKGDIFF_GEN_XML := book-enea-linux-release-info/doc/pkgdiff_generated.xml
27JIRA_ISSUES_GEN_XML := book-enea-linux-release-info/doc/jiraissues_generated.xml
28
29MACHINE_LIST_XML := book-enea-linux-release-info/doc/machine_list_generated.xml
30
31ELTF_PARAMS_TEMPLATE := book-enea-linux-release-info/doc/eltf_params_template.xml
32ELTF_PARAMS_UPDATED := book-enea-linux-release-info/doc/eltf_params_updated.xml
33
34
35
36# -----------------------------------------------------
37#Path to DocBook make files and templates
38DOCBOOKMAKE = $(SUBSYSROOT)/s_docbuild/docmake
39DOCBOOKTEMPLATE = $(SUBSYSROOT)/s_docbuild/template
40
41#Path to the OLINK database including leading part of file name (will add -$(FORMAT).db)
42DOCBOOKOLINKDB_BASE = $(SUBSYSROOT)/s_docbuild/olinkdb/olink-targetdb-master
43
44DOCBOOK_OLINKS ?= yes
45DOCBOOK_FO_USEFOP ?= yes
46DOCBOOK_TO_BOOKDIR ?= yes
47DOCBOOK_CLEANTMP ?= yes
48
49#Components (books) in this subsystem. Now use all books found here
50# COMPONENTS := book-enea-linux-release-info book-enea-linux-open-source
51# COMPONENTS += book-enea-linux-eclipse-open-source (as of 13.04.2017 this is not needed)
52COMPONENTS := $(shell ls -d book-enea* )
53
54# --------------------------------------------------------------
55ifeq ($(VERBOSE),yes)
56VERB :=
57else
58VERB := @
59endif
60MAKEFLAGS += --no-print-directory
61MAKEFLAGS += --directory $(SUBSYSROOT)
62MAKEFLAGS += --no-builtin-rules --no-builting-variables
63
64# Skip xml validation to make it possible to include xml files with unresolved links
65VALIDATE = no
66
67# BL_LABEL is either given on make command line or using BOOK_VER which have defaults below or a timestamp
68
69# ******************************************************************
70
71# Export all parameters including those on the command line
72export
73
74.PHONY: doc books docusage init initbuild initmanifest initpardoc initbuildboot dist
75
76
77docusage:
78 @echo 'make docusage #Shows this help text'
79 @echo ' DOCBOOK_TOOLS_VERSIONS=yes #Displays./testeltfver.sh DocBook tools versions in this machine'
80 @echo 'make doc #Builds doc. ALSO automatically does all inits if needed'
81 @echo 'make dist BOOK_DIST_DIR=xx/doc #Builds doc as above and copies results to BOOK_DIST_DIR'
82 @echo ' # Does not work with DOCBOOK_TO_BOOKDIR or BOOK_BUILD_DIR'
83# @echo ' BOOK_DIST_ECLIPSE=yes #Currently EclipseHelp formated doc will not be in BOOK_DIST_DIR'
84 @echo ' # unless BOOK_DIST_ECLIPSE is set to yes'
85 @echo 'make init #Init all needed init* below'
86 @echo 'make initbuild #Init s_docbuild Docbook build system and central files'
87 @echo 'make initmanifest #Init s_manifest by cloning, to detect which targets are included'
88 @echo 'make initpardoc #Init s_docsrc_common with extracted parameters/'
89 @echo 'make initbuildboot #Init build_boot chapter from READMEs and template in release info'
90 @echo 'make initissues #Init known issues section from Jira'
91 @echo 'make eltf #Test - displays all ELTF_xxx variables that ELTF shall replace'
92 @echo ' MANIFESTHASH=xxxxx #Option for all inits above to use nondefault manifest version'
93 @echo ' #It shall either be ref/tags/<tagvalue> or a hashvalue'
94 @echo ' #Configured tag or hashvalue $(MANIFESTHASH)'
95 @echo ' #Configured MANIFESTURL $(MANIFESTURL)'
96 @echo ' #Configured PROFILE_NAME $(PROFILE_NAME)'
97 @echo ' DOCBOOK_CLEANTMP=no #Option to keep temp files in doc/ and tmp/'
98 @echo ' BOOK_GLOBALCLONEROOT=yes #Option for all init above to clone all outside the doc directory'
99 @echo ' BOOK_GLOBALCLONEROOT=otherpath #Option for all init above to clone all to given path'
100 @echo 'make clean #Clean results and all s_*, but not any external clones'
101 @echo ''
102 @echo 'Optional parameters for make doc:'
103 @echo ' COMP=<book-directory> #Component (book) to build. Book component names are book-*'
104 @echo ' #Default component/s:'
105 @echo ' $(COMPONENTS)'
106 @echo ' FORMAT=<format> #One of: pdf, html, or eclipse (Default all are built)'
107 @echo ' BL_LABEL=<baseline> #Becomes footer in book (default: from poky enea.conf MAJORMINOR'
108 @echo ' # and with profile name taken from the manifest repo name)'
109 @echo ' DOCBOOK_TO_BOOKDIR=no #(default yes) Avoid moving result to book directory'
110 @echo ' # and avoid erasing common doc and tmp directories'
111 @echo ' BOOKFORCE=yes #Force rebuilding (ignore dependency on file times or BL_LABEL)'
112 @echo ' # Dependency only works if common doc directory is kept'
113 @echo ' BOOKCONDITION="xx;yy;.." #Include XML elements with condition any of xx or yy'
114 @echo ' # (if rebuilding, BOOKFORCE=yes may be needed)'
115 @echo ' # Empty=only default. none=none, all=everything.'
116 @echo ' BOOKDEFAULTCONDITION #Default conditions, if no BOOKCONDITION. Used in book-*/swcomp.mk'
117 @echo ' SHOW_COMMENTS=yes #For proofread. Unhide <remark>..</remark> comments Only PDF'
118 @echo ' BOOKVERBOSE=yes #Verbose info building books'
119 @echo ' DOCBOOK_OLINKS=no #Avoid the olink database in Makefile (in book not using it)'
120 @echo ' DOCBOOK_OLINK_TARGETDB=only #Build a target db for this book (for links into it)'
121 @echo ' DOCBOOK_OLINK_TARGETDB=yes #Build a target db AND build the book'
122 @echo ' #Master olinkdb defined in this Makefile, one per generated format, is:'
123 @echo ' $(DOCBOOKOLINKDB_BASE)_*.db'
124 @echo ' Typical examples:'
125 @echo ' make doc Creates all books, all formats'
126 @echo ' make doc COMP=book-xxxx FORMAT=html'
127 @echo ' make doc COMP=book-xxxx FORMAT=pdf'
128 @echo ' make doc BL_LABEL="Version 1.2.3" Creates all with version in footers and front'
129 @echo ''
130 @echo ' Requires docbook-xsl-1.76.1 or later, docbook-xml 4.2, svg1.1, fop-1.0 + fop-hyph.jar'
131 @echo ' fop + the separate fop-hyph can be found together in package "libfop-java"'
132 @echo ' otherwise fetch fop-hyph.jar and place in same place as fop.jar'
133 @echo ' Requires libxml2-2.7.8 or later, libxslt-1.1.26 or later'
134 @echo ' Requires java machine to run fop (creating PDF). jar for optional FORMAT=eclipse'
135 @echo ' Without jar, the optional EclipseHelp format can not be built'
136 @echo ' tools_book_standalone.mk => libxml2, libxslt, and fop (and to catalog-el.xml)'
137 @echo ' catalog-el.xml => svg, docbook-xml, docbook-xsl'
138ifeq ($(DOCBOOK_TOOLS_VERSIONS),yes)
139 $(VERB)$(MAKE) -f $(DOCBOOKMAKE)/tools_book_standalone.mk book_tools_versions
140endif
141
142# We rely on make doing these in order left to right
143init: initbuild initcommon initmanifest initpardoc initbuildboot initpkgdiff initissues
144pullall: pullbuild
145
146# If no COMP, iterate over books-* in COMPONENTS with make doc
147ifeq ($(COMP),)
148doc:
149ifneq ($(filter book-%, $(COMPONENTS)),)
150 $(VERB)for comp in $(filter book-%, $(COMPONENTS)); do \
151 $(MAKE) doc COMP=$$comp; \
152 done
153endif
154
155else
156include $(SUBSYSROOT)/$(COMP)/swcomp.mk
157
158doc: books
159 @#
160endif
161
162dist: doc
163 @echo "Copying resulting built documents to $(BOOK_DIST_DIR)"
164 $(VERB)if [ "$(BOOK_DIST_DIR)" = "" ]; then echo "ERROR: Missing BOOK_DIST_DIR parameter, typically shall be xxx/doc"; exit 10; fi
165 $(VERB)if [ ! -d "`dirname $(BOOK_DIST_DIR)`" ]; then echo "ERROR: Missing parent for BOOK_DIST_DIR"; exit 10; fi
166 $(VERB)if [ -f "$(BOOK_DIST_DIR)/Makefile" ]; then echo "ERROR: Wrong BOOK_DIST_DIR, contains a Makefile?"; exit 10; fi
167 $(VERB)if [ ! -d "$(BOOK_DIST_DIR)" ]; then mkdir -p "$(BOOK_DIST_DIR)" ; fi
168 $(VERB)for book in $(COMPONENTS); do \
169 if ls -d $$book/book*.pdf >/dev/null 2>&1; then cp --preserve=timestamps $$book/book*.pdf "$(BOOK_DIST_DIR)" ; fi ; \
170 if ls -d $$book/html >/dev/null 2>&1; then cp -r --preserve=timestamps $$book/html "$(BOOK_DIST_DIR)" ; fi ; \
171 if [ "$(BOOK_DIST_ECLIPSE)" = "yes" ]; then \
172 if ls -d $$book/eclipse >/dev/null 2>&1; then cp -r --preserve=timestamps $$book/eclipse "$(BOOK_DIST_DIR)" ; fi ; \
173 fi ; \
174 done
175
176# Default FORMATs
177ifeq ($(FORMAT),)
178FORMAT=html pdf eclipse
179endif
180
181
182books: init
183# BOOKPACKAGES is defined in all book-*/swcomp.mk
184 $(VERB)DISTRO_VERSION=`egrep '"EneaLinux_REL_VER"><phrase>' $(ELTF_PARAMS_UPDATED) | sed 's/.*<phrase>//;s/<\/phrase>.*//'` ; \
185 BOOKVER="Profile $(PROFILE_NAME)-$$DISTRO_VERSION" ; \
186 for book in $(BOOKPACKAGES); do \
187 for format in $(FORMAT); do \
188 $(MAKE) -f $(DOCBOOKMAKE)/make_docbook_standalone.mk BOOK=$$book FORMAT=$$format BOOK_VER="$$BOOKVER" books || exit 10; \
189 done ; \
190 done
191ifeq ($(DOCBOOK_TO_BOOKDIR),yes)
192 $(VERB)rm -rf doc tmp
193else
194ifeq ($(DOCBOOK_CLEANTMP),yes)
195# keep only doc/pdf/book-*.pdf doc/eclipse/plugins/com.enea.doc.book-* but delete doc/eclipse/plugins/com.enea.doc.book-*/done*
196 $(VERB)rm -rf tmp 2>/dev/null ; rm -rf doc/pdf/book-*/ ; rm -rf doc/eclipse/plugins/com.enea.doc.book-*/done* 2>/dev/null
197endif
198endif
199
200# cleaninit cleans ALL tmpcommon and all s_*
201clean: cleaninit cleanbuildboot cleanpkgdiff cleanissues cleanmanifest
202 @echo "Cleaning build results and temporary files"
203 $(VERB)rm -rf doc tmp 2>/dev/null
204ifneq ($(filter book-%, $(COMPONENTS)),)
205 $(VERB)for comp in $(filter book-%, $(COMPONENTS)); do \
206 rm -rf $$comp/book*.pdf $$comp/html $$comp/eclipse 2>/dev/null; \
207 done
208 $(VERB)rm -rf doc tmp 2>/dev/null
209endif
210
211
212# ******************************************************************
213# ****************** SUPPORT FOR TARGETS ***************************
214initmanifest: s_manifest
215
216
217# -----------------------------------------
218# We only clone the manifest to be able to autodetect which targets are in it
219# git clone requires only the tag string e.g. EL6, not the entire ref/tags/EL6 that repo requires
220# git clone -b hashvalue is not supported. We must first clone, then git checkout hashvalue
221# These steps work also for a tag so we could use the same stepwise code
222
223s_manifest: $(TMPCLONEROOT_MANIFEST)
224 $(VERB)rm s_manifest 2>/dev/null; ln -s $(TMPCLONEROOT_MANIFEST) s_manifest
225
226cleanmanifest:
227 @echo "Cleaning generated manifest files"
228 $(VERB)rm -f $(MACHINE_LIST_XML) 2>/dev/null
229 $(VERB)rm -rf "$(TMPCLONEROOT_MANIFEST)" s_manifest 2>/dev/null
230
231$(TMPCLONEROOT_MANIFEST):
232 $(VERB)if [ ! -d "$(TMPCLONEROOT)" ] ; then mkdir -p "$(TMPCLONEROOT)" ; fi
233 $(VERB)if [ ! -d "$(TMPCLONEROOT_MANIFEST)" ]; then mkdir -p "$(TMPCLONEROOT_MANIFEST)" ; fi
234 $(VERB) MBRANCH=`echo "$(MANIFESTHASH)" | sed 's/.*\///'`; \
235 echo "**** Cloning manifest version $$MBRANCH of $(MANIFESTURL) in $(TMPCLONEROOT_MANIFEST)" ; \
236 cd "$(TMPCLONEROOT_MANIFEST)"; git clone $(MANIFESTURL) ; cd $(MANIFESTDIR) ; git checkout $(MANIFESTHASH)
237 $(VERB)if [ ! -d "$(TMPCLONEROOT_MANIFEST)/$(MANIFESTDIR)" ]; then echo "ERROR: Missing $(TMPCLONEROOT_MANIFEST)/$(MANIFESTDIR)"; exit 10 ; fi ; \
238 TARGETDEFAULTXMLS=`cd $(TMPCLONEROOT_MANIFEST)/$(MANIFESTDIR); ls -1 */default.xml 2>/dev/null` ; \
239 TARGET_LIST=`echo "$$TARGETDEFAULTXMLS" | sed 's/\/default.xml//;s/^/# export MACHINE=/'` ; \
240 echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" >$(MACHINE_LIST_XML) ; \
241 echo "<!DOCTYPE para PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\"" >>$(MACHINE_LIST_XML) ; \
242 echo "\"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\">" >>$(MACHINE_LIST_XML) ; \
243 echo "<para id=\"machine-list\">" >>$(MACHINE_LIST_XML) ; \
244 echo "<programlisting># Set MACHINE to ONE of the targets in this release!" >>$(MACHINE_LIST_XML) ; \
245 echo "$$TARGET_LIST</programlisting>" >>$(MACHINE_LIST_XML) ; \
246 echo "</para>" >>$(MACHINE_LIST_XML)
247
248
249# ****************************************************************************
250# ******************** SUPPORT FOR dynamic pardoc with added parameters ******
251# pardoc-distro can contain MAJOR.MINOR-xxxxx keeping -xxxx when replacing MINOR.MINOR from enea.conf
252
253PATH_DOCSRC_COMMON = $(SUBSYSROOT)/s_docsrc_common
254NAME_DOCSRC_COMMON = docsrc_common
255TMPCLONEROOT_DOCSRC_COMMON := $(TMPCLONEROOT)/$(NAME_DOCSRC_COMMON)
256TMPPARDOC := $(TMPCLONEROOT_DOCSRC_COMMON)/pardoc-distro.xml
257
258initpardoc: s_docsrc_common
259
260cleanpardoc:
261 @echo "Cleaning dynamic parameters"
262 $(VERB)rm -rf $(TMPCLONEROOT_DOCSRC_COMMON) ; rm s_docsrc_common
263
264
265s_docsrc_common: $(TMPCLONEROOT_DOCSRC_COMMON)
266 $(VERB)rm s_docsrc_common 2>/dev/null; ln -s $(TMPCLONEROOT_DOCSRC_COMMON) s_docsrc_common
267
268$(TMPCLONEROOT_DOCSRC_COMMON):
269 $(VERB)if [ ! -d "$(TMPCLONEROOT)" ] ; then mkdir -p "$(TMPCLONEROOT)" ; fi
270 $(VERB)if [ ! -d $(TMPCLONEROOT_DOCSRC_COMMON) ]; then mkdir -p $(TMPCLONEROOT_DOCSRC_COMMON) ; fi
271 @echo "**** Copy docsrc_common/ files to $(TMPCLONEROOT_DOCSRC_COMMON)"
272 $(VERB)cat docsrc_common/pardoc-distro.xml >$(TMPPARDOC)
273
274# ****************************************************************************
275# ***** Create XML chapter with build/boot commands from all README files in manifest
276
277initbuildboot: $(BUILDBOOT_XML)
278
279cleanbuildboot:
280 @echo "Cleaning generated build-boot command document file"
281 $(VERB)rm -f $(BUILDBOOT_XML) 2>/dev/null
282
283
284$(BUILDBOOT_XML): $(BUILDBOOT_TEMPLATE)
285 @echo "**** Creating $(BUILDBOOT_XML) from READMEs"
286 $(VERB)INITBB_CMD=initbuildboot.sh ; \
287 if [ -f "$$INITBB_CMD" ]; then \
288 sh "$$INITBB_CMD" -xml $(BUILDBOOT_XML) -template $(BUILDBOOT_TEMPLATE) -readmebasedir s_manifest/$(MANIFESTDIR); \
289 else \
290 echo "ERROR: Missing $$INITBB_CMD, can not create $(BUILDBOOT_XML)"; exit 10; \
291 fi
292
293# ****************************************************************************
294# ***** Create Package DIFF XML section
295
296initpkgdiff: $(PKGDIFF_GEN_XML)
297
298cleanpkgdiff:
299 @echo "Cleaning generated package diff document file"
300 $(VERB)rm -f $(PKGDIFF_GEN_XML) 2>/dev/null
301
302$(PKGDIFF_GEN_XML):
303 $(VERB)PREVIOUS_BL=`egrep '"prev_baseline"' docsrc_common/pardoc-distro.xml | sed 's/^.*<phrase>//;s/<\/phrase>.*$$//'` ; \
304 echo "**** Generating $(PKGDIFF_GEN_XML) compared to $$PREVIOUS_BL, using gen_pkgdiff.py" ; \
305 python gen_pkgdiff.py >$(PKGDIFF_GEN_XML)
306
307
308# ****************************************************************************
309# ***** Create Jira Issues XML section for the known bugs chapter
310
311.PHONY: $(JIRA_ISSUES_GEN_XML)
312# We want new issue list to be generated also at build, not only at init
313
314initissues: $(JIRA_ISSUES_GEN_XML)
315
316
317cleanissues:
318 @echo "Cleaning generated known issues document file"
319 $(VERB)rm -f $(JIRA_ISSUES_GEN_XML) 2>/dev/null
320
321$(JIRA_ISSUES_GEN_XML):
322 @echo "**** Generating $(JIRA_ISSUES_GEN_XML), fetching from Jira using gen_known_issues.py"
323 $(VERB)python gen_known_issues.py >$(JIRA_ISSUES_GEN_XML)
324
325# ****************************************************************************
326
327#
328# All ELTF_ variables names only has upper case, underline and digits
329eltf:
330 @echo "# make eltf extracts and displays all ELTF_ variables found here"
331 @echo "# in $(SUBSYSROOT)/$(ELTF_PARAMS_TEMPLATE)"
332 @echo "# Replace all variables, creating a new eltf*updated.xml file from the eltf*template.xml"
333 @echo "#"
334 @echo "# Only replace + push the result file $(ELTF_PARAMS_UPDATED), IF IT WILL BE CHANGED."
335 @echo "#"
336 @echo "# IMPORTANT: See eltf_params_updated_template_how_to_use.txt for requirements and details!"
337 @echo "# Below is only a summary!"
338 @echo "#"
339 @echo "# ELTF_ variables must be UNIQUE, e.g. a variable must not be a part of another variable"
340 @echo "#"
341 @echo "# ELTF_PL_* and ELTF_T_PL_* shall have the format for programlisting and are often multiline - see below."
342 @echo "#"
343 @echo "# ELTF_*_URL and ELTF_*_TXTURL are the URL part and TXT part of ulink; those shall be exactly identical,"
344 @echo "# unless the URL is very very long."
345 @echo "#"
346 @echo "# ELTF_T_* are target (MACHINE) variables in one subsection, replace with machine specific strings."
347 @echo "#"
348 @echo "# Append more target subsections to *updated.xml, if more than one target is in a release!"
349 @echo "# Replace the line <!-- ELTFADD_MORE_TARGET_SECTIONS_BELOW_IF_NEEDED --> with appended"
350 @echo "# complete target section elements copied before the variables are replaced."
351 @echo "# In each target section, replace the ELTF_T* variables with machine dependent strings"
352 @echo "# Append final lines seen after <!-- ELTFADD_MORE_TARGET_SECTIONS_BELOW_IF_NEEDED -->"
353 @echo "# but that would often only be two final </section> </section> lines"
354 @echo "#"
355 @echo "# ELTF_ Variables: Replace each variable with a string, for ELTF_*PL* it can be multiline"
356 @echo "# DO NOT use any leading or trailing spaces and DO NOT use TABs"
357 @echo "#"
358 @echo "# ELTF_ Everywhere: Only 7-bit ASCII inside the string replacing a variable. Translate characters"
359 @echo "# like & < > to &amp; &lt; &gt; etc."
360 @echo "# unless real XML shall be inserted like when entire sections are appended."
361 @echo "#"
362 @echo "# ELTF_ programlisting, variables with PL in the name: Max line length < 80 char."
363 @echo "# Use backslash + indent-leading-spaces for continuation lines."
364 @echo "# Multiline. No trailing spaces on any line inside the programlisting."
365 @echo "#"
366 @echo "# The following variables shall be replaced with suitable contents (egrep from the template):"
367 @echo "# Again: See details in eltf_params_updated_template_how_to_use.txt"
368 @echo "# including also examples of contents of each variable!"
369 @echo "#"
370 $(VERB)( egrep 'ELTF_[A-Z_0-9][A-Z_0-9]*' $(ELTF_PARAMS_TEMPLATE) 2>/dev/null | sed 's/ELTF_/\nELTF_/g' | egrep 'ELTF_[A-Z_0-9][A-Z_0-9]*' | sed 's/\(ELTF_[A-Z_0-9][A-Z_0-9]*\).*/\1/' ) | sort
371 @echo "# The make eltf also here extracts any left-over ELTF variables from $(ELTF_PARAMS_UPDATED)"
372 @echo "# It should not be any left here:"
373 $(VERB)( egrep 'ELTF_[A-Z_0-9][A-Z_0-9]*' $(ELTF_PARAMS_UPDATED) 2>/dev/null | sed 's/ELTF_/\nELTF_/g' | egrep 'ELTF_[A-Z_0-9][A-Z_0-9]*' | sed 's/\(ELTF_[A-Z_0-9][A-Z_0-9]*\).*/\1/' ) | sort
374 @echo "# If you see any left-over above, something is wrong"