5ed69f823f
Our gen-special.sh transforms a dependency on compound packages (xorg7-*) on a dependency on the list of packages. This generates a lot of trials when removing circular dependencies, because if the dependency on xorg7-* is optional, all packages in the list are tried in turn, while it is sure that anyway the dependecy must be eliminated. If the dependency is only on the last package, the circular dep is eliminated at first try.
291 lines
11 KiB
Bash
Executable file
291 lines
11 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
#-------------------------------------------------------------------------
|
|
# generates an xsl stylesheet containing a template for special
|
|
# cases in the book:
|
|
# - If the version does not begin with a number, it is impossible to know
|
|
# where the package name ends and where the version begins. We therefore
|
|
# use the ENTITY at the beginning of the validated full-xml.
|
|
# - If a package is part of a group of xorg packages (proto, fonts, etc)
|
|
# there is no easy way to extract it from the xml. We use the ENTITY at
|
|
# the top of each file x7*.xml
|
|
# - Some non-versioned packages are needed as dependencies of others: we
|
|
# attribute version 1.0.0 to them. It is just used to know if the package
|
|
# is installed, by checking inst-version.
|
|
# - If a package is versioned but the version is not mentioned in the book
|
|
# (currently only udev), we retrieve the version by other means
|
|
#-------------------------------------------------------------------------
|
|
# Arguments:
|
|
# $1 contains the name of the validated xml book
|
|
# $2 contains the name of the ouput xsl file
|
|
# $3 contains the name of the book sources directory
|
|
#-------------------------------------------------------------------------
|
|
|
|
BLFS_XML=$1
|
|
if ! test -f ${BLFS_XML}; then
|
|
echo File \`${BLFS_XML}\' does not exist
|
|
exit 1
|
|
fi
|
|
SPECIAL_FILE=$2
|
|
if test -z "${SPECIAL_FILE}"; then SPECIAL_FILE=specialCases.xsl;fi
|
|
BLFS_DIR=$3
|
|
if test -z "${BLFS_DIR}"; then BLFS_DIR=$(cd $(dirname ${BLFS_XML})/.. ; pwd);fi
|
|
|
|
# Packages whose version does not begin with a number
|
|
EXCEPTIONS=$(grep 'ENTITY.*version[ ]*"[^0-9"&.].*[0-9]' ${BLFS_DIR}/packages.ent |
|
|
sed 's@^[^"]*"\([^"]*\)".*@\1@')
|
|
|
|
# Non-versioned packages:
|
|
NV_LIST="postlfs-config-profile postlfs-config-random postlfs-config-vimrc \
|
|
initramfs xorg-env kde-pre-install-config kf5-intro \
|
|
lxqt-pre-install lxqt-post-install ojdk-conf tex-path"
|
|
|
|
cat >$SPECIAL_FILE << EOF
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
version="1.0">
|
|
|
|
<xsl:template match='*' mode="special">
|
|
<xsl:choose>
|
|
<!-- Although versioned, this page is not a package. But
|
|
the sect2 with id "xorg-env" is referred to at several
|
|
places in the book. We have added it to the list of non
|
|
versioned packages. -->
|
|
<xsl:when test="@id='xorg7'">
|
|
<xsl:apply-templates select="child::sect2" mode="special"/>
|
|
</xsl:when>
|
|
EOF
|
|
|
|
# Non-versionned packages. Add to NV_LIST if you need more.
|
|
for nv_id in $NV_LIST; do
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:when test="@id='$nv_id'">
|
|
<xsl:text> </xsl:text>
|
|
<package><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">$nv_id</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">1.0.0</xsl:element>
|
|
<xsl:if
|
|
test="document(\$installed-packages)//package[name=current()/@id]">
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(\$installed-packages
|
|
)//package[name=current()/@id]/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<!-- Dependencies -->
|
|
<xsl:apply-templates select=".//para[@role='required' or
|
|
@role='recommended' or
|
|
@role='optional']"
|
|
mode="dependency"/>
|
|
<!-- End dependencies -->
|
|
<xsl:text>
 </xsl:text>
|
|
</package><xsl:text>
</xsl:text>
|
|
</xsl:when>
|
|
EOF
|
|
done
|
|
|
|
# Taking packages inside x7proto etc, as versionned modules.
|
|
# We also write a dependency expansion when a dep is of the form
|
|
# xorg7-something. Since that is another template, we need
|
|
# a temporary file, which we shall concatenate at the end
|
|
cat >tmpfile << EOF
|
|
<xsl:template name="expand-deps">
|
|
<xsl:param name="section"/>
|
|
<xsl:param name="status"/>
|
|
<xsl:param name="build"/>
|
|
<xsl:choose>
|
|
EOF
|
|
for file in $(ls ${BLFS_DIR}/x/installing/x7* | grep -v x7driver); do
|
|
id=$(grep xreflabel $file | sed 's@.*id="\([^"]*\).*@\1@')
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:when test="@id='$id'">
|
|
<xsl:text> </xsl:text>
|
|
<package><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">$id</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
EOF
|
|
cat >> tmpfile << EOF
|
|
<xsl:when test="\$section='$id'">
|
|
EOF
|
|
# We extract the list of packages for an xorg page from
|
|
# the version part of the .xml file. Seems that
|
|
# the order is not always the same as in the "cat" command.
|
|
# So we have to read that command too, since it may be assumed
|
|
# that the preceding package is a dependency of the following,
|
|
# except the first.
|
|
list_cat="$(sed -n '/>cat/,/EOF</p' $file | grep -v 'cat\|EOF\|#' |
|
|
awk '{ print $NF }' | sed 's/-&.*//')"
|
|
|
|
# Rationale for the sed below: the following for breaks words at spaces (unless
|
|
# we tweak IFS). So replace spaces with commas in lines so that only newlines
|
|
# are separators.
|
|
for pack in \
|
|
$(grep 'ENTITY.*version' $file | sed 's/[ ]\+/,/g'); do
|
|
packname=$(echo $pack | sed s'@.*ENTITY,\(.*\)-version.*@\1@')
|
|
packversion=$(echo $pack | sed 's@[^"]*"\([^"]*\).*@\1@')
|
|
precpack=NONE
|
|
for i in $list_cat; do
|
|
if [ "$i" = "$packname" ]; then break; fi
|
|
precpack=$i
|
|
done
|
|
# It may happen that packname is not in list_cat, because its entity
|
|
# is commented out in the xml, but we do not check that (too complicated).
|
|
# In that case, the whole list is scanned, and $precpack=$i at the end.
|
|
# when packname is found in the list $precpack!=$i.
|
|
if [ "$precpack" = "$i" ]; then continue; fi
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<module><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">$packname</xsl:element>
|
|
<xsl:element name="version">$packversion</xsl:element>
|
|
<xsl:if test="document(\$installed-packages)//package[name='$packname']">
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(\$installed-packages
|
|
)//package[name='$packname']/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<!-- Dependencies -->
|
|
EOF
|
|
if test $precpack != NONE; then
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">required</xsl:attribute>
|
|
<xsl:attribute name="build">before</xsl:attribute>
|
|
<xsl:attribute name="name">$precpack</xsl:attribute>
|
|
<xsl:attribute name="type">ref</xsl:attribute>
|
|
</xsl:element>
|
|
EOF
|
|
else
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:apply-templates select=".//para[@role='required' or
|
|
@role='recommended' or
|
|
@role='optional']"
|
|
mode="dependency"/>
|
|
EOF
|
|
fi
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<!-- End dependencies -->
|
|
</module>
|
|
EOF
|
|
# cat >> tmpfile << EOF
|
|
# <xsl:element name="dependency">
|
|
# <xsl:attribute name="status">
|
|
# <xsl:value-of select="\$status"/>
|
|
# </xsl:attribute>
|
|
# <xsl:attribute name="build">
|
|
# <xsl:value-of select="\$build"/>
|
|
# </xsl:attribute>
|
|
# <xsl:attribute name="name">$packname</xsl:attribute>
|
|
# <xsl:attribute name="type">ref</xsl:attribute>
|
|
# </xsl:element>
|
|
#EOF
|
|
precpack=$packname
|
|
done
|
|
cat >>$SPECIAL_FILE << EOF
|
|
</package>
|
|
</xsl:when>
|
|
EOF
|
|
cat >> tmpfile << EOF
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">
|
|
<xsl:value-of select="\$status"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="build">
|
|
<xsl:value-of select="\$build"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="name">$packname</xsl:attribute>
|
|
<xsl:attribute name="type">ref</xsl:attribute>
|
|
</xsl:element>
|
|
</xsl:when>
|
|
EOF
|
|
done
|
|
|
|
for ver_ent in $EXCEPTIONS; do
|
|
id=$(grep 'xreflabel=".*'$ver_ent $BLFS_XML | sed 's@.*id="\([^"]*\)".*@\1@')
|
|
[[ -z $id ]] && continue
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:when test="@id='$id'">
|
|
<!-- if there is a sect1 ancestor, we have a module -->
|
|
<xsl:choose>
|
|
<xsl:when test="ancestor::sect1">
|
|
<xsl:text> </xsl:text>
|
|
<module><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">$id</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">$ver_ent</xsl:element>
|
|
<xsl:if
|
|
test="document(\$installed-packages)//package[name=current()/@id]">
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(\$installed-packages
|
|
)//package[name=current()/@id]/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<!-- Dependencies -->
|
|
<xsl:apply-templates select=".//para[@role='required' or
|
|
@role='recommended' or
|
|
@role='optional']"
|
|
mode="dependency"/>
|
|
<!-- End dependencies -->
|
|
<xsl:text>
 </xsl:text>
|
|
</module><xsl:text>
</xsl:text>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:text> </xsl:text>
|
|
<package><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">$id</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">$ver_ent</xsl:element>
|
|
<xsl:if
|
|
test="document(\$installed-packages)//package[name=current()/@id]">
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(\$installed-packages
|
|
)//package[name=current()/@id]/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<!-- Dependencies -->
|
|
<xsl:apply-templates select=".//para[@role='required' or
|
|
@role='recommended' or
|
|
@role='optional']"
|
|
mode="dependency"/>
|
|
<!-- End dependencies -->
|
|
<xsl:text>
 </xsl:text>
|
|
</package><xsl:text>
</xsl:text>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:when>
|
|
EOF
|
|
done
|
|
|
|
cat >>$SPECIAL_FILE << EOF
|
|
<xsl:otherwise>
|
|
<xsl:apply-templates
|
|
select="self::node()[contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')
|
|
]"
|
|
mode="normal"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
EOF
|
|
cat $SPECIAL_FILE tmpfile > tmpfile1
|
|
mv tmpfile1 $SPECIAL_FILE
|
|
rm tmpfile
|
|
cat >> $SPECIAL_FILE << EOF
|
|
<xsl:otherwise>
|
|
<xsl:message>
|
|
<xsl:text>You should not be seeing this</xsl:text>
|
|
</xsl:message>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
</xsl:stylesheet>
|
|
EOF
|