BLFS: fix generation of install and test instructions (ticket #1721):

- add a gen-install.xsl stylesheet for grouping all cases
- add a mode="installation" attribute for templates
- rewrite sect2 template so that the right templates are applied
- adapt other templates so that they are compatible
- rewording of some comments (no direct relation with the ticket)
This commit is contained in:
Pierre Labastie 2019-04-16 07:30:02 +00:00
parent bc2f5913e6
commit c048987a2c
2 changed files with 412 additions and 187 deletions

257
BLFS/xsl/gen-install.xsl Normal file
View file

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!-- $Id$ -->
<xsl:template match="screen" mode="installation">
<!-- "nature" variables:
- 'non-root': executable as user
- 'config': execute as root, with no special formatting
- 'install': execute as root, with PKG_DEST or escape instructions
- 'none': does not exist (for preceding of following uniquely)
-->
<xsl:variable name="my-nature">
<xsl:choose>
<xsl:when test="not(@role)">
<xsl:text>non-root</xsl:text>
</xsl:when>
<xsl:when test="contains(string(),'useradd') or
contains(string(),'groupadd') or
contains(string(),'usermod') or
contains(string(),'icon-cache') or
contains(string(),'desktop-database') or
contains(string(),'compile-schemas') or
contains(string(),'query-loaders') or
contains(string(),'pam.d') or
contains(string(),'query-immodules')">
<xsl:text>config</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>install</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable
name="prec-string"
select="string(preceding-sibling::screen[not(@role='nodump') and
./userinput][1])"/>
<!--
<xsl:message>
<xsl:text>
==============================
List of preceding siblings for "</xsl:text>
<xsl:value-of select="./userinput"/>
<xsl:text>":
</xsl:text>
<xsl:for-each select="preceding-sibling::screen[not(@role='nodump') and
./userinput] |
preceding-sibling::para/command">
<xsl:copy-of select=".//text()"/>
<xsl:text>
===
</xsl:text>
</xsl:for-each>
</xsl:message>
-->
<xsl:variable name="prec-nature">
<xsl:choose>
<xsl:when
test="$prec-string='' or
(preceding-sibling::screen[not(@role='nodump') and
./userinput] |
preceding-sibling::para/command[contains(text(),'check') or
contains(text(),'test')]
)[last()][self::command]">
<xsl:text>none</xsl:text>
</xsl:when>
<xsl:when
test="preceding-sibling::screen
[not(@role='nodump') and ./userinput][1][not(@role)]">
<xsl:text>non-root</xsl:text>
</xsl:when>
<xsl:when test="contains($prec-string,'useradd') or
contains($prec-string,'groupadd') or
contains($prec-string,'usermod') or
contains($prec-string,'icon-cache') or
contains($prec-string,'desktop-database') or
contains($prec-string,'compile-schemas') or
contains($prec-string,'query-loaders') or
contains($prec-string,'pam.d') or
contains($prec-string,'query-immodules')">
<xsl:text>config</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>install</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable
name="follow-string"
select="string(following-sibling::screen[not(@role='nodump') and
./userinput][1])"/>
<xsl:variable name="follow-nature">
<xsl:choose>
<xsl:when
test="$follow-string='' or
(following-sibling::screen[not(@role='nodump') and
./userinput] |
following-sibling::para/command[contains(text(),'check') or
contains(text(),'test')]
)[1][self::command]">
<xsl:text>none</xsl:text>
</xsl:when>
<xsl:when
test="following-sibling::screen
[not(@role='nodump') and ./userinput][1][not(@role)]">
<xsl:text>non-root</xsl:text>
</xsl:when>
<xsl:when test="contains($follow-string,'useradd') or
contains($follow-string,'groupadd') or
contains($follow-string,'usermod') or
contains($follow-string,'icon-cache') or
contains($follow-string,'desktop-database') or
contains($follow-string,'compile-schemas') or
contains($follow-string,'query-loaders') or
contains($follow-string,'pam.d') or
contains($follow-string,'query-immodules')">
<xsl:text>config</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>install</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$my-nature='non-root'">
<xsl:if test="$prec-nature='install'">
<xsl:call-template name="end-install"/>
<xsl:call-template name="end-root"/>
</xsl:if>
<xsl:if test="$prec-nature='config'">
<xsl:call-template name="end-root"/>
</xsl:if>
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="$my-nature='config'">
<xsl:if test="$prec-nature='none' or $prec-nature='non-root'">
<xsl:call-template name="begin-root"/>
</xsl:if>
<xsl:if test="$prec-nature='install'">
<xsl:call-template name="end-install"/>
</xsl:if>
<xsl:apply-templates mode="root"/>
<xsl:text>
</xsl:text>
<xsl:if test="$follow-nature='none'">
<xsl:call-template name="end-root"/>
</xsl:if>
</xsl:when>
<xsl:when test="$my-nature='install'">
<xsl:if test="$prec-nature='none' or $prec-nature='non-root'">
<xsl:if test="contains($list-stat-norm,
concat(' ',ancestor::sect1/@id,' '))">
<xsl:call-template name="output-destdir"/>
</xsl:if>
<xsl:call-template name="begin-root"/>
<xsl:call-template name="begin-install"/>
</xsl:if>
<xsl:if test="$prec-nature='config'">
<xsl:if test="contains($list-stat-norm,
concat(' ',ancestor::sect1/@id,' '))">
<xsl:call-template name="end-root"/>
<xsl:call-template name="output-destdir"/>
<xsl:call-template name="begin-root"/>
</xsl:if>
<xsl:call-template name="begin-install"/>
</xsl:if>
<xsl:apply-templates mode="install"/>
<xsl:text>
</xsl:text>
<xsl:if test="$follow-nature='none'">
<xsl:call-template name="end-install"/>
<xsl:call-template name="end-root"/>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="begin-root">
<xsl:if test="$sudo='y'">
<xsl:text>sudo -E sh &lt;&lt; ROOT_EOF
</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="begin-install">
<xsl:if test="$wrap-install = 'y'">
<xsl:text>if [ -r "$JH_PACK_INSTALL" ]; then
source $JH_PACK_INSTALL
export -f wrapInstall
export -f packInstall
fi
wrapInstall '
</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="end-root">
<xsl:if test="$sudo='y'">
<xsl:text>ROOT_EOF
</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="end-install">
<xsl:if test="$del-la-files = 'y'">
<xsl:call-template name="output-root">
<xsl:with-param name="out-string" select="$la-files-instr"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$wrap-install = 'y'">
<xsl:text>'&#xA;packInstall&#xA;</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="text()" mode="install">
<xsl:call-template name="output-install">
<xsl:with-param name="out-string" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="output-install">
<xsl:param name="out-string" select="''"/>
<xsl:choose>
<xsl:when test="contains($out-string,string($APOS))
and $wrap-install = 'y'">
<xsl:call-template name="output-root">
<xsl:with-param
name="out-string"
select="substring-before($out-string,string($APOS))"/>
</xsl:call-template>
<xsl:text>'\''</xsl:text>
<xsl:call-template name="output-install">
<xsl:with-param name="out-string"
select="substring-after($out-string,string($APOS))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="output-root">
<xsl:with-param name="out-string" select="."/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

View file

@ -9,7 +9,8 @@
<!-- XSLT stylesheet to create shell scripts from "linear build" BLFS books. -->
<!-- Check whether the book is sysv or systemd -->
<!-- parameters and global variables -->
<!-- Check whether the book is sysv or systemd -->
<xsl:variable name="rev">
<xsl:choose>
<xsl:when test="//bookinfo/title/phrase[@revision='systemd']">
@ -80,18 +81,28 @@ done
</xsl:variable>
<xsl:variable name="list-stat-norm"
<xsl:variable name="list-stat-norm"
select="concat(' ', normalize-space($list-stat),' ')"/>
<!-- To be able to use the single quote in tests -->
<xsl:variable name="APOS">'</xsl:variable>
<!-- end parameters and global variables -->
<!-- include the templates for the screen children of role="install" sect2 -->
<xsl:include href="gen-install.xsl"/>
<!--=================== Begin processing ========================-->
<xsl:template match="/">
<xsl:apply-templates select="//sect1"/>
<xsl:apply-templates select="//sect1[@id != 'bootscripts' and
@id != 'systemd-units']"/>
</xsl:template>
<!--=================== Master chunks code ======================-->
<xsl:template match="sect1">
<xsl:if test="@id != 'bootscripts' and @id != 'systemd-units'">
<!-- The file names -->
<xsl:variable name="filename" select="@id"/>
@ -127,7 +138,7 @@ done
<xsl:text>#!/bin/bash
set -e
unset MAKELEVEL
<!-- the above is needed for some packages -->
</xsl:text>
<xsl:choose>
<!-- Package page -->
@ -152,7 +163,7 @@ TESTLOG=$(pwd)/test-${JH_PKG_DIR}
unset MAKEFLAGS
#MAKEFLAGS=-j4
echo MAKEFLAGS: $MAKEFLAGS > $INFOLOG
> $TESTLOG
: > $TESTLOG
PKG_DEST=${BUILD_DIR}/dest
rm -rf $PKG_DEST
@ -177,23 +188,25 @@ rm -rf $PKG_DEST
</xsl:choose>
<xsl:text>exit</xsl:text>
</exsl:document>
</xsl:if><!-- id!=bootscript or id!=systemd-units -->
</xsl:template>
<!--======================= Sub-sections code =======================-->
<xsl:template match="sect2">
<xsl:choose>
<xsl:when test="@role = 'package'">
<xsl:text>cd $SRC_DIR
</xsl:text>
<!-- Download information is in bridgehead tags -->
<xsl:apply-templates select="bridgehead[@renderas='sect3']"/>
<xsl:text>&#xA;</xsl:text>
</xsl:when>
</xsl:when><!-- @role="package" -->
<xsl:when test="@role = 'qt4-prefix' or @role = 'qt5-prefix'">
<xsl:apply-templates select=".//screen[./userinput]"/>
</xsl:when>
<xsl:when test="@role = 'installation'">
<xsl:text>
cd $BUILD_DIR
@ -248,17 +261,21 @@ cd $JH_UNPACKDIR&#xA;
</xsl:if>
<xsl:apply-templates
mode="installation"
select=".//screen[not(@role = 'nodump') and ./userinput] |
.//para/command"/>
.//para/command[contains(text(),'check') or
contains(text(),'test')]"/>
<xsl:if test="$sudo = 'y'">
<xsl:text>sudo /sbin/</xsl:text>
</xsl:if>
<xsl:text>ldconfig&#xA;&#xA;</xsl:text>
</xsl:when>
</xsl:when><!-- @role="installation" -->
<xsl:when test="@role = 'configuration'">
<xsl:apply-templates mode="config"
select=".//screen[not(@role = 'nodump') and ./userinput]"/>
</xsl:when>
</xsl:when><!-- @role="configuration" -->
</xsl:choose>
</xsl:template>
@ -517,55 +534,11 @@ EOF
</xsl:choose>
</xsl:template>
<!--======================== Commands code ==========================-->
<!-- Code for installation instructions is in gen-install.xsl -->
<xsl:template match="screen">
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
<xsl:choose>
<!-- First the case of installation instructions -->
<xsl:when test="@role = 'root' and
ancestor::sect2[@role='installation'] and
not(contains(string(),'useradd')) and
not(contains(string(),'usermod')) and
not(contains(string(),'icon-cache')) and
not(contains(string(),'desktop-database')) and
not(contains(string(),'compile-schemas')) and
not(contains(string(),'groupadd'))">
<xsl:if test="not(preceding-sibling::screen[1][@role='root'])">
<xsl:if test="contains($list-stat-norm,
concat(' ',
ancestor::sect1/@id,
' '))">
<xsl:call-template name="output-destdir"/>
</xsl:if>
<xsl:if test="$sudo = 'y'">
<xsl:text>sudo -E sh &lt;&lt; ROOT_EOF&#xA;</xsl:text>
</xsl:if>
<xsl:if test="$wrap-install = 'y'">
<xsl:text>if [ -r "$JH_PACK_INSTALL" ]; then
source $JH_PACK_INSTALL
export -f wrapInstall
export -f packInstall
fi
wrapInstall '
</xsl:text>
</xsl:if>
</xsl:if>
<xsl:apply-templates mode="root"/>
<xsl:if test="not(following-sibling::screen[1][@role='root'])">
<xsl:if test="$del-la-files = 'y'">
<xsl:call-template name="output-root">
<xsl:with-param name="out-string" select="$la-files-instr"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$wrap-install = 'y'">
<xsl:text>'&#xA;packInstall</xsl:text>
</xsl:if>
<xsl:if test="$sudo = 'y'">
<xsl:text>&#xA;ROOT_EOF</xsl:text>
</xsl:if>
</xsl:if>
</xsl:when>
<!-- then the case of other instructions run as root (configuration mainly) -->
<!-- instructions run as root (configuration mainly) -->
<xsl:when test="@role = 'root'">
<xsl:if test="not(preceding-sibling::screen[1][@role='root'])">
<xsl:if test="$sudo = 'y'">
@ -585,7 +558,6 @@ wrapInstall '
</xsl:otherwise>
</xsl:choose>
<xsl:text>&#xA;</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="set-bootpkg-dir">
@ -652,18 +624,29 @@ popd</xsl:text>
<xsl:text>&#xA;</xsl:text>
</xsl:template>
<xsl:template match="para/command">
<xsl:template match="command" mode="installation">
<xsl:variable name="ns" select="normalize-space(string())"/>
<xsl:if test="contains($ns,'test') or
contains($ns,'check')">
<xsl:variable name="first"
select="not(
boolean(
preceding-sibling::command[contains(text(),'check') or
contains(text(),'test')]))"/>
<xsl:variable name="last"
select="not(
boolean(
following-sibling::command[contains(text(),'check') or
contains(text(),'test')]))"/>
<xsl:choose>
<xsl:when test="contains($list-stat-norm,
concat(' ',ancestor::sect1/@id,' '))">
<xsl:if test="$first">
<xsl:text>
echo Time after make: ${SECONDS} >> $INFOLOG
echo Size after make: $(sudo du -skx --exclude home /) >> $INFOLOG
echo Time before test: ${SECONDS} >> $INFOLOG
</xsl:text>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:text>#</xsl:text>
@ -687,6 +670,14 @@ echo Time before test: ${SECONDS} >> $INFOLOG
<xsl:text> &gt;&gt; $TESTLOG 2&gt;&amp;1</xsl:text>
</xsl:if>
<xsl:text> || true&#xA;</xsl:text>
<xsl:if test="contains($list-stat-norm,
concat(' ',ancestor::sect1/@id,' ')) and $last">
<xsl:text>
echo Time after test: ${SECONDS} >> $INFOLOG
echo Size after test: $(sudo du -skx --exclude home /) >> $INFOLOG
echo Time before install: ${SECONDS} >> $INFOLOG
</xsl:text>
</xsl:if>
</xsl:template>
@ -700,8 +691,6 @@ echo Time before test: ${SECONDS} >> $INFOLOG
</xsl:call-template>
</xsl:template>
<xsl:variable name="APOS">'</xsl:variable>
<xsl:template name="output-root">
<xsl:param name="out-string" select="''"/>
<xsl:choose>
@ -749,19 +738,6 @@ echo Time before test: ${SECONDS} >> $INFOLOG
select="substring-after($out-string,'\')"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="contains($out-string,string($APOS))
and $wrap-install = 'y'
and ancestor::sect2[@role='installation']">
<xsl:call-template name="output-root">
<xsl:with-param name="out-string"
select="substring-before($out-string,string($APOS))"/>
</xsl:call-template>
<xsl:text>'\''</xsl:text>
<xsl:call-template name="output-root">
<xsl:with-param name="out-string"
select="substring-after($out-string,string($APOS))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$out-string"/>
</xsl:otherwise>
@ -829,14 +805,6 @@ echo Time before test: ${SECONDS} >> $INFOLOG
</xsl:template>
<xsl:template name="output-destdir">
<!-- Hopefully, the current node is the first screen with role equal to root.
We first output stats, since we are only called if stats are needed.
then we output DESTDIR instructions,etc -->
<xsl:text>
echo Time after tests: ${SECONDS} >> $INFOLOG
echo Size after tests: $(sudo du -skx --exclude home /) >> $INFOLOG
echo Time before install: ${SECONDS} >> $INFOLOG
</xsl:text>
<xsl:apply-templates
select="userinput|following-sibling::screen[@role='root']/userinput"
mode="destdir"/>