ant macros: fileset as javac src element

543 Views Asked by At

I have ant (1.9.4) macros which accept path-like structure as src param and when i try run it I get 'FILE_NAME.java is not a directory'.

My build file:

<project name="test" default="main">
    <macrodef name="testm">
        <element name="srcdir"/>
        <sequential>
            <javac destdir="target">
                <src>
                    <srcdir/>
                </src>
            </javac>
        </sequential>
    </macrodef>

    <target name="build-project">
        <testm>
            <srcdir>
                <fileset dir="src">
                    <include name="**/*.java"/>
                </fileset>
            </srcdir>
        </testm>
    </target>

    <target name="main" depends="build-project"/>
</project>
2

There are 2 best solutions below

0
dronidze On

Try to call macros like

<testm>
    <srcdir>
        <path location="src"/>
    </srcdir>
</testm>
2
Chad Nouis On

A <src> nested under <javac> can't have a <srcdir> nested within it.

Instead, pass the <src> from the caller of <testm>...

<macrodef name="testm">
    <element name="srcdir"/>
    <sequential>
        <!-- Nest <srcdir> directly under <javac> -->
        <javac destdir="target">
            <srcdir/>
        </javac>
    </sequential>
</macrodef>

<target name="build-project">
    <testm>
        <srcdir>
            <!-- Pass <src> directly to <javac> via the macrodef -->
            <src path="src"/>
        </srcdir>
    </testm>
</target>

I removed <include name="**/*.java"/> because <javac> includes all **/*.java files by default.

As another example, you can pass several <javac> options to <testm> with one argument...

<macrodef name="testm">
    <element name="javac-args"/>
    <sequential>
        <javac destdir="target">
            <javac-args/>
        </javac>
    </sequential>
</macrodef>

<target name="build-project">
    <testm>
        <javac-args>
            <src path="src"/>
            <classpath>
                <pathelement location="my.jar"/>
            </classpath>
        </javac-args>
    </testm>
</target>