Вот что я сделал, чтобы включить protoc
в проект. В идеале я бы использовал <mapper>
, но ассоциировать файлы .proto
с их файлами .java
нетривиально, поэтому я просто касаюсь файла маркера каждый раз, когда запускается protoc
.
Ключом является задача <uptodate>
, которая позволяет установить свойство на основе относительного возраста двух наборов файлов (true, если from старше, чем to, false в противном случае).
<property name="proto.messages" value="proto"/>
<property name="proto.src" value="src-proto"/>
<property name="proto.markerfile" value="${proto.src}/markerfile"/>
<target name="init">
<uptodate property="skip.protogen" targetfile="${proto.markerfile}">
<srcfiles dir="${proto.messages}" />
</uptodate>
...
</target>
<target name="clean">
<delete dir="${proto.src}"/>
...
</target>
<target name="protoc" depends="init" unless="skip.protogen">
<!-- delete first to ensure clean build -->
<delete dir="${proto.src}"/>
<mkdir dir="${proto.src}" />
<apply executable="protoc" failonerror="true">
<arg prefix="--java_out=" file="${proto.src}" />
<arg prefix="--proto_path=" file="${proto.messages}" />
<fileset dir="${proto.messages}" includes="**/*.proto" />
</apply>
<touch file="${proto.markerfile}" />
</target>
<target name="build" depends="init,protoc,...">
<javac ...>
<src path="${proto.src}"/>
...
</javac>
</target>