2140f22a88
- Even if only required or recommended deps only are requested and built, account for optional deps to build the pacakge order - build "runtime" deps after the pacakge dependening on them, but before any other package - using the "first" role in the book, implement pass1 pacakges when there are circular dependencies - Documentation has still to be written - There must be bugs, thank you for testing...
496 lines
19 KiB
XML
496 lines
19 KiB
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
<!-- $Id$ -->
|
|
<!-- Takes the blfs-full.xml file and extract a list
|
|
of packages obeying packdesc.dtd + looks for already
|
|
installed packages in the tracking file (stringparam
|
|
'installed-packages') -->
|
|
<!-- Extract also a list of LFS packages from stringparam lfs-full -->
|
|
|
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
version="1.0">
|
|
|
|
<xsl:param name="lfs-full" select="'./lfs-xml/lfs-full.xml'"/>
|
|
<xsl:param name="installed-packages" select="'../lib/instpkg.xml'"/>
|
|
|
|
<xsl:output method="xml"
|
|
encoding='ISO-8859-1'
|
|
doctype-system="./packdesc.dtd"/>
|
|
|
|
<!-- specialCases.xsl is generated by a shell script:
|
|
allows for cases where version begins with a letter
|
|
and when there is no version (such as xorg7 packages) -->
|
|
<xsl:include href="./specialCases.xsl"/>
|
|
|
|
<xsl:template match="/">
|
|
<princList>
|
|
<xsl:text>

 </xsl:text>
|
|
<list>
|
|
<xsl:attribute name="id">lfs</xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<name>LFS Packages</name>
|
|
<xsl:text>
 </xsl:text>
|
|
<sublist>
|
|
<xsl:attribute name="id">lfs-6</xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<name>LFS Chapter 6</name>
|
|
<xsl:apply-templates
|
|
select='document($lfs-full)//
|
|
chapter[@id="chapter-building-system"]/
|
|
sect1/sect1info'/>
|
|
<xsl:text>
 </xsl:text>
|
|
</sublist>
|
|
<sublist>
|
|
<xsl:attribute name="id">lfs-8</xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<name>LFS Chapter 8</name>
|
|
<xsl:apply-templates select='document($lfs-full)//chapter[@id="chapter-bootable"]/sect1/sect1info[./productname="linux"]'/>
|
|
<xsl:text>
 </xsl:text>
|
|
</sublist>
|
|
<sublist>
|
|
<xsl:attribute name="id">lfs-9</xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<name>LFS Chapter 9</name>
|
|
<xsl:apply-templates select='document($lfs-full)//sect1[@id="ch-finish-theend"]//userinput[starts-with(string(),"echo")]'/>
|
|
<xsl:text>
 </xsl:text>
|
|
</sublist>
|
|
<xsl:text>

 </xsl:text>
|
|
</list>
|
|
<!-- How to have blfs-bootscripts versionned? Do not know, so
|
|
avoid it (TODO ?) -->
|
|
<xsl:apply-templates select="//part[not(@id='introduction')]"/>
|
|
</princList>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="userinput">
|
|
<!-- Only used in lFS chapter 9, to retrieve book version -->
|
|
<package>
|
|
<name>LFS-Release</name>
|
|
<xsl:element name="version">
|
|
<xsl:copy-of select="substring-after(substring-before(string(),' >'),'echo ')"/>
|
|
</xsl:element>
|
|
<xsl:if
|
|
test="document($installed-packages)//package[name='LFS-Release']">
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(
|
|
$installed-packages
|
|
)//package[name='LFS-Release']/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
</package>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="sect1info">
|
|
<xsl:text> </xsl:text>
|
|
<xsl:choose>
|
|
<!-- Never update linux headers -->
|
|
<xsl:when test="./productname='linux'
|
|
and ancestor::chapter[@id='chapter-building-system']"/>
|
|
<!-- Gcc version is taken from BLFS -->
|
|
<xsl:when test="./productname='gcc'"/>
|
|
<!-- Shadow version is taken from BLFS -->
|
|
<xsl:when test="./productname='shadow'"/>
|
|
<!-- Vim version is taken from BLFS -->
|
|
<xsl:when test="./productname='vim'"/>
|
|
<!-- Dbus version is taken from BLFS -->
|
|
<xsl:when test="./productname='dbus'"/>
|
|
<!-- Systemd version is taken from BLFS -->
|
|
<xsl:when test="./productname='systemd'"/>
|
|
<!-- Same for python and ninja -->
|
|
<xsl:when test="./productname='ninja'"/>
|
|
<xsl:when test="./productname='Python'"/>
|
|
<xsl:otherwise>
|
|
<package><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">
|
|
<xsl:value-of select="./productname"/>
|
|
</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">
|
|
<xsl:value-of select="./productnumber"/>
|
|
</xsl:element>
|
|
<xsl:if
|
|
test="document($installed-packages)//package[name=current()/productname]">
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="inst-version">
|
|
<xsl:value-of
|
|
select="document(
|
|
$installed-packages
|
|
)//package[name=current()/productname]/version"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
</package>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
<!-- No deps for now: a former version is always installed -->
|
|
</xsl:template>
|
|
|
|
<xsl:template match="part">
|
|
<xsl:if test="count(.//*[contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')
|
|
]) > 0">
|
|
<xsl:text> </xsl:text>
|
|
<list>
|
|
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">
|
|
<xsl:value-of select="normalize-space(title)"/>
|
|
</xsl:element>
|
|
<xsl:text>

</xsl:text>
|
|
<xsl:apply-templates select="chapter"/>
|
|
<xsl:text> </xsl:text>
|
|
</list>
|
|
<xsl:text>

</xsl:text>
|
|
</xsl:if>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="chapter">
|
|
<xsl:if test="count(.//*[contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')
|
|
]) > 0">
|
|
<xsl:text> </xsl:text>
|
|
<sublist>
|
|
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">
|
|
<xsl:value-of select="normalize-space(title)"/>
|
|
</xsl:element>
|
|
<xsl:text>
</xsl:text>
|
|
<xsl:apply-templates select=".//sect1">
|
|
<xsl:sort select="@id"/>
|
|
</xsl:apply-templates>
|
|
<xsl:text> </xsl:text>
|
|
</sublist><xsl:text>

</xsl:text>
|
|
</xsl:if>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="sect1">
|
|
<xsl:choose>
|
|
<!-- This test is to find sections containing modules (PERL, Python
|
|
DBus,...) -->
|
|
<xsl:when
|
|
test="not(contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')) and
|
|
count(descendant::node()[contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')
|
|
]) > 0">
|
|
<xsl:text> </xsl:text>
|
|
<package><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">
|
|
<xsl:value-of select="normalize-space(title)"/>
|
|
</xsl:element>
|
|
<xsl:text>
</xsl:text>
|
|
<!-- Do not use .//*, which would include self. -->
|
|
<xsl:apply-templates
|
|
select="descendant::node()[contains(translate(@xreflabel,
|
|
'123456789',
|
|
'000000000'),
|
|
'-0')
|
|
]"
|
|
mode="normal">
|
|
<xsl:sort select="@id"/>
|
|
</xsl:apply-templates>
|
|
<xsl:text> </xsl:text>
|
|
</package><xsl:text>

</xsl:text>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<!-- Calls the template of specialCases.xsl,
|
|
which calls the "normal" template when the
|
|
case is normal. -->
|
|
<xsl:apply-templates select='.' mode="special">
|
|
<xsl:sort select="@id"/>
|
|
</xsl:apply-templates>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="*" mode="normal">
|
|
<xsl:variable name="version">
|
|
<xsl:call-template name="version">
|
|
<xsl:with-param name="label" select="./@xreflabel"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:choose>
|
|
<!-- If there is a "sect1" ancestor, this means that
|
|
we have a module -->
|
|
<xsl:when test="ancestor::sect1">
|
|
<xsl:text> </xsl:text>
|
|
<module><xsl:text>
 </xsl:text>
|
|
<xsl:element name="name">
|
|
<xsl:value-of select="./@id"/>
|
|
</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">
|
|
<xsl:value-of select="$version"/>
|
|
</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 -->
|
|
<!-- First the case of python modules or d-bus bindings -->
|
|
<xsl:if test="self::sect2">
|
|
<!-- dependencies -->
|
|
<xsl:apply-templates select=".//para[@role='required' or
|
|
@role='recommended' or
|
|
@role='optional']"
|
|
mode="dependency"/>
|
|
</xsl:if>
|
|
<!-- For python modules, the preceding module is an optional dep -->
|
|
<xsl:if test="ancestor::sect1[@id='python-modules']">
|
|
<xsl:apply-templates
|
|
select="preceding-sibling::sect2[@role='package']
|
|
//listitem[para/xref/@linkend=current()/@id]"
|
|
mode="prec-dep"/>
|
|
</xsl:if>
|
|
<!-- Now the case of perl modules: let us test our XSLT abilities.
|
|
Well, "use the sibling, Luke" -->
|
|
<xsl:if test="self::bridgehead">
|
|
<xsl:apply-templates select="following-sibling::itemizedlist[1]
|
|
/listitem/itemizedlist/listitem"
|
|
mode="perlmod-dep">
|
|
<xsl:sort select="position()"
|
|
data-type="number"
|
|
order="descending"/>
|
|
</xsl:apply-templates>
|
|
</xsl:if>
|
|
<!-- 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">
|
|
<xsl:value-of select="./@id"/>
|
|
</xsl:element>
|
|
<xsl:text>
 </xsl:text>
|
|
<xsl:element name="version">
|
|
<xsl:value-of select="$version"/>
|
|
</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 -->
|
|
<!-- If in Xorg (not anymore) or KDE chapter, consider that the preceding
|
|
package is the first dependency (not always noted in the book)-->
|
|
<xsl:if test="ancestor::chapter[@id='kde4-core'
|
|
or @id='xfce-core'
|
|
or @id='lxqt-desktop'
|
|
or @id='lxde-desktop']
|
|
and preceding-sibling::sect1[1]">
|
|
<xsl:text>
|
|
</xsl:text>
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">required</xsl:attribute>
|
|
<xsl:attribute name="build">before</xsl:attribute>
|
|
<xsl:attribute name="name">
|
|
<xsl:value-of select="preceding-sibling::sect1[1]/@id"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="type">ref</xsl:attribute>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<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:template>
|
|
|
|
<xsl:template name="version">
|
|
<xsl:param name="label" select="abc-2"/>
|
|
<xsl:variable name="start" select="string-length(substring-before(translate($label,'123456789','000000000'),'-0'))+2"/>
|
|
<xsl:variable name="prelim-ver" select="substring($label,$start)"/>
|
|
<xsl:choose>
|
|
<xsl:when test="contains($prelim-ver,'onfiguration')"/>
|
|
<xsl:when test="contains($prelim-ver,'escription')"/>
|
|
<xsl:when test="contains($prelim-ver,'EggDBus')">
|
|
<xsl:value-of select="substring-before($prelim-ver,' (EggDBus)')"/>
|
|
</xsl:when>
|
|
<xsl:when test="contains($label,'JDK')">
|
|
<xsl:value-of select="translate($prelim-ver,' ','_')"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$prelim-ver"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="para" mode="dependency">
|
|
<xsl:variable name="status" select="./@role"/>
|
|
<!-- First internal dependencies -->
|
|
<xsl:for-each select=".//xref">
|
|
<xsl:choose>
|
|
<!-- Avoid depending of myself -->
|
|
<xsl:when test="ancestor::*[@id=current()/@linkend]"/>
|
|
<!-- do not depend on something which is not a dependency -->
|
|
<xsl:when test="@role='nodep'"/>
|
|
<!-- Call list expansion when we have an xorg7 series of packages -->
|
|
<xsl:when test="contains(@linkend,'xorg7-')">
|
|
<xsl:call-template name="expand-deps">
|
|
<xsl:with-param name="section">
|
|
<xsl:value-of select="@linkend"/>
|
|
</xsl:with-param>
|
|
<xsl:with-param name="status">
|
|
<xsl:value-of select="$status"/>
|
|
</xsl:with-param>
|
|
<xsl:with-param name="build">
|
|
<xsl:choose>
|
|
<xsl:when test="@role='runtime'">after</xsl:when>
|
|
<xsl:when test="@role='first'">first</xsl:when>
|
|
<xsl:otherwise>before</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:text>
|
|
</xsl:text>
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">
|
|
<xsl:value-of select="$status"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="build">
|
|
<xsl:choose>
|
|
<xsl:when test="@role='runtime'">after</xsl:when>
|
|
<xsl:when test="@role='first'">first</xsl:when>
|
|
<xsl:otherwise>before</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="name">
|
|
<xsl:value-of select="@linkend"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="type">ref</xsl:attribute>
|
|
</xsl:element>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:for-each>
|
|
<!-- then external dependencies -->
|
|
<xsl:for-each select=".//ulink">
|
|
<xsl:choose>
|
|
<!-- do not depend on something which is not a dependency -->
|
|
<xsl:when test="@role='nodep'"/>
|
|
<xsl:otherwise>
|
|
<xsl:text>
|
|
</xsl:text>
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">
|
|
<xsl:value-of select="$status"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="build">
|
|
<xsl:choose>
|
|
<xsl:when test="@role='runtime'">after</xsl:when>
|
|
<xsl:when test="@role='first'">first</xsl:when>
|
|
<xsl:otherwise>before</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="name">
|
|
<xsl:value-of select="translate(normalize-space(text()),' /,()','-----')"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="type">link</xsl:attribute>
|
|
</xsl:element>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:for-each>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="listitem" mode="prec-dep">
|
|
<xsl:if test="preceding-sibling::listitem">
|
|
<xsl:text>
|
|
</xsl:text>
|
|
<xsl:element name="dependency">
|
|
<!-- the dep on the preceding package used to be required for python.
|
|
It seems optional now -->
|
|
<xsl:attribute name="status">optional</xsl:attribute>
|
|
<xsl:attribute name="build">before</xsl:attribute>
|
|
<xsl:attribute name="name">
|
|
<xsl:value-of select="preceding-sibling::listitem[1]//@linkend"/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="type">ref</xsl:attribute>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="listitem" mode="perlmod-dep">
|
|
<xsl:param name="glue" select="'
 '"/>
|
|
<xsl:choose>
|
|
<xsl:when test="para/xref[not(@role) or @role != 'nodep']|para[@id]/ulink">
|
|
<xsl:value-of select="$glue"/>
|
|
<xsl:element name="dependency">
|
|
<xsl:attribute name="status">
|
|
<xsl:choose>
|
|
<xsl:when
|
|
test="count(./para/text()[contains(string(),
|
|
'ptional')
|
|
]
|
|
)>0">optional</xsl:when>
|
|
<xsl:otherwise>required</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="build">
|
|
<xsl:choose>
|
|
<xsl:when test="para/xref/@role='runtime'">after</xsl:when>
|
|
<xsl:when test="para/ulink/@role='runtime'">after</xsl:when>
|
|
<xsl:otherwise>before</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="name">
|
|
<xsl:if test="para/xref">
|
|
<xsl:value-of select="para/xref/@linkend"/>
|
|
</xsl:if>
|
|
<xsl:if test="para/ulink">
|
|
<xsl:value-of select="para/@id"/>
|
|
</xsl:if>
|
|
</xsl:attribute>
|
|
<xsl:attribute name="type">
|
|
<xsl:if test="para/xref">ref</xsl:if>
|
|
<xsl:if test="para/ulink">link</xsl:if>
|
|
</xsl:attribute>
|
|
<xsl:apply-templates select="itemizedlist/listitem"
|
|
mode="perlmod-dep">
|
|
<xsl:sort select="position()"
|
|
data-type="number"
|
|
order="descending"/>
|
|
<xsl:with-param name="glue" select="concat($glue,' ')"/>
|
|
</xsl:apply-templates>
|
|
</xsl:element>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:apply-templates select="itemizedlist/listitem"
|
|
mode="perlmod-dep">
|
|
<xsl:sort select="position()"
|
|
data-type="number"
|
|
order="descending"/>
|
|
<xsl:with-param name="glue" select="$glue"/>
|
|
</xsl:apply-templates>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
</xsl:stylesheet>
|