Here is an ant script for generating TeX code and documentation for one LaTeX class and one LaTeX package. It is my first larger ant script: I welcome suggestions for improvements.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project name="customer TeX code" default="main">
<description>Buildscript for the LaTeX classes and packages</description>
<property name="foo" value="foo" />
<property name="bar" value="bar" />
<!-- target: init -->
<target name="init" description="initialize properties">
<condition property="foo.uptodate">
<and>
<available file="${foo}.cls" />
<available file="${foo}.drv" />
<available file="${foo}.pdf" />
<uptodate property="foo.cls.uptodate" targetfile="${foo}.cls">
<srcfiles file="${foo}.dtx" />
<srcfiles file="${foo}.ins" />
</uptodate>
<uptodate property="foo.drv.uptodate" targetfile="${foo}.drv">
<srcfiles file="${foo}.dtx" />
<srcfiles file="${foo}.ins" />
</uptodate>
<uptodate property="foo.pdf.uptodate" targetfile="${foo}.pdf">
<srcfiles file="${foo}.dtx" />
<srcfiles file="${foo}.ins" />
</uptodate>
</and>
</condition>
<condition property="bar.uptodate">
<and>
<available file="${bar}.sty" />
<available file="${bar}.drv" />
<available file="${bar}.pdf" />
<uptodate property="bar.sty.uptodate" targetfile="${bar}.sty">
<srcfiles file="${bar}.dtx" />
<srcfiles file="${bar}.ins" />
</uptodate>
<uptodate property="bar.drv.uptodate" targetfile="${bar}.drv">
<srcfiles file="${bar}.dtx" />
<srcfiles file="${bar}.ins" />
</uptodate>
<uptodate property="bar.pdf.uptodate" targetfile="${bar}.pdf">
<srcfiles file="${bar}.dtx" />
<srcfiles file="${bar}.ins" />
</uptodate>
</and>
</condition>
</target>
<!-- target: foo -->
<target name="foo" unless="foo.uptodate" depends="init" description="builds all files for the foo class">
<exec executable="latex" failonerror="true">
<arg value="${foo}.ins" />
</exec>
<exec executable="lualatex" failonerror="true">
<arg value="-draftmode" />
<arg value="${foo}.drv" />
</exec>
<parallel>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gind.ist" />
<arg value="-t" />
<arg value="${foo}.ind.ilg" />
<arg value="${foo}.idx" />
</exec>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gglo.ist" />
<arg value="-t" />
<arg value="${foo}.gls.ilg" />
<arg value="-o" />
<arg value="${foo}.gls" />
<arg value="${foo}.glo" />
</exec>
</parallel>
<exec executable="lualatex" failonerror="true">
<arg value="-draftmode" />
<arg value="${foo}.drv" />
</exec>
<exec executable="lualatex" failonerror="true">
<arg value="${foo}.drv" />
</exec>
</target>
<!-- target: bar -->
<target name="bar" unless="bar.uptodate" depends="init" description="builds all files for the bar package">
<exec executable="latex" failonerror="true">
<arg value="${bar}.ins" />
</exec>
<exec executable="lualatex" failonerror="true">
<arg value="-draftmode" />
<arg value="${bar}.drv" />
</exec>
<parallel>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gind.ist" />
<arg value="-t" />
<arg value="${bar}.ind.ilg" />
<arg value="${bar}.idx" />
</exec>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gglo.ist" />
<arg value="-t" />
<arg value="${bar}.gls.ilg" />
<arg value="-o" />
<arg value="${bar}.gls" />
<arg value="${bar}.glo" />
</exec>
</parallel>
<exec executable="lualatex" failonerror="true">
<arg value="-draftmode" />
<arg value="${bar}.drv" />
</exec>
<exec executable="lualatex" failonerror="true">
<arg value="${bar}.drv" />
</exec>
</target>
<!-- target: main -->
<target name="main" depends="foo, bar" description="default target" />
</project>
EDIT: Now with <macrodef> as suggested by @palacsint
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project name="customer TeX code" default="main">
<description>Buildscript for the LaTeX classes and packages</description>
<property name="foo" value="foo" />
<property name="bar" value="bar" />
<!-- macrodef: latex-uptodate -->
<macrodef name="latex-uptodate" description="checks if a latex package or class (the extension is given in the extension attribute) is newer than its source files">
<attribute name="basename" default="unknown" />
<attribute name="extension" default="cls" />
<sequential>
<condition property="@{basename}.uptodate">
<and>
<available file="@{basename}.@{extension}" />
<available file="@{basename}.drv" />
<available file="@{basename}.pdf" />
<uptodate property="@{basename}.@{extension}.uptodate" targetfile="@{basename}.@{extension}">
<srcfiles file="@{basename}.dtx" />
<srcfiles file="@{basename}.ins" />
</uptodate>
<uptodate property="@{basename}.drv.uptodate" targetfile="@{basename}.drv">
<srcfiles file="@{basename}.dtx" />
<srcfiles file="@{basename}.ins" />
</uptodate>
<uptodate property="@{basename}.pdf.uptodate" targetfile="@{basename}.pdf">
<srcfiles file="@{basename}.dtx" />
<srcfiles file="@{basename}.ins" />
</uptodate>
</and>
</condition>
</sequential>
</macrodef>
<!-- macrodef: compile-latex -->
<macrodef name="compile-latex" description="builds and compiles a latex package or class">
<attribute name="filename" default="unknown" />
<sequential>
<exec executable="latex" failonerror="true">
<arg value="@{filename}.ins" />
</exec>
<parallel>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gind.ist" />
<arg value="-t" />
<arg value="@{filename}.ind.ilg" />
<arg value="@{filename}.idx" />
</exec>
<exec executable="makeindex" failonerror="true">
<arg value="-s" />
<arg value="gglo.ist" />
<arg value="-t" />
<arg value="@{filename}.gls.ilg" />
<arg value="-o" />
<arg value="@{filename}.gls" />
<arg value="@{filename}.glo" />
</exec>
</parallel>
<exec executable="lualatex" failonerror="true">
<arg value="-draftmode" />
<arg value="@{filename}.drv" />
</exec>
<exec executable="lualatex" failonerror="true">
<arg value="@{filename}.drv" />
</exec>
</sequential>
</macrodef>
<!-- target: init -->
<target name="init" description="initialize properties">
<parallel>
<latex-uptodate basename="${foo}" />
<latex-uptodate basename="${bar}" extension="sty" />
</parallel>
</target>
<!-- target: foo -->
<target name="foo" unless="${foo}.uptodate" depends="init" description="builds all files for the foo class">
<compile-latex filename="${foo}" />
</target>
<!-- target: bar -->
<target name="bar" unless="${bar}.uptodate" depends="init" description="builds all files for the bar package">
<compile-latex filename="${bar}" />
</target>
<!-- target: main -->
<target name="main" depends="foo, bar" description="default target" />
</project>
EDIT2: latex-uptodate now with union and srcresources.
<!-- macrodef: latex-uptodate -->
<macrodef name="latex-uptodate" description="checks if a latex package or class (the extension is given in the extension attribute) is newer than its source files">
<attribute name="basename" />
<attribute name="extension" />
<sequential>
<union id="latex-src-union">
<filelist>
<file name="@{basename}.dtx" />
<file name="@{basename}.ins" />
</filelist>
</union>
<condition property="@{basename}.uptodate">
<and>
<available file="@{basename}.@{extension}" />
<available file="@{basename}.drv" />
<available file="@{basename}.pdf" />
<uptodate property="@{basename}.@{extension}.uptodate" targetfile="@{basename}.@{extension}">
<srcresources refid="latex-src-union" />
</uptodate>
<uptodate property="@{basename}.drv.uptodate" targetfile="@{basename}.drv">
<srcresources refid="latex-src-union" />
</uptodate>
<uptodate property="@{basename}.pdf.uptodate" targetfile="@{basename}.pdf">
<srcresources refid="latex-src-union" />
</uptodate>
</and>
</condition>
</sequential>
</macrodef>
latexmkwhich ships with all modern TeX distributions and which is a versatile build tool for TeX (requiring in most cases zero configuration)? – Konrad Rudolph Jul 19 '12 at 19:11:-)– Martin Schröder Jul 19 '12 at 20:17