user1443778
user1443778

Reputation: 591

Only generate source files if definitions have changed ant

I run a script that generates some java code based on definition files. I want to avoid running this task if the definition files have not changed.

<target name="generate" depends="init">
<exec executable="${codeGenTool-path}">
  <arg value="${definitionFolder}" />
  <arg value="${generatedFolder}" />
</exec>
</target>

I looked at http://ant.apache.org/manual/Tasks/uptodate.html but It seems like I must have a single target file to compare to. The code generation tool creates a folder containing many source files.

Upvotes: 1

Views: 63

Answers (1)

Ian Roberts
Ian Roberts

Reputation: 122374

This is a good use case for the outofdate task from ant-contrib:

<outofdate>
  <sourcefiles>
    <fileset dir="${definitionFolder}" />
  </sourcefiles>
  <targetfiles>
    <fileset dir="${generatedFolder}" />
  </targetfiles>
  <sequential>
    <exec executable="${codeGenTool-path}">
      <arg value="${definitionFolder}" />
      <arg value="${generatedFolder}" />
    </exec>
  </sequential>
</outofdate>

This will check every file under the definitionFolder against every file under the generatedFolder - you might want to constrain the filesets more tightly, e.g. with includes="**/*.def" or whatever is the relevant file extension.

Alternatively, if you want to avoid "third party" tasks then you could use a dependset task to check the target files against the source ones.

<target name="generate" depends="check.generate, do.generate" />

<target name="check.generate">
  <dependset>
    <srcfileset dir="${definitionFolder}" />
    <targetfileset dir="${generatedFolder}" />
  </dependset>

  <condition property="gen.required">
    <resourcecount count="0" when="equal">
      <fileset dir="${generatedFolder}" />
    </resourcecount>
  </condition>
</target>

<target name="do.generate" if="gen.required">
  <exec ....>
</target>

The dependset task deletes all the target files if any of them are older than any of the source files, so we can make do.generate conditional - it will run if there are no files in the generatedFolder, which will be the case when either it's never been run before, or the generated files were out of date.

Upvotes: 1

Related Questions