source: BLFS/xsl/scripts.xsl@ 924a237

ablfs-more trunk
Last change on this file since 924a237 was 1870b56, checked in by Pierre Labastie <pierre.labastie@…>, 3 years ago

Ensure that MAKE_TERM(OUT|ERR) are unset

Some packages use those variables to determine whether they are
talking to a terminal, and issue color codes that mess our
logs if the top level make has been launched from a terminal.

  • Property mode set to 100644
File size: 38.9 KB
RevLine 
[e576789]1<?xml version="1.0"?>
2
3<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4 xmlns:exsl="http://exslt.org/common"
5 extension-element-prefixes="exsl"
6 version="1.0">
7
8<!-- XSLT stylesheet to create shell scripts from "linear build" BLFS books. -->
9
[c048987]10<!-- parameters and global variables -->
11 <!-- Check whether the book is sysv or systemd -->
[70d73d1]12 <xsl:variable name="rev">
13 <xsl:choose>
14 <xsl:when test="//bookinfo/title/phrase[@revision='systemd']">
15 systemd
16 </xsl:when>
17 <xsl:otherwise>
18 sysv
19 </xsl:otherwise>
20 </xsl:choose>
21 </xsl:variable>
22
[945ccaa]23 <!-- Wrap "root" commands inside a wrapper function, allowing
24 "porg style" package management -->
25 <xsl:param name="wrap-install" select="'n'"/>
[9daa202]26 <xsl:param name="pack-install" select="'$HOME/blfs_root/packInstall.sh'"/>
[945ccaa]27
[67c3df4]28 <!-- list of packages needing stats -->
29 <xsl:param name="list-stat" select="''"/>
30
[dc7fd7b]31 <!-- Remove libtool .la files -->
32 <xsl:param name="del-la-files" select="'y'"/>
33
[e576789]34 <!-- Build as user (y) or as root (n)? -->
35 <xsl:param name="sudo" select="'y'"/>
36
[9daa202]37 <!-- Root of sources directory -->
38 <xsl:param name="src-archive" select="'/sources'"/>
39
40 <!-- Download and archive tarballs to subdirs. Can be 'y' or '',
41 not 'n' -->
42 <xsl:param name="src-subdirs" select="''"/>
43
44 <!-- Root of build directory -->
45 <xsl:param name="build-root" select="'/sources'"/>
46
47 <!-- extract sources and build into subdirs. Can be 'y' or '',
48 not 'n' -->
49 <xsl:param name="build-subdirs" select="''"/>
50
51 <!-- Keep files in the build directory after building. Can be 'y' or '',
52 not 'n' -->
53 <xsl:param name="keep-files" select="''"/>
54
55 <!-- Number of parallel jobs; type integer, not string -->
56 <xsl:param name="jobs" select="0"/>
[dc7fd7b]57<!-- simple instructions for removing .la files. -->
[619b313]58<!-- We'll use the rule that any text output begins with a linefeed if needed
59 so that we do not need to output one at the end-->
[dc7fd7b]60 <xsl:variable name="la-files-instr">
61
62for libdir in /lib /usr/lib $(find /opt -name lib); do
[2969cdf]63 find $libdir -name \*.la \
64 ! -path \*ImageMagick\* \
65 -delete
[619b313]66done</xsl:variable>
[67c3df4]67
[c048987]68 <xsl:variable name="list-stat-norm"
69 select="concat(' ', normalize-space($list-stat),' ')"/>
70
71<!-- To be able to use the single quote in tests -->
72 <xsl:variable name="APOS">'</xsl:variable>
73
74<!-- end parameters and global variables -->
75
[7933ed7]76<!-- include the template for processing screen children of
77 role="install" sect2 -->
78 <xsl:include href="process-install.xsl"/>
[c048987]79
[96d7e44]80<!-- include the template for replaceable tags -->
81 <xsl:include href="process-replaceable.xsl"/>
82
[c048987]83<!--=================== Begin processing ========================-->
[67c3df4]84
[e576789]85 <xsl:template match="/">
[c048987]86 <xsl:apply-templates select="//sect1[@id != 'bootscripts' and
87 @id != 'systemd-units']"/>
[e576789]88 </xsl:template>
89
90<!--=================== Master chunks code ======================-->
91
92 <xsl:template match="sect1">
93
[619b313]94 <!-- Are stat requested for this page? -->
95 <xsl:variable name="want-stats"
96 select="contains($list-stat-norm,
97 concat(' ',@id,' '))"/>
98
[c048987]99 <!-- The file names -->
100 <xsl:variable name="filename" select="@id"/>
[e576789]101
[c048987]102 <!-- The build order -->
103 <xsl:variable name="position" select="position()"/>
104 <xsl:variable name="order">
105 <xsl:choose>
106 <xsl:when test="string-length($position) = 1">
107 <xsl:text>00</xsl:text>
108 <xsl:value-of select="$position"/>
109 </xsl:when>
110 <xsl:when test="string-length($position) = 2">
111 <xsl:text>0</xsl:text>
112 <xsl:value-of select="$position"/>
113 </xsl:when>
114 <xsl:otherwise>
115 <xsl:value-of select="$position"/>
116 </xsl:otherwise>
117 </xsl:choose>
118 </xsl:variable>
[e576789]119
120 <!-- Depuration code -->
[c048987]121 <xsl:message>
122 <xsl:text>SCRIPT is </xsl:text>
123 <xsl:value-of select="concat($order,'-z-',$filename)"/>
124 <xsl:text>&#xA; FTPDIR is </xsl:text>
125 <xsl:value-of select="$filename"/>
126 <xsl:text>&#xA;&#xA;</xsl:text>
127 </xsl:message>
128
129 <!-- Creating the scripts -->
130 <exsl:document href="{$order}-z-{$filename}" method="text">
131 <xsl:text>#!/bin/bash
[eabfc59]132set -e
[9daa202]133# Variables coming from configuration
134export JH_PACK_INSTALL="</xsl:text>
135 <xsl:copy-of select="$pack-install"/>
136 <xsl:text>"
137export JH_SRC_ARCHIVE="</xsl:text>
138 <xsl:copy-of select="$src-archive"/>
139 <xsl:text>"
140export JH_SRC_SUBDIRS="</xsl:text>
141 <xsl:copy-of select="$src-subdirs"/>
142 <xsl:text>"
143export JH_BUILD_ROOT="</xsl:text>
144 <xsl:copy-of select="$build-root"/>
145 <xsl:text>"
146export JH_BUILD_SUBDIRS="</xsl:text>
147 <xsl:copy-of select="$build-subdirs"/>
148 <xsl:text>"
149export JH_KEEP_FILES="</xsl:text>
150 <xsl:copy-of select="$keep-files"/>
151 <xsl:text>"
152</xsl:text>
153 <xsl:choose>
154 <xsl:when test="$cfg-cflags = 'EMPTY'">
155 <xsl:text>unset CFLAGS
156</xsl:text>
157 </xsl:when>
158 <xsl:otherwise>
159 <xsl:text>export CFLAGS="</xsl:text>
160 <xsl:copy-of select="$cfg-cflags"/>
161 <xsl:text>"
162</xsl:text>
163 </xsl:otherwise>
164 </xsl:choose>
165 <xsl:choose>
166 <xsl:when test="$cfg-cxxflags = 'EMPTY'">
167 <xsl:text>unset CXXFLAGS
168</xsl:text>
169 </xsl:when>
170 <xsl:otherwise>
171 <xsl:text>export CXXFLAGS="</xsl:text>
172 <xsl:copy-of select="$cfg-cxxflags"/>
173 <xsl:text>"
174</xsl:text>
175 </xsl:otherwise>
176 </xsl:choose>
177 <xsl:choose>
178 <xsl:when test="$cfg-ldflags = 'EMPTY'">
179 <xsl:text>unset LDFLAGS
[eabfc59]180</xsl:text>
[9daa202]181 </xsl:when>
182 <xsl:otherwise>
183 <xsl:text>export LDFLAGS="</xsl:text>
184 <xsl:copy-of select="$cfg-ldflags"/>
185 <xsl:text>"
186</xsl:text>
187 </xsl:otherwise>
188 </xsl:choose>
189<!-- We use MAKEFLAGS and NINJAJOBS for setting the number of
190 parallel jobs. This supposes that ninja has been build with
191 support for NINJAJOBS in lfs. We'll have to change that code
192 if lfs changes its policy for ninja. -->
193 <xsl:text>export MAKEFLAGS="-j</xsl:text>
194 <xsl:choose>
195 <xsl:when test="$jobs = 0">
196 <xsl:text>$(nproc)"
197</xsl:text>
198 </xsl:when>
199 <xsl:otherwise>
200 <xsl:value-of select="$jobs"/>
201 <xsl:text>"
202</xsl:text>
203 </xsl:otherwise>
204 </xsl:choose>
205 <xsl:choose>
206 <xsl:when test="$jobs = 0">
207 <xsl:text>unset NINJAJOBS
208</xsl:text>
209 </xsl:when>
210 <xsl:otherwise>
211 <xsl:text>export NINJAJOBS="</xsl:text>
212 <xsl:value-of select="$jobs"/>
213 <xsl:text>"
214</xsl:text>
215 </xsl:otherwise>
216 </xsl:choose>
[8fc6a47]217<!-- Unsetting MAKELEVEL is needed for some packages which assume that
[1870b56]218 their top level Makefile is at level zero.
219 Some packages (cmake) use MAKE_TERMOUT and MAKE_TERMERR to determine
220 whether they are talking to a terminal.
221 In our case, stdout/stderr are always redirected, so unset them.-->
[9daa202]222 <xsl:text>unset MAKELEVEL
[1870b56]223unset MAKE_TERMOUT
224unset MAKE_TERMERR
[b0965fa]225<!-- When installing several packages, and profile or profile.d
226 has been modified by a previous package, we need to ensure that
227 the updated profile is used.
228-->if [ -r /etc/profile ]; then source /etc/profile; fi
[9daa202]229# End of environment</xsl:text>
230
[c048987]231 <xsl:choose>
232 <!-- Package page -->
233 <xsl:when test="sect2[@role='package']">
234 <!-- We build in a subdirectory, whose name may be needed
[9daa202]235 if using package management, so
[c048987]236 "export" it -->
[619b313]237 <xsl:text>
238export JH_PKG_DIR=</xsl:text>
[c048987]239 <xsl:value-of select="$filename"/>
240 <xsl:text>
[1fa0dee]241SRC_DIR=${JH_SRC_ARCHIVE}${JH_SRC_SUBDIRS:+/${JH_PKG_DIR}}
242BUILD_DIR=${JH_BUILD_ROOT}${JH_BUILD_SUBDIRS:+/${JH_PKG_DIR}}
[39dc04a]243mkdir -p $SRC_DIR
244mkdir -p $BUILD_DIR
245</xsl:text>
[67c3df4]246
[9daa202]247<!-- If stats are requested, include some definitions and initializations -->
[619b313]248 <xsl:if test="$want-stats">
249 <xsl:text>
250INFOLOG=$(pwd)/info-${JH_PKG_DIR}
[9e0c4b6]251TESTLOG=$(pwd)/test-${JH_PKG_DIR}
[9daa202]252echo MAKEFLAGS: $MAKEFLAGS > $INFOLOG
253echo NINJAJOBS: $NINJAJOBS >> $INFOLOG
[c048987]254: > $TESTLOG
[67c3df4]255PKG_DEST=${BUILD_DIR}/dest
256</xsl:text>
[9daa202]257<!-- in some cases, DESTDIR may have been populated by root -->
258 <xsl:if test="$sudo = 'y'">
259 <xsl:text>sudo </xsl:text>
260 </xsl:if>
261 <xsl:text>rm -rf $PKG_DEST
262</xsl:text>
263 </xsl:if><!-- want-stats -->
[c048987]264 <!-- Download code and build commands -->
[619b313]265 <xsl:apply-templates select="sect2">
266 <xsl:with-param name="want-stats" select="$want-stats"/>
267 </xsl:apply-templates>
[c048987]268 <!-- Clean-up -->
[619b313]269 <xsl:text>
270
271cd $BUILD_DIR
[1fa0dee]272[[ -n "$JH_KEEP_FILES" ]] || </xsl:text>
[c048987]273 <!-- In some case, some files in the build tree are owned
274 by root -->
275 <xsl:if test="$sudo='y'">
276 <xsl:text>sudo </xsl:text>
277 </xsl:if>
[619b313]278 <xsl:text>rm -rf $JH_UNPACKDIR unpacked
279</xsl:text>
[c048987]280 </xsl:when>
281 <!-- Non-package page -->
282 <xsl:otherwise>
283 <xsl:apply-templates select=".//screen" mode="not-pack"/>
284 </xsl:otherwise>
285 </xsl:choose>
[619b313]286 <xsl:text>
287exit
288</xsl:text><!-- include a \n at the end of document-->
[c048987]289 </exsl:document>
[e576789]290 </xsl:template>
291
292<!--======================= Sub-sections code =======================-->
293
294 <xsl:template match="sect2">
[619b313]295 <xsl:param name="want-stats" select="false"/>
[e576789]296 <xsl:choose>
[c048987]297
[e576789]298 <xsl:when test="@role = 'package'">
[619b313]299 <xsl:text>
300cd $SRC_DIR</xsl:text>
[642722f]301 <!-- Download information is in bridgehead tags -->
[e576789]302 <xsl:apply-templates select="bridgehead[@renderas='sect3']"/>
[c048987]303 </xsl:when><!-- @role="package" -->
304
[967b819]305 <xsl:when test="@role = 'qt4-prefix' or @role = 'qt5-prefix'">
[625cb14]306 <xsl:apply-templates select=".//screen[./userinput]"/>
[967b819]307 </xsl:when>
[c048987]308
[0a0b609]309 <xsl:when test="@role = 'installation' and
310 not(preceding-sibling::sect2[@role = 'installation'])">
[e576789]311 <xsl:text>
[39dc04a]312cd $BUILD_DIR
[07f7eff]313find . -maxdepth 1 -mindepth 1 -type d | xargs </xsl:text>
314 <xsl:if test="$sudo='y'">
315 <xsl:text>sudo </xsl:text>
316 </xsl:if>
317 <xsl:text>rm -rf
[67c3df4]318</xsl:text>
[619b313]319 <!-- If stats are requested, insert the start size -->
320 <xsl:if test="$want-stats">
321 <xsl:text>
[59c4761]322echo Start Size: $(sudo du -skx --exclude home $BUILD_DIR) >> $INFOLOG
[67c3df4]323</xsl:text>
324 </xsl:if>
325
[619b313]326 <xsl:text>
327case $PACKAGE in
[e6967a1]328 *.tar.gz|*.tar.bz2|*.tar.xz|*.tgz|*.tar.lzma)
[39dc04a]329 tar -xvf $SRC_DIR/$PACKAGE &gt; unpacked
[1fa0dee]330 JH_UNPACKDIR=`grep '[^./]\+' unpacked | head -n1 | sed 's@^\./@@;s@/.*@@'`
[6eaae5e]331 ;;
332 *.tar.lz)
[39dc04a]333 bsdtar -xvf $SRC_DIR/$PACKAGE 2&gt; unpacked
[1fa0dee]334 JH_UNPACKDIR=`head -n1 unpacked | cut -d" " -f2 | sed 's@^\./@@;s@/.*@@'`
[67992a0]335 ;;
336 *.zip)
[39dc04a]337 zipinfo -1 $SRC_DIR/$PACKAGE &gt; unpacked
[1fa0dee]338 JH_UNPACKDIR="$(sed 's@/.*@@' unpacked | uniq )"
339 if test $(wc -w &lt;&lt;&lt; $JH_UNPACKDIR) -eq 1; then
[39dc04a]340 unzip $SRC_DIR/$PACKAGE
[67992a0]341 else
[1fa0dee]342 JH_UNPACKDIR=${PACKAGE%.zip}
343 unzip -d $JH_UNPACKDIR $SRC_DIR/$PACKAGE
[67992a0]344 fi
345 ;;
346 *)
[1fa0dee]347 JH_UNPACKDIR=$JH_PKG_DIR-build
348 mkdir $JH_UNPACKDIR
349 cp $SRC_DIR/$PACKAGE $JH_UNPACKDIR
[619b313]350 ADDITIONAL="$(find . -mindepth 1 -maxdepth 1 -type l)"
351 if [ -n "$ADDITIONAL" ]; then
352 cp $ADDITIONAL $JH_UNPACKDIR
353 fi
[67992a0]354 ;;
355esac
[1fa0dee]356export JH_UNPACKDIR
[619b313]357cd $JH_UNPACKDIR
[67992a0]358</xsl:text>
[619b313]359 <!-- If stats are requested, insert the start time -->
360 <xsl:if test="$want-stats">
361 <xsl:text>
362echo Start Time: ${SECONDS} >> $INFOLOG
[67c3df4]363</xsl:text>
364 </xsl:if>
365
[7933ed7]366 <xsl:call-template name="process-install">
367 <xsl:with-param
368 name="instruction-tree"
[625cb14]369 select=".//screen[not(@role = 'nodump') and ./userinput] |
[c048987]370 .//para/command[contains(text(),'check') or
[7933ed7]371 contains(text(),'test')]"/>
[619b313]372 <xsl:with-param name="want-stats" select="$want-stats"/>
[7933ed7]373 <xsl:with-param name="root-seen" select="boolean(0)"/>
374 <xsl:with-param name="install-seen" select="boolean(0)"/>
375 <xsl:with-param name="test-seen" select="boolean(0)"/>
376 <xsl:with-param name="doc-seen" select="boolean(0)"/>
377 </xsl:call-template>
[619b313]378 <xsl:text>
379</xsl:text>
[e576789]380 <xsl:if test="$sudo = 'y'">
381 <xsl:text>sudo /sbin/</xsl:text>
382 </xsl:if>
[619b313]383 <xsl:text>ldconfig</xsl:text>
[c048987]384 </xsl:when><!-- @role="installation" -->
385
[e576789]386 <xsl:when test="@role = 'configuration'">
[619b313]387 <xsl:text>&#xA;</xsl:text>
[625cb14]388 <xsl:apply-templates mode="config"
389 select=".//screen[not(@role = 'nodump') and ./userinput]"/>
[c048987]390 </xsl:when><!-- @role="configuration" -->
391
[e576789]392 </xsl:choose>
393 </xsl:template>
394
395<!--==================== Download code =======================-->
396
[642722f]397 <!-- template for extracting the filename from an url in the form:
398 proto://internet.name/dir1/.../dirn/filename?condition.
399 Needed, because substring-after(...,'/') returns only the
400 substring after the first '/'. -->
[e576789]401 <xsl:template name="package_name">
402 <xsl:param name="url" select="foo"/>
403 <xsl:param name="sub-url" select="substring-after($url,'/')"/>
404 <xsl:choose>
405 <xsl:when test="contains($sub-url,'/')">
406 <xsl:call-template name="package_name">
407 <xsl:with-param name="url" select="$sub-url"/>
408 </xsl:call-template>
409 </xsl:when>
410 <xsl:otherwise>
411 <xsl:choose>
412 <xsl:when test="contains($sub-url,'?')">
413 <xsl:value-of select="substring-before($sub-url,'?')"/>
414 </xsl:when>
415 <xsl:otherwise>
416 <xsl:value-of select="$sub-url"/>
417 </xsl:otherwise>
418 </xsl:choose>
419 </xsl:otherwise>
420 </xsl:choose>
421 </xsl:template>
422
[642722f]423 <!-- Generates the code to download a package, an additional package or
424 a patch. -->
425 <xsl:template name="download-file">
426 <xsl:param name="httpurl" select="''"/>
427 <xsl:param name="ftpurl" select="''"/>
428 <xsl:param name="md5" select="''"/>
429 <xsl:param name="varname" select="''"/>
430 <xsl:variable name="package">
431 <xsl:call-template name="package_name">
432 <xsl:with-param name="url">
[e576789]433 <xsl:choose>
[642722f]434 <xsl:when test="string-length($httpurl) &gt; 10">
435 <xsl:value-of select="$httpurl"/>
[e576789]436 </xsl:when>
437 <xsl:otherwise>
[642722f]438 <xsl:value-of select="$ftpurl"/>
[e576789]439 </xsl:otherwise>
440 </xsl:choose>
[642722f]441 </xsl:with-param>
442 </xsl:call-template>
443 </xsl:variable>
444 <xsl:variable name="first_letter"
445 select="translate(substring($package,1,1),
446 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
447 'abcdefghijklmnopqrstuvwxyz')"/>
448 <xsl:text>&#xA;</xsl:text>
449 <xsl:value-of select="$varname"/>
450 <xsl:text>=</xsl:text>
451 <xsl:value-of select="$package"/>
452 <xsl:text>&#xA;if [[ ! -f $</xsl:text>
453 <xsl:value-of select="$varname"/>
[8dc4646]454 <xsl:text> ]] ; then
[9daa202]455 if [ -f "$JH_SRC_ARCHIVE/$</xsl:text>
[642722f]456 <xsl:value-of select="$varname"/>
[9daa202]457 <xsl:text>" ] ; then&#xA;</xsl:text>
458 <xsl:text> cp "$JH_SRC_ARCHIVE/$</xsl:text>
[642722f]459 <xsl:value-of select="$varname"/>
[9daa202]460 <xsl:text>" "$</xsl:text>
[642722f]461 <xsl:value-of select="$varname"/>
[9daa202]462 <xsl:text>"
[8dc4646]463 else&#xA;</xsl:text>
[342c862]464 <!-- Download from upstream http -->
[642722f]465 <xsl:if test="string-length($httpurl) &gt; 10">
[9daa202]466 <xsl:text> wget -T 30 -t 5 "</xsl:text>
[642722f]467 <xsl:value-of select="$httpurl"/>
[9daa202]468 <xsl:text>" ||&#xA;</xsl:text>
[642722f]469 </xsl:if>
[342c862]470 <!-- Download from upstream ftp -->
[642722f]471 <xsl:if test="string-length($ftpurl) &gt; 10">
[9daa202]472 <xsl:text> wget -T 30 -t 5 "</xsl:text>
[642722f]473 <xsl:value-of select="$ftpurl"/>
[9daa202]474 <xsl:text>" ||&#xA;</xsl:text>
[642722f]475 </xsl:if>
[342c862]476 <!-- The FTP_SERVER mirror as a last resort -->
[9daa202]477 <xsl:text> wget -T 30 -t 5 "${JH_FTP_SERVER}svn/</xsl:text>
[342c862]478 <xsl:value-of select="$first_letter"/>
479 <xsl:text>/$</xsl:text>
480 <xsl:value-of select="$varname"/>
[9daa202]481 <xsl:text>"
[8dc4646]482 fi
[619b313]483fi</xsl:text>
[642722f]484 <xsl:if test="string-length($md5) &gt; 10">
[619b313]485 <xsl:text>
486echo "</xsl:text>
[642722f]487 <xsl:value-of select="$md5"/>
488 <xsl:text>&#x20;&#x20;$</xsl:text>
489 <xsl:value-of select="$varname"/>
[619b313]490 <xsl:text>" | md5sum -c -</xsl:text>
[39dc04a]491 </xsl:if>
492<!-- link additional packages into $BUILD_DIR, because they are supposed to
493 be there-->
494 <xsl:if test="string($varname) != 'PACKAGE'">
[619b313]495 <xsl:text>
[9daa202]496[ "$SRC_DIR" != "$BUILD_DIR" ] &amp;&amp; ln -sf "$SRC_DIR/$</xsl:text>
[39dc04a]497 <xsl:value-of select="$varname"/>
[9daa202]498 <xsl:text>" "$BUILD_DIR"</xsl:text>
[642722f]499 </xsl:if>
[619b313]500 <xsl:text>&#xA;</xsl:text>
[642722f]501 </xsl:template>
502
503 <!-- Extract the MD5 sum information -->
504 <xsl:template match="para" mode="md5">
505 <xsl:choose>
506 <xsl:when test="contains(substring-after(string(),'sum: '),'&#xA;')">
507 <xsl:value-of select="substring-before(substring-after(string(),'sum: '),'&#xA;')"/>
[e576789]508 </xsl:when>
[642722f]509 <xsl:otherwise>
510 <xsl:value-of select="substring-after(string(),'sum: ')"/>
511 </xsl:otherwise>
[e576789]512 </xsl:choose>
513 </xsl:template>
514
[642722f]515 <!-- We have several templates itemizedlist, depending on whether we
516 expect the package information, or additional package(s) or patch(es)
517 information. Select the appropriate mode here. -->
518 <xsl:template match="bridgehead">
[e576789]519 <xsl:choose>
[642722f]520 <!-- Special case for Openjdk -->
521 <xsl:when test="contains(string(),'Source Package Information')">
522 <xsl:apply-templates
523 select="following-sibling::itemizedlist[1]//simplelist">
524 <xsl:with-param name="varname" select="'PACKAGE'"/>
525 </xsl:apply-templates>
526 <xsl:apply-templates select="following-sibling::itemizedlist
527 [preceding-sibling::bridgehead[1]=current()
528 and position() &gt;1]//simplelist">
529 <xsl:with-param name="varname" select="'PACKAGE1'"/>
530 </xsl:apply-templates>
[e576789]531 </xsl:when>
[642722f]532 <!-- Package information -->
533 <xsl:when test="contains(string(),'Package Information')">
534 <xsl:apply-templates select="following-sibling::itemizedlist
535 [preceding-sibling::bridgehead[1]=current()]"
536 mode="package"/>
[e576789]537 </xsl:when>
[642722f]538 <!-- Additional package information -->
[2873df6]539 <!-- special cases for llvm -->
[bfc99d1]540 <xsl:when test="contains(string(),'Recommended Download')">
[2873df6]541 <xsl:apply-templates select="following-sibling::itemizedlist[1]"
542 mode="additional"/>
543 </xsl:when>
[ba57e61]544 <xsl:when test="contains(string(),'Optional Download')">
545 <xsl:apply-templates select="following-sibling::itemizedlist"
546 mode="additional"/>
547 </xsl:when>
548 <!-- All other additional packages have "Additional" -->
[642722f]549 <xsl:when test="contains(string(),'Additional')">
550 <xsl:apply-templates select="following-sibling::itemizedlist"
551 mode="additional"/>
[e576789]552 </xsl:when>
[642722f]553 <!-- Do not do anything if the dev has created another type of
554 bridgehead. -->
555 <xsl:otherwise/>
[e576789]556 </xsl:choose>
557 </xsl:template>
558
[642722f]559 <!-- Call the download code template with appropriate parameters -->
560 <xsl:template match="itemizedlist" mode="package">
561 <xsl:call-template name="download-file">
562 <xsl:with-param name="httpurl">
563 <xsl:value-of select="./listitem[1]/para/ulink/@url"/>
564 </xsl:with-param>
565 <xsl:with-param name="ftpurl">
566 <xsl:value-of select="./listitem/para[contains(string(),'FTP')]/ulink/@url"/>
567 </xsl:with-param>
568 <xsl:with-param name="md5">
569 <xsl:apply-templates select="./listitem/para[contains(string(),'MD5')]"
570 mode="md5"/>
571 </xsl:with-param>
572 <xsl:with-param name="varname" select="'PACKAGE'"/>
573 </xsl:call-template>
[e576789]574 </xsl:template>
575
[642722f]576 <xsl:template match="itemizedlist" mode="additional">
577 <!-- The normal layout is "one listitem"<->"one url", but some devs
578 find amusing to have FTP and/or MD5sum listitems, or to
579 enclose the download information inside a simplelist tag... -->
580 <xsl:for-each select="listitem[.//ulink]">
581 <xsl:choose>
582 <!-- hopefully, there was a HTTP line before -->
583 <xsl:when test="contains(string(./para),'FTP')"/>
584 <xsl:when test=".//simplelist">
585 <xsl:apply-templates select=".//simplelist">
586 <xsl:with-param name="varname" select="'PACKAGE1'"/>
587 </xsl:apply-templates>
588 </xsl:when>
589 <xsl:otherwise>
590 <xsl:call-template name="download-file">
591 <xsl:with-param name="httpurl">
592 <xsl:value-of select="./para/ulink/@url"/>
593 </xsl:with-param>
594 <xsl:with-param name="ftpurl">
595 <xsl:value-of
596 select="following-sibling::listitem[1]/
597 para[contains(string(),'FTP')]/ulink/@url"/>
598 </xsl:with-param>
599 <xsl:with-param name="md5">
600 <xsl:apply-templates
601 select="following-sibling::listitem[position()&lt;3]/
602 para[contains(string(),'MD5')]"
603 mode="md5"/>
604 </xsl:with-param>
605 <xsl:with-param name="varname">
606 <xsl:choose>
607 <xsl:when test="contains(./para/ulink/@url,'.patch')">
608 <xsl:text>PATCH</xsl:text>
609 </xsl:when>
610 <xsl:otherwise>
611 <xsl:text>PACKAGE1</xsl:text>
612 </xsl:otherwise>
613 </xsl:choose>
614 </xsl:with-param>
615 </xsl:call-template>
616 </xsl:otherwise>
617 </xsl:choose>
618 </xsl:for-each>
[e576789]619 </xsl:template>
620
[642722f]621 <!-- the simplelist case. Hopefully, the layout is one member for
622 url, one for md5 and others for various information, that we do not
623 use -->
624 <xsl:template match="simplelist">
625 <xsl:param name="varname" select="'PACKAGE1'"/>
626 <xsl:call-template name="download-file">
627 <xsl:with-param name="httpurl" select=".//ulink/@url"/>
628 <xsl:with-param name="md5">
629 <xsl:value-of select="substring-after(member[contains(string(),'MD5')],'sum: ')"/>
630 </xsl:with-param>
631 <xsl:with-param name="varname" select="$varname"/>
632 </xsl:call-template>
633 </xsl:template>
[625cb14]634
635<!--====================== Non package code =========================-->
636
637 <xsl:template match="screen" mode="not-pack">
638 <xsl:choose>
[6622409]639 <xsl:when test="@role='nodump'"/>
[625cb14]640 <xsl:when test="ancestor::sect1[@id='postlfs-config-vimrc']">
641 <xsl:text>
642cat > ~/.vimrc &lt;&lt;EOF
643</xsl:text>
644 <xsl:apply-templates/>
645 <xsl:text>
646EOF
647</xsl:text>
648 </xsl:when>
649 <xsl:otherwise>
650 <xsl:apply-templates select="." mode="config"/>
651 </xsl:otherwise>
652 </xsl:choose>
653 </xsl:template>
[e576789]654<!--======================== Commands code ==========================-->
[c048987]655<!-- Code for installation instructions is in gen-install.xsl -->
[e576789]656
657 <xsl:template match="screen">
[c048987]658 <xsl:choose>
659<!-- instructions run as root (configuration mainly) -->
660 <xsl:when test="@role = 'root'">
[aeb8539]661<!-- templates begin/end-root are in gen-install.xsl -->
[c048987]662 <xsl:if test="not(preceding-sibling::screen[1][@role='root'])">
[aeb8539]663 <xsl:call-template name="begin-root"/>
[c048987]664 </xsl:if>
665 <xsl:apply-templates mode="root"/>
666 <xsl:if test="not(following-sibling::screen[1][@role='root'])">
[aeb8539]667 <xsl:call-template name="end-root"/>
[c048987]668 </xsl:if>
669 </xsl:when>
[67c3df4]670<!-- then all the instructions run as user -->
[c048987]671 <xsl:otherwise>
672 <xsl:apply-templates select="userinput"/>
673 </xsl:otherwise>
674 </xsl:choose>
[e576789]675 </xsl:template>
676
[8fc6a47]677<!-- Templates for bootscripts/units installation -->
[70d73d1]678 <xsl:template name="set-bootpkg-dir">
679 <xsl:param name="bootpkg" select="'bootscripts'"/>
680 <xsl:param name="url" select="''"/>
[619b313]681 <xsl:text>
682BOOTPKG_DIR=blfs-</xsl:text>
[70d73d1]683 <xsl:copy-of select="$bootpkg"/>
684 <xsl:text>
[619b313]685
[1fa0dee]686BOOTSRC_DIR=${JH_SRC_ARCHIVE}${JH_SRC_SUBDIRS:+/${BOOTPKG_DIR}}
687BOOTBUILD_DIR=${JH_BUILD_ROOT}${JH_BUILD_SUBDIRS:+/${BOOTPKG_DIR}}
[973c767]688mkdir -p $BOOTSRC_DIR
689mkdir -p $BOOTBUILD_DIR
690
691pushd $BOOTSRC_DIR
[e576789]692URL=</xsl:text>
[70d73d1]693 <xsl:value-of select="$url"/>
694 <xsl:text>
[e576789]695BOOTPACKG=$(basename $URL)
[bbcdeab]696if [[ ! -f $BOOTPACKG ]] ; then
[1fa0dee]697 if [[ -f $JH_SRC_ARCHIVE/$BOOTPACKG ]] ; then
698 cp $JH_SRC_ARCHIVE/$BOOTPACKG $BOOTPACKG
[bbcdeab]699 else
700 wget -T 30 -t 5 $URL
701 fi
[973c767]702 rm -f $BOOTBUILD_DIR/unpacked
[bbcdeab]703fi
704
[973c767]705cd $BOOTBUILD_DIR
[e576789]706if [[ -e unpacked ]] ; then
[f079f8f]707 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
708 if ! [[ -d $BOOTUNPACKDIR ]]; then
[973c767]709 tar -xvf $BOOTSRC_DIR/$BOOTPACKG > unpacked
[f079f8f]710 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
[e576789]711 fi
712else
[973c767]713 tar -xvf $BOOTSRC_DIR/$BOOTPACKG > unpacked
[f079f8f]714 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
[e576789]715fi
[619b313]716cd $BOOTUNPACKDIR</xsl:text>
[70d73d1]717 </xsl:template>
718
719 <xsl:template match="screen" mode="config">
720 <xsl:if test="preceding-sibling::para[1]/xref[@linkend='bootscripts']">
[aeb8539]721<!-- if the preceding "screen" tag is role="root", and we are role="root"
722 the end-root has not been called. So do it -->
[619b313]723 <xsl:if
724 test="preceding-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]725 <xsl:call-template name="end-root"/>
726 </xsl:if>
[70d73d1]727 <xsl:call-template name="set-bootpkg-dir">
728 <xsl:with-param name="bootpkg" select="'bootscripts'"/>
729 <xsl:with-param name="url"
730 select="id('bootscripts')//itemizedlist//ulink/@url"/>
731 </xsl:call-template>
[aeb8539]732<!-- if the preceding "screen" tag is role="root", and we are role="root"
733 the begin-root will not be called. So do it -->
[619b313]734 <xsl:if
735 test="preceding-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]736 <xsl:call-template name="begin-root"/>
737 </xsl:if>
[70d73d1]738 </xsl:if>
739 <xsl:if test="preceding-sibling::para[1]/xref[@linkend='systemd-units']">
[aeb8539]740<!-- if the preceding "screen" tag is role="root", and we are role="root"
741 the end-root has not been called. So do it -->
[619b313]742 <xsl:if
743 test="preceding-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]744 <xsl:call-template name="end-root"/>
745 </xsl:if>
[70d73d1]746 <xsl:call-template name="set-bootpkg-dir">
747 <xsl:with-param name="bootpkg" select="'systemd-units'"/>
748 <xsl:with-param name="url"
749 select="id('systemd-units')//itemizedlist//ulink/@url"/>
750 </xsl:call-template>
[aeb8539]751<!-- if the preceding "screen" tag is role="root", and we are role="root"
752 the begin-root will not be called. So do it -->
[619b313]753 <xsl:if
754 test="preceding-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]755 <xsl:call-template name="begin-root"/>
756 </xsl:if>
[e576789]757 </xsl:if>
758 <xsl:apply-templates select='.'/>
[70d73d1]759 <xsl:if test="preceding-sibling::para[1]/xref[@linkend='bootscripts' or
760 @linkend='systemd-units']">
[aeb8539]761<!-- if the next "screen" tag is role="root", and we are role="root"
762 the end-root has not been called. So do it -->
[619b313]763 <xsl:if
764 test="following-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]765 <xsl:call-template name="end-root"/>
766 </xsl:if>
[619b313]767 <xsl:text>
768popd</xsl:text>
[aeb8539]769<!-- if the next "screen" tag is role="root", and we are role="root"
770 the begin-root will not be called. So do it -->
[619b313]771 <xsl:if
772 test="following-sibling::screen[1][@role='root'] and @role='root'">
[aeb8539]773 <xsl:call-template name="begin-root"/>
774 </xsl:if>
[e576789]775 </xsl:if>
776 </xsl:template>
777
[c048987]778 <xsl:template match="command" mode="installation">
[619b313]779 <xsl:param name="want-stats" select="false"/>
[a743e57]780 <xsl:variable name="ns" select="normalize-space(string())"/>
[c048987]781 <xsl:variable name="first"
782 select="not(
783 boolean(
784 preceding-sibling::command[contains(text(),'check') or
785 contains(text(),'test')]))"/>
786 <xsl:variable name="last"
787 select="not(
788 boolean(
789 following-sibling::command[contains(text(),'check') or
790 contains(text(),'test')]))"/>
791 <xsl:choose>
[619b313]792 <xsl:when test="$want-stats">
[c048987]793 <xsl:if test="$first">
[67c3df4]794 <xsl:text>
[619b313]795
[67c3df4]796echo Time after make: ${SECONDS} >> $INFOLOG
[59c4761]797echo Size after make: $(sudo du -skx --exclude home $BUILD_DIR) >> $INFOLOG
[67c3df4]798echo Time before test: ${SECONDS} >> $INFOLOG
[c048987]799
[67c3df4]800</xsl:text>
[c048987]801 </xsl:if>
802 </xsl:when>
803 <xsl:otherwise>
[619b313]804 <xsl:text>
805#</xsl:text>
[c048987]806 </xsl:otherwise>
807 </xsl:choose>
808 <xsl:choose>
809 <xsl:when test="contains($ns,'make')">
810 <xsl:value-of select="substring-before($ns,'make ')"/>
811 <xsl:text>make </xsl:text>
812 <xsl:if test="not(contains($ns,'-k'))">
813 <xsl:text>-k </xsl:text>
814 </xsl:if>
815 <xsl:value-of select="substring-after($ns,'make ')"/>
816 </xsl:when>
817 <xsl:otherwise>
818 <xsl:copy-of select="$ns"/>
819 </xsl:otherwise>
820 </xsl:choose>
[619b313]821 <xsl:if test="$want-stats">
[c048987]822 <xsl:text> &gt;&gt; $TESTLOG 2&gt;&amp;1</xsl:text>
[e576789]823 </xsl:if>
[619b313]824 <xsl:text> || true</xsl:text>
825 <xsl:if test="$want-stats">
[c048987]826 <xsl:text>
[619b313]827
[c048987]828echo Time after test: ${SECONDS} >> $INFOLOG
[59c4761]829echo Size after test: $(sudo du -skx --exclude home $BUILD_DIR) >> $INFOLOG
[c048987]830echo Time before install: ${SECONDS} >> $INFOLOG
831</xsl:text>
832 </xsl:if>
[e576789]833 </xsl:template>
834
[8fc6a47]835 <xsl:template match="userinput|command">
[619b313]836 <xsl:text>
837</xsl:text>
[e576789]838 <xsl:apply-templates/>
839 </xsl:template>
840
[619b313]841 <xsl:template match="userinput" mode="root">
842 <xsl:text>
843</xsl:text>
844 <xsl:apply-templates mode="root"/>
845 </xsl:template>
846
[aeb8539]847 <xsl:template match="text()">
848 <xsl:call-template name="remove-ampersand">
849 <xsl:with-param name="out-string" select="string()"/>
850 </xsl:call-template>
851 </xsl:template>
852
[e576789]853 <xsl:template match="text()" mode="root">
854 <xsl:call-template name="output-root">
855 <xsl:with-param name="out-string" select="string()"/>
856 </xsl:call-template>
857 </xsl:template>
858
859 <xsl:template name="output-root">
860 <xsl:param name="out-string" select="''"/>
861 <xsl:choose>
862 <xsl:when test="contains($out-string,'$') and $sudo = 'y'">
863 <xsl:call-template name="output-root">
864 <xsl:with-param name="out-string"
865 select="substring-before($out-string,'$')"/>
866 </xsl:call-template>
867 <xsl:text>\$</xsl:text>
868 <xsl:call-template name="output-root">
869 <xsl:with-param name="out-string"
870 select="substring-after($out-string,'$')"/>
871 </xsl:call-template>
872 </xsl:when>
873 <xsl:when test="contains($out-string,'`') and $sudo = 'y'">
874 <xsl:call-template name="output-root">
875 <xsl:with-param name="out-string"
876 select="substring-before($out-string,'`')"/>
877 </xsl:call-template>
878 <xsl:text>\`</xsl:text>
879 <xsl:call-template name="output-root">
880 <xsl:with-param name="out-string"
881 select="substring-after($out-string,'`')"/>
882 </xsl:call-template>
883 </xsl:when>
884 <xsl:when test="contains($out-string,'\') and $sudo = 'y'">
885 <xsl:call-template name="output-root">
886 <xsl:with-param name="out-string"
887 select="substring-before($out-string,'\')"/>
888 </xsl:call-template>
889 <xsl:text>\\</xsl:text>
890 <xsl:call-template name="output-root">
891 <xsl:with-param name="out-string"
892 select="substring-after($out-string,'\')"/>
893 </xsl:call-template>
894 </xsl:when>
895 <xsl:otherwise>
[aeb8539]896 <xsl:call-template name="remove-ampersand">
897 <xsl:with-param name="out-string" select="$out-string"/>
898 </xsl:call-template>
899<!-- <xsl:value-of select="$out-string"/> -->
[e576789]900 </xsl:otherwise>
901 </xsl:choose>
902 </xsl:template>
903
[67c3df4]904 <xsl:template name="output-destdir">
905 <xsl:apply-templates
906 select="userinput|following-sibling::screen[@role='root']/userinput"
907 mode="destdir"/>
908 <xsl:text>
[619b313]909
[67c3df4]910echo Time after install: ${SECONDS} >> $INFOLOG
[59c4761]911echo Size after install: $(sudo du -skx --exclude home $BUILD_DIR) >> $INFOLOG
[67c3df4]912</xsl:text>
913 </xsl:template>
914
915 <xsl:template match="userinput" mode="destdir">
[8fc6a47]916 <xsl:text>
917</xsl:text>
[67c3df4]918 <xsl:choose>
919 <xsl:when test="./literal">
920 <xsl:call-template name="outputpkgdest">
921 <xsl:with-param name="outputstring" select="text()[1]"/>
922 </xsl:call-template>
923 <xsl:apply-templates select="literal"/>
924 <xsl:call-template name="outputpkgdest">
925 <xsl:with-param name="outputstring" select="text()[2]"/>
926 </xsl:call-template>
927 </xsl:when>
928 <xsl:otherwise>
929 <xsl:call-template name="outputpkgdest">
930 <xsl:with-param name="outputstring" select="string()"/>
931 </xsl:call-template>
932 </xsl:otherwise>
933 </xsl:choose>
934 </xsl:template>
935
936 <xsl:template name="outputpkgdest">
937 <xsl:param name="outputstring" select="'foo'"/>
938 <xsl:choose>
939 <xsl:when test="contains($outputstring,'make ')">
940 <xsl:choose>
941 <xsl:when test="not(starts-with($outputstring,'make'))">
942 <xsl:call-template name="outputpkgdest">
943 <xsl:with-param name="outputstring"
944 select="substring-before($outputstring,'make')"/>
945 </xsl:call-template>
946 <xsl:call-template name="outputpkgdest">
947 <xsl:with-param
948 name="outputstring"
949 select="substring-after($outputstring,
950 substring-before($outputstring,'make'))"/>
951 </xsl:call-template>
952 </xsl:when>
953 <xsl:otherwise>
[619b313]954 <xsl:text>
955make DESTDIR=$PKG_DEST</xsl:text>
[67c3df4]956 <xsl:call-template name="outputpkgdest">
957 <xsl:with-param
958 name="outputstring"
959 select="substring-after($outputstring,'make')"/>
960 </xsl:call-template>
961 </xsl:otherwise>
962 </xsl:choose>
963 </xsl:when>
964 <xsl:when test="contains($outputstring,'ninja install')">
965 <xsl:choose>
966 <xsl:when test="not(starts-with($outputstring,'ninja install'))">
967 <xsl:call-template name="outputpkgdest">
968 <xsl:with-param name="outputstring"
969 select="substring-before($outputstring,'ninja install')"/>
970 </xsl:call-template>
971 <xsl:call-template name="outputpkgdest">
972 <xsl:with-param
973 name="outputstring"
974 select="substring-after($outputstring,
975 substring-before($outputstring,'ninja install'))"/>
976 </xsl:call-template>
977 </xsl:when>
978 <xsl:otherwise>
[619b313]979 <xsl:text>
980DESTDIR=$PKG_DEST ninja</xsl:text>
[67c3df4]981 <xsl:call-template name="outputpkgdest">
982 <xsl:with-param
983 name="outputstring"
984 select="substring-after($outputstring,'ninja')"/>
985 </xsl:call-template>
986 </xsl:otherwise>
987 </xsl:choose>
988 </xsl:when>
989 <xsl:otherwise> <!-- no make nor ninja in this string -->
990 <xsl:choose>
991 <xsl:when test="contains($outputstring,'&gt;/') and
992 not(contains(substring-before($outputstring,'&gt;/'),' /'))">
[aeb8539]993 <xsl:call-template name="remove-ampersand">
994 <xsl:with-param name="out-string"
995 select="substring-before($outputstring,'&gt;/')"/>
996 </xsl:call-template>
997<!-- <xsl:value-of select="substring-before($outputstring,'&gt;/')"/>-->
[67c3df4]998 <xsl:text>&gt;$PKG_DEST/</xsl:text>
999 <xsl:call-template name="outputpkgdest">
1000 <xsl:with-param name="outputstring" select="substring-after($outputstring,'&gt;/')"/>
1001 </xsl:call-template>
1002 </xsl:when>
1003 <xsl:when test="contains($outputstring,' /')">
[aeb8539]1004 <xsl:call-template name="remove-ampersand">
1005 <xsl:with-param name="out-string"
1006 select="substring-before($outputstring,' /')"/>
1007 </xsl:call-template>
1008<!-- <xsl:value-of select="substring-before($outputstring,' /')"/>-->
[67c3df4]1009 <xsl:text> $PKG_DEST/</xsl:text>
1010 <xsl:call-template name="outputpkgdest">
1011 <xsl:with-param name="outputstring" select="substring-after($outputstring,' /')"/>
1012 </xsl:call-template>
1013 </xsl:when>
1014 <xsl:otherwise>
[aeb8539]1015 <xsl:call-template name="remove-ampersand">
1016 <xsl:with-param name="out-string" select="$outputstring"/>
1017 </xsl:call-template>
1018<!-- <xsl:value-of select="$outputstring"/>-->
[67c3df4]1019 </xsl:otherwise>
1020 </xsl:choose>
1021 </xsl:otherwise>
1022 </xsl:choose>
1023 </xsl:template>
1024
[aeb8539]1025 <xsl:template name="remove-ampersand">
1026 <xsl:param name="out-string" select="''"/>
1027 <xsl:choose>
1028 <xsl:when test="contains($out-string,'&amp;&amp;&#xA;')">
1029 <xsl:variable name="instruction-before">
1030 <xsl:call-template name="last-line">
1031 <xsl:with-param
1032 name="instructions"
1033 select="substring-before($out-string,'&amp;&amp;&#xA;')"/>
1034 </xsl:call-template>
1035 </xsl:variable>
1036 <xsl:call-template name="remove-end-space">
1037 <xsl:with-param
1038 name="instructions"
1039 select="substring-before($out-string,'&amp;&amp;&#xA;')"/>
1040 </xsl:call-template>
1041 <xsl:if test="contains($instruction-before,' ]') or
1042 contains($instruction-before,'test ') or
1043 contains($instruction-before,'pgrep -l')">
1044 <xsl:text> &amp;&amp;</xsl:text>
1045 </xsl:if>
[619b313]1046 <xsl:text>
1047</xsl:text>
[aeb8539]1048 <xsl:call-template name="remove-ampersand">
1049 <xsl:with-param name="out-string"
1050 select="substring-after($out-string,
1051 '&amp;&amp;&#xA;')"/>
1052 </xsl:call-template>
1053 </xsl:when>
1054 <xsl:otherwise>
1055 <xsl:copy-of select="$out-string"/>
1056 </xsl:otherwise>
1057 </xsl:choose>
1058 </xsl:template>
1059
1060 <xsl:template name="last-line">
1061 <xsl:param name="instructions" select="''"/>
1062 <xsl:choose>
1063 <xsl:when test="contains($instructions,'&#xA;')">
1064 <xsl:call-template name="last-line">
1065 <xsl:with-param
1066 name="instructions"
1067 select="substring-after($instructions,'&#xA;')"/>
1068 </xsl:call-template>
1069 </xsl:when>
1070 <xsl:otherwise>
1071 <xsl:copy-of select="normalize-space($instructions)"/>
1072 </xsl:otherwise>
1073 </xsl:choose>
1074 </xsl:template>
1075
1076 <xsl:template name="remove-end-space">
1077 <xsl:param name="instructions" select="''"/>
1078 <xsl:choose>
[619b313]1079 <xsl:when
1080 test="substring($instructions,string-length($instructions))=' '">
[aeb8539]1081 <xsl:call-template name="remove-end-space">
1082 <xsl:with-param
1083 name="instructions"
[619b313]1084 select="substring($instructions,
1085 1,
1086 string-length($instructions)-1)"/>
[aeb8539]1087 </xsl:call-template>
1088 </xsl:when>
1089 <xsl:otherwise>
[619b313]1090 <xsl:copy-of select="$instructions"/>
[aeb8539]1091 </xsl:otherwise>
1092 </xsl:choose>
1093 </xsl:template>
1094
[e576789]1095</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.