1 <?xml version="1.0" encoding="UTF-8"?>
3 * Simple Ant (http://jakarta.apache.org/ant) build script for Cyberduck
8 * Copyright (c) 2005-2012 David Kocher. All rights reserved.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.F
21 * Bug fixes, suggestions and comments should be sent to:
22 * dkocher@cyberduck.io
24 <project name="Cyberduck" default="build" basedir=".">
26 <property file="build.properties"/>
27 <property file="tools.properties"/>
29 <property environment="env"/>
31 <property name="app.name" value="${ant.project.name}"/>
32 <property name="app.update.feed" value=""/>
34 <property name="debug" value="on"/>
35 <property name="home" location="."/>
36 <property name="unittests" value="${home}/test"/>
37 <property name="build" value="${home}/build"/>
38 <property name="build.compile.target" value="${ant.java.version}"/>
39 <property name="configuration" value="release"/>
40 <property name="build.deploy" location="${build}/${configuration}"/>
41 <property name="build.bundles" value="${build.deploy}/bundles"/>
42 <property name="build.classes" value="${build}/classes"/>
43 <property name="build.unittests" value="${build}/test-classes"/>
44 <property name="build.unittests.include" value="**/*Test.class"/>
45 <property name="build.unittests.reports" value="${build}/report"/>
46 <property name="config" value="${home}/config"/>
47 <property name="img" value="${home}/img"/>
48 <property name="lib" value="${home}/lib"/>
49 <property name="lib.ext" value="${lib}/ext"/>
50 <property name="source" value="${home}/source"/>
51 <property name="resources" value="${home}/resources"/>
52 <property name="doc" value="${home}/doc"/>
53 <property name="www" value="${home}/www"/>
54 <property name="www.update" value="${www}/update"/>
55 <property name="www.help" value="${www}/help"/>
56 <property name="setup" value="${home}/setup"/>
57 <property name="copyright" value="Copyright (c) 2001-2015 David Kocher. Copyright (c) 2011–2015 Yves Langisch"/>
58 <property name="version" value="${cyberduck.version.major}.${cyberduck.version.minor}"/>
60 <property name="sonar.host" value="sonar.cyberduck.io"/>
62 <condition property="platform" value="mac">
65 <condition property="platform" value="windows">
66 <os family="windows"/>
68 <condition property="platform" value="linux">
72 <import description="Platform specific targets" file="build-${platform}.xml"/>
74 <path id="test.classpath">
75 <path refid="build.classpath"/>
76 <pathelement location="${build.unittests}"/>
77 <pathelement location="${build}"/>
78 <fileset dir="${build}">
79 <include name="*.jar"/>
81 <fileset dir="${lib.ext}">
82 <include name="*.jar"/>
86 <path id="build.classpath">
87 <!-- Include all libraries -->
88 <fileset dir="${lib}">
89 <include name="*.jar"/>
93 <target name="init" depends="timestamp">
95 <echo message=" ---------------------------------------------------------------"/>
96 <echo message=" Java Version: ${ant.java.version}"/>
97 <echo message=" Project Home: ${home}"/>
98 <echo message=" Project Build: ${build}"/>
99 <echo message=" Project Source: ${source}"/>
100 <echo message=" ---------------------------------------------------------------"/>
102 <echo message="Building ${app.name} on ${os.name}/${os.arch} at ${touch.time}..."/>
104 <mkdir dir="${build}"/>
105 <mkdir dir="${build.deploy}"/>
106 <mkdir dir="${build.classes}"/>
107 <mkdir dir="${build.unittests}"/>
108 <mkdir dir="${build.unittests.reports}"/>
109 <mkdir dir="${build.unittests.reports}/html"/>
112 <target name="build" description="Build GUI application"
113 depends="archive, _build"/>
115 <target name="cli" description="Build CLI application"
116 depends="archive, _cli"/>
118 <target name="timestamp">
120 <format property="touch.time"
121 pattern="dd/MM/yyyy hh:mm aa"
127 <target name="revision" depends="init">
128 <echo message="Calculating revision..."/>
129 <exec dir="${home}" executable="svnversion" outputproperty="svn.revision" failonerror="true">
133 <taskdef resource="net/sf/antcontrib/antcontrib.properties">
134 <classpath path="${lib.ext}/ant-contrib-1.0b3.jar"/>
136 <!-- Remove any non-digits (e.g. a trailing M) from the current revision -->
137 <propertyregex property="revision"
138 input="${svn.revision}"
141 <echo message="svn.revision=${svn.revision}"/>
142 <property name="revision" value="${revision}"/>
143 <echo message="revision=${revision}"/>
144 <buildnumber file="build.number"/>
145 <echo message="Build number ${build.number}"/>
148 <target name="compile" depends="init" description="Compile the source tree">
150 includeantruntime="false"
154 target="${build.compile.target}"
155 source="${build.compile.target}"
159 destdir="${build.classes}">
160 <classpath refid="build.classpath"/>
164 <target name="archive" depends="compile, manifest" description="Create archives">
165 <jar jarfile="${build}/config.jar"
167 manifest="${build}/MANIFEST.MF">
168 <fileset dir="${lib}">
169 <include name="mime.types"/>
170 <include name="log4j-*.xml"/>
173 <jar jarfile="${build}/core.jar"
175 manifest="${build}/MANIFEST.MF">
176 <fileset dir="${build.classes}">
177 <include name="ch/cyberduck/core/**/*.class"/>
180 <jar jarfile="${build}/ui.jar"
182 manifest="${build}/MANIFEST.MF">
183 <fileset dir="${build.classes}/">
184 <include name="ch/cyberduck/ui/**/*.class"/>
185 <exclude name="ch/cyberduck/ui/cocoa/**/*.class"/>
188 <jar jarfile="${build}/binding.jar"
190 manifest="${build}/MANIFEST.MF">
191 <fileset dir="${build.classes}/">
192 <include name="ch/cyberduck/binding/**/*.class"/>
195 <jar jarfile="${build}/cocoa.jar"
197 manifest="${build}/MANIFEST.MF">
198 <fileset dir="${build.classes}/">
199 <include name="ch/cyberduck/ui/cocoa/**/*.class"/>
203 <taskdef resource="net/sf/antcontrib/antcontrib.properties">
204 <classpath path="${lib.ext}/ant-contrib-1.0b3.jar"/>
206 <var name="manifest.lib.classpath" unset="true"/>
207 <manifestclasspath property="manifest.lib.classpath"
208 jarfile="${lib}/cli.jar">
209 <!-- Convert paths relative to target jarfile -->
210 <classpath refid="build.classpath"/>
212 <var name="manifest.build.classpath" unset="true"/>
213 <manifestclasspath property="manifest.build.classpath"
214 jarfile="${build}/cli.jar">
215 <!-- Convert paths relative to target jarfile -->
217 <fileset dir="${build}" includes="*.jar"/>
220 <jar jarfile="${build}/cli.jar"
222 <fileset dir="${build.classes}">
223 <include name="ch/cyberduck/cli/*.class"/>
226 <attribute name="Specification-Title" value="${app.name}"/>
227 <attribute name="Specification-Version" value="${version}"/>
228 <attribute name="Specification-Vendor" value="${copyright}"/>
229 <attribute name="Implementation-Version" value="${revision}"/>
230 <attribute name="Main-Class" value="ch.cyberduck.cli.Terminal"/>
231 <attribute name="Class-Path" value="${manifest.lib.classpath} ${manifest.build.classpath}"/>
236 <target name="doc" depends="init" description="Generate Javadoc">
237 <mkdir dir="${doc}"/>
238 <javadoc packagenames="ch.cyberduck.*,com.*,org.*"
239 sourcepath="${source}"
244 windowtitle="${app.name} API"
245 doctitle="${app.name}"
246 bottom="${copyright}">
247 <classpath refid="build.classpath"/>
251 <target name="clean" description="Delete compiled classes, jar files, jni libraries and application bundle">
252 <delete dir="${build}"/>
255 <target name="manifest" depends="revision" description="Create manifest file">
256 <manifest file="${build}/MANIFEST.MF">
257 <attribute name="Specification-Title" value="${app.name}"/>
258 <attribute name="Specification-Version" value="${version}"/>
259 <attribute name="Specification-Vendor" value="${copyright}"/>
260 <attribute name="Implementation-Version" value="${revision}"/>
264 <target name="test-compile" depends="build">
267 includeantruntime="false"
269 target="${build.compile.target}"
270 source="${build.compile.target}"
272 srcdir="${unittests}"
273 destdir="${build.unittests}"
274 includes="**/*.java">
275 <classpath refid="test.classpath"/>
279 <target name="test" depends="test-compile" description="Runs all tests">
280 <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
281 <classpath path="${lib.ext}/junit-4.11.jar"/>
282 <classpath path="${lib.ext}/hamcrest-core-1.3.jar"/>
284 <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
285 <classpath path="${lib.ext}/jacocoant.jar"/>
287 <copy todir="${build}">
288 <fileset dir="${lib}">
289 <!-- Include libjnidispatch.dylib -->
290 <include name="*.dylib"/>
293 <echo message="Running tests with ${jvm.runtime.bin}/java"/>
294 <!-- Get all properties available to pass them to test task -->
295 <propertyset id="test.systemproperties">
296 <propertyref builtin="commandline"/>
298 <jacoco:coverage destfile="${build}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
299 <junit jvm="${jvm.runtime.bin}/java" fork="yes" forkmode="once"
300 printsummary="on" filtertrace="on"
301 haltonfailure="no" failureproperty="test.failed"
304 <classpath refid="test.classpath"/>
305 <formatter type="plain" usefile="false"/>
306 <formatter type="xml" extension=".xml" usefile="true"/>
307 <batchtest todir="${build.unittests.reports}">
308 <fileset dir="${build.unittests}">
309 <include name="${build.unittests.include}"/>
312 <syspropertyset refid="test.systemproperties"/>
313 <sysproperty key="java.library.path" value="${build}"/>
314 <sysproperty key="jna.library.path" value="${build}"/>
317 <junitreport todir="${build.unittests.reports}/html">
318 <fileset dir="${build.unittests.reports}">
319 <include name="TEST-*.xml"/>
321 <report format="frames" todir="${build.unittests.reports}/html"/>
323 <!--<fail message="Test failure detected" if="test.failed"/>-->
326 <target name="sonar" depends="test" description="Run Sonar">
327 <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
328 <classpath path="${lib.ext}/sonar-ant-task-2.2.jar"/>
330 <property name="sonar.projectName" value="${app.name}"/>
331 <property name="sonar.projectKey" value="ch.cyberduck:cyberduck-${platform}"/>
332 <property name="sonar.projectVersion" value="${revision}"/>
333 <property name="sonar.projectBaseDir" value="${home}"/>
334 <property name="sonar.sources" value="${source}"/>
335 <property name="sonar.exclusions" value="**/binding/**/*.java,**/cocoa/**/*.java"/>
336 <property name="sonar.coverage.exclusions" value="**/binding/**/*.java,**/cocoa/**/*.java"/>
337 <property name="sonar.tests" value="${unittests}"/>
338 <property name="sonar.binaries" value="${build.classes}"/>
339 <property name="sonar.junit.reportsPath" value="${build.unittests.reports}"/>
340 <pathconvert property="sonar.libraries" refid="build.classpath" pathsep=","/>
341 <property name="sonar.host.url" value="https://${sonar.host}"/>
342 <property name="sonar.jdbc.url"
343 value="jdbc:mysql://${sonar.host}:3306/sonar?useUnicode=true&characterEncoding=utf8"/>
344 <property name="sonar.jdbc.username" value="sonar"/>
345 <property name="sonar.jdbc.password" value="sonar"/>
346 <property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
347 <property name="sonar.core.codeCoveragePlugin" value="jacoco"/>
348 <property name="sonar.jacoco.reportPath" value="${build}/jacoco.exec"/>
349 <property name="sonar.jacoco.antTargets" value="test"/>
350 <property name="sonar.links.homepage" value="http://cyberduck.io"/>
351 <property name="sonar.links.ci" value="https://ci.cyberduck.io"/>
352 <property name="sonar.links.issue" value="https://trac.cyberduck.io"/>
353 <property name="sonar.scm.url" value="scm:svn:http://svn.cyberduck.io/trunk"/>
354 <property name="sonar.links.scm" value="https://svn.cyberduck.io"/>
355 <property name="sonar.links.scm_dev" value="https://svn.cyberduck.io"/>
356 <sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/>