You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jitsi/resources/install/build.xml

1887 lines
81 KiB

<?xml version="1.0"?>
<!--
Installation procedure.
The install scripts are located inside the resources/install directory . The
files are separated in subdirectories according to distribution - generic,
linux, windows, macosx.
1. For building any of the distributions you must fill in the
path to the installation of IzPack. For instructions on how to install
izPack please referer to http://www.izforge.com/izpack/. And uncomment the
taskdef of izpack in this file.
2. When building the linux installation package you must set the
linux.jre.path variable to point to a location containing an extracted jre
so that it could be bundled inside the installation package.
3. When building the windows installation package you must set the
windows.jre.file variable. This is the path to an installation file of a
jre (online or offline one). The 7zip software package
(http://www.7-zip.org) must also be installed.
4. When changing the application version things you must do:
- generic
- there is app-version variable in the izpack installer xml
- linux
- there is app-version variable in the izpack installer xml
- windows
- there is app-version variable in the izpack installer xml
- you must change the installer jar name in the launcher.ini file
-->
<project name="jitsi-installer" basedir="." default="ant-usage">
<import file="../../build.xml"/>
<!-- Load installer properties -->
<!-- USERS NEED TO UPDATE THIS FILE -->
<property file="${inst.resrc}/installers.properties"/>
<target name="load-properties" depends="version">
<!-- load properties on demand here so it can evaluate
and sip-communicator.version property from property file-->
<property file="${inst.resrc}/ant-build-config.properties"/>
<!--
Provide access to the environment variables via the prefix "env."
because we will modify at least the PATH where is needed.
-->
<property environment="env" />
</target>
<!-- define the izpack task in a separate target so that we don't get an
error when izpack properties are not set-->
<target name="define-izpack-task">
<taskdef name="izpack" classpath="${izpack.dir}/lib/compiler.jar"
classname="com.izforge.izpack.ant.IzPackTask"/>
</target>
<!-- include ant-contrib tasks-->
<target name="define-ant-contrib-task">
<taskdef resource="net/sf/antcontrib/antlib.xml"
classpath="${inst.resrc}/lib/ant-contrib-1.0b3.jar"/>
</target>
<target name="-prepare-debian-sh"
depends="-prepare-debian-sh-copy,-prepare-debian-sh-homedir"/>
<target name="-prepare-debian-sh-copy">
<!-- Put correct version in the sip-communicator executable file -->
<copy file="${inst.resrc}/debian/sip-communicator.sh.tmpl"
tofile="${inst.resrc}/debian/${package.name}.sh"
overwrite="true"/>
<replace file="${inst.resrc}/debian/${package.name}.sh"
token="_SC_VERSION_"
value="${sip-communicator.version}"/>
<replace file="${inst.resrc}/debian/${package.name}.sh"
token="_PACKAGE_NAME_"
value="${package.name}"/>
</target>
<target name="-prepare-debian-sh-homedir" if="application.home.dirname">
<replace file="${inst.resrc}/debian/${package.name}.sh"
token="net.java.sip.communicator.launcher.SIPCommunicator"
value="-Dnet.java.sip.communicator.SC_HOME_DIR_NAME=${application.home.dirname} net.java.sip.communicator.launcher.SIPCommunicator"/>
</target>
<!-- Put here the Windows release directory -->
<property name="windows.app.dir" value="${sc.basedir}/${release}/windows"/>
<!-- Put here the Linux release directory -->
<property name="linux.app.dir" value="${sc.basedir}/${release}/linux"/>
<!-- Put here the Generic release directory -->
<property name="generic.app.dir" value="${sc.basedir}/${release}/generic"/>
<!-- The path to the dpkg-scanpackages tool -->
<property name="dpkg-scanpackages" value="/usr/bin/dpkg-scanpackages"/>
<!-- The path to the dpkg-buildpackage tool -->
<property name="dpkg-buildpackage" value="/usr/bin/dpkg-buildpackage"/>
<!-- The path to the dh_testdir tool -->
<property name="dh_testdir" value="/usr/bin/dh_testdir"/>
<!-- change the 7zip executable corresponding the OS
7-zip is used to create windows self-extract installer binary
In order to work 7-zip must be installed and tobe in the path
For Debian linux use : apt-get install p7zip
For other go to : http://www.7-zip.org/
-->
<condition property="7zip.executable" value="7z">
<os family="windows"/>
</condition>
<condition property="7zip.executable" value="7z">
<equals arg1="${os.name}" arg2="linux"
casesensitive="false" trim="true"/>
</condition>
<!-- Put here the release directory -->
<property name="macosx.app.dir" value="${release}/macosx"/>
<!-- Put here the resource directory -->
<property name="macosx.resrc.dir" value="${inst.resrc}/macosx"/>
<!-- The release directory for Debian packages -->
<property name="debian.dir" value="${release}/debian"/>
<property name="debian.binary.dir" value="${debian.dir}/binary"/>
<!-- Can we build debian packages? -->
<condition property="dpkg.build.present">
<and>
<available file="${dpkg-buildpackage}"/>
<available file="${dh_testdir}"/>
</and>
</condition>
<!-- Can we deploy debian packages? -->
<condition property="dpkg.scan.present">
<available file="${dpkg-scanpackages}"/>
</condition>
<!-- default Ant target does nothing except print helpful options -->
<target name="ant-usage"
description="simply execute 'ant' to discover the most useful targets.">
<echo message="Useful ant commands for the Jitsi Build Installer..." />
<echo message="'ant build-installation-generic' for building generic installator jar" />
<echo message="'ant build-installation-linux' for building linux instalation file" />
<echo message="'ant build-installation-wix' for building Windows MSI instalation file using WiX" />
<echo message="'ant build-installation-wix-64' for building Windows x64 MSI instalation file using WiX" />
</target>
<target name="clean-install-generic">
<delete dir="${generic.app.dir}"/>
<mkdir dir="${generic.app.dir}"/>
</target>
<target name="build-installation-generic"
depends="clean-install-generic,define-izpack-task,load-properties">
<propertyfile file="${generic.app.dir}/versionupdate.properties"
comment="Last Build Version">
<entry key="last_version" value="${sip-communicator.version}"/>
<entry key="download_link"
value="${link.download.generic}"/>
</propertyfile>
<filter token="VERSION" value="${sip-communicator.version}" />
<filter token="BUILDDATE" value="${build.date}" />
<filter token="PKG_NAME" value="${package.name}" />
<filter token="APP_NAME" value="${application.name}" />
<filter token="APP_EMAIL" value="${application.email}" />
<filter token="APP_WEB" value="${application.web}" />
<filter token="DEST_DIR" value="${release}" />
<filter token="WelcomeText1" value="${installer.welcome.wtext1}" />
<filter token="WelcomeText2" value="${installer.welcome.wtext2}" />
<filter token="WelcomeText3" value="${installer.welcome.wtext3}" />
<copy
tofile="${generic.app.dir}/tmp-installer-generic.xml"
file="${inst.resrc}/generic/installer-generic.xml"
filtering="yes" />
<copy
tofile="${generic.app.dir}/tmp-linux_shortcut_specification.xml"
file="${inst.resrc}/linux/linux_shortcut_specification.xml"
filtering="yes" />
<izpack
input="${generic.app.dir}/tmp-installer-generic.xml"
output="${generic.app.dir}/${package.name}-${sip-communicator.version}.jar"
installerType="standard"
izPackDir="${izpack.dir}/"
basedir="${sc.basedir}"/>
<delete quiet="yes" failonerror="false">
<fileset dir="${generic.app.dir}">
<include name="tmp-*"/>
</fileset>
</delete>
</target>
<target name="clean-install-linux">
<delete dir="${linux.app.dir}"/>
<mkdir dir="${linux.app.dir}"/>
<mkdir dir="${linux.app.dir}/tmp"/>
</target>
<target name="build-installation-linux"
depends="clean-install-linux,define-izpack-task,load-properties">
<propertyfile file="${linux.app.dir}/versionupdate.properties"
comment="Last Build Version">
<entry key="last_version" value="${sip-communicator.version}"/>
<entry key="download_link"
value="${link.download.linux}"/>
</propertyfile>
<filter token="VERSION" value="${sip-communicator.version}" />
<filter token="BUILDDATE" value="${build.date}" />
<filter token="PKG_NAME" value="${package.name}" />
<filter token="APP_NAME" value="${application.name}" />
<filter token="APP_EMAIL" value="${application.email}" />
<filter token="APP_WEB" value="${application.web}" />
<filter token="DEST_DIR" value="${release}" />
<filter token="WelcomeText1" value="${installer.welcome.wtext1}" />
<filter token="WelcomeText2" value="${installer.welcome.wtext2}" />
<filter token="WelcomeText3" value="${installer.welcome.wtext3}" />
<copy todir="${linux.app.dir}/tmp" filtering="yes" >
<fileset dir="${inst.resrc}/linux">
<include name="setup.sh"/>
<include name="inst_path"/>
</fileset>
</copy>
<!-- copy the jre -->
<mkdir dir="${linux.app.dir}/tmp/jre" />
<copy todir="${linux.app.dir}/tmp/jre">
<fileset dir="${linux.jre.path}">
<include name="**/*"/>
</fileset>
</copy>
<copy
tofile="${linux.app.dir}/tmp/tmp-installer-linux.xml"
file="${inst.resrc}/linux/installer-linux.xml"
filtering="yes" />
<copy
tofile="${linux.app.dir}/tmp-linux_shortcut_specification.xml"
file="${inst.resrc}/linux/linux_shortcut_specification.xml"
filtering="yes" />
<!-- Prepare felix.client.run.properties and put some specific bundles -->
<copy file="${lib}/felix.client.run.properties"
tofile="${inst.resrc}/linux/felix.client.run.properties"
overwrite="true"/>
<replace file="${inst.resrc}/linux/felix.client.run.properties"
token="reference:file:sc-bundles/swingnotification.jar \">
<replacevalue><![CDATA[reference:file:sc-bundles/galagonotification.jar \
reference:file:sc-bundles/swingnotification.jar \]]></replacevalue>
</replace>
<!-- create izpack installer jar file -->
<izpack input="${linux.app.dir}/tmp/tmp-installer-linux.xml"
output="${linux.app.dir}/tmp/${package.name}-${sip-communicator.version}-linux.jar"
installerType="standard"
basedir="${sc.basedir}"
izPackDir="${izpack.dir}/"/>
<!-- Create self extract linux binary-->
<tar tarfile="${linux.app.dir}/tmp/install.tar"
basedir="${linux.app.dir}/tmp"/>
<gzip zipfile="${linux.app.dir}/tmp/install.tar.gz"
src="${linux.app.dir}/tmp/install.tar"/>
<concat destfile="${linux.app.dir}/${package.name}-${sip-communicator.version}-linux.bin"
binary="true">
<fileset dir="${inst.resrc}/linux/">
<include name="sfx-header"/>
</fileset>
<fileset dir="${linux.app.dir}/tmp">
<include name="install.tar.gz"/>
</fileset>
</concat>
<chmod file="${linux.app.dir}/${package.name}-${sip-communicator.version}-linux.bin" perm="+x"/>
<!-- Delete the temp directory-->
<delete dir="${linux.app.dir}/tmp"/>
<delete file="${inst.resrc}/linux/felix.client.run.properties"/>
<delete quiet="yes" failonerror="false">
<fileset dir="${linux.app.dir}">
<include name="tmp-*"/>
</fileset>
</delete>
</target>
<target name="clean-install-windows">
<delete dir="${windows.app.dir}"/>
<mkdir dir="${windows.app.dir}"/>
<mkdir dir="${windows.app.dir}/tmp"/>
</target>
<target name="build-installation-wix"
depends="load-properties">
<property name="windows_native_path" value="${sc.basedir}\lib\native\windows"/>
<property name="windows.jre.arch.file" value="${windows.jre.file}"/>
<condition property="windows.jre.arch.zip" value="${windows.jre.zip}">
<isset property="windows.jre.zip" />
</condition>
<property name="windows.download.link" value="${link.download.windows32}"/>
<property name="windows.package.name.suffix" value="x86.exe"/>
<property name="windows.msi.package.name.suffix" value="x86.msi"/>
<property name="windows.arch" value="32"/>
<property name="mingw.home" value="C:/mingw/x86" />
<antcall target="build-installation-wix-base" />
</target>
<target name="build-installation-wix-64"
depends="load-properties">
<property name="windows_native_path" value="${sc.basedir}\lib\native\windows-64"/>
<property name="windows.jre.arch.file" value="${windows.jre64.file}"/>
<condition property="windows.jre.arch.zip" value="${windows.jre64.zip}">
<isset property="windows.jre64.zip" />
</condition>
<property name="windows.download.link" value="${link.download.windows64}"/>
<property name="windows.package.name.suffix" value="x64.exe"/>
<property name="windows.msi.package.name.suffix" value="x64.msi"/>
<property name="windows.arch" value="64"/>
<property name="mingw.home" value="C:/mingw/x64" />
<antcall target="build-installation-wix-base" />
</target>
<target name="unzip-windows-jre" if="windows.jre.arch.zip.isset">
<unzip
src="${unzip.windows.jre.src}"
dest="${unzip.windows.jre.dest}" />
<property name="unzip.windows.jre.dir" value="" />
<delete failonerror="false" includeemptydirs="true" quiet="true">
<fileset
casesensitive="false"
defaultexcludes="false"
dir="${unzip.windows.jre.dest}/jre">
<include name="bin/rmid.exe" />
<include name="bin/rmiregistry.exe" />
<include name="bin/tnameserv.exe" />
<include name="bin/keytool.exe" />
<include name="bin/kinit.exe" />
<include name="bin/klist.exe" />
<include name="bin/ktab.exe" />
<include name="bin/policytool.exe" />
<include name="bin/orbd.exe" />
<include name="bin/servertool.exe" />
<include name="bin/javaws.exe" />
<include name="lib/javaws.jar" />
<include name="lib/javaws/**" />
<include name="bin/javacpl.exe" />
<include name="bin/jucheck.exe" />
<include name="bin/jusched.exe" />
<include name="bin/wsdetect.dll" />
<include name="bin/npjpi*.dll" />
<include name="bin/npjava11.dll" />
<include name="bin/npjava12.dll" />
<include name="bin/npjava13.dll" />
<include name="bin/npjava14.dll" />
<include name="bin/npjava32.dll" />
<include name="bin/npoji610.dll" />
<include name="bin/regutils.dll" />
<include name="bin/axbridge.dll" />
<include name="bin/deploy.dll" />
<include name="bin/jpicom.dll" />
<include name="bin/javacpl.cpl" />
<include name="bin/jpiexp.dll" />
<include name="bin/jpinscp.dll" />
<include name="bin/jpioji.dll" />
<include name="bin/jpishare.dll" />
<include name="lib/deploy.jar" />
<include name="lib/plugin.jar" />
<include name="bin/new_plugin/**" />
<include name="bin/jp2*.exe" />
<include name="lib/deploy/**" />
<include name="bin/jqs*.exe" />
</fileset>
</delete>
</target>
<target name="build-installation-wix-base"
depends="clean-install-windows,define-ant-contrib-task">
<property name="windows.package.name"
value="${package.name}-${sip-communicator.version}-${windows.package.name.suffix}"/>
<property name="windows.msi.package.name"
value="${package.name}-${sip-communicator.version}-${windows.msi.package.name.suffix}"/>
<!--
This versionupdate.properties file isn't of interest to the MSI but
is necessary for the site.
-->
<propertyfile file="${windows.app.dir}/versionupdate.properties">
<entry key="last_version" value="${sip-communicator.version}" />
<entry key="download_link"
value="${windows.download.link}" />
<entry key="changes_html" value="updates/index.html" />
</propertyfile>
<!-- removes spaces,-,_ from application name if any -->
<propertyregex property="app.exe.filename"
input="${application.name}"
regexp="[ -_]"
replace=""
override="true"
global="true"
defaultValue="${application.name}"/>
<!-- if wix.app.launcher.name is not set use app.exe.filename
If using wix.app.launcher.name make sure not to use spaces,-,_
in the name.
-->
<condition property="wix.app.launcher.name"
value="${app.exe.filename}">
<not>
<isset property="wix.app.launcher.name" />
</not>
</condition>
<!--
Prepare for the execution of heat.exe (which is part of the
preparation for the execution of candle.exe).
-->
<property name="light.dir" value="${windows.app.dir}/tmp/light" />
<mkdir dir="${light.dir}" />
<!-- Build run.exe (which is the launcher of the application). -->
<exec
dir="${src}/native/windows/run"
executable="make.exe"
failonerror="true">
<env key="PATH" path="${mingw.home}/bin;${env.PATH}" />
<arg value="PRODUCTNAME=${application.name}" />
<arg value="MINGW_HOME=${mingw.home}" />
<arg value="TARGET_DIR=${light.dir}" />
<arg value="PRODUCTBUILDVERSION=${sip-communicator.version}" />
<arg value="TARGET_BASENAME=${wix.app.launcher.name}" />
</exec>
<antcall target="wix-sign-file">
<param name="file.to.sign" value="${light.dir}/${wix.app.launcher.name}.exe"/>
</antcall>
<delete>
<fileset dir="${light.dir}">
<include name="config.h" />
<include name="run.res" />
</fileset>
</delete>
<copy todir="${light.dir}" overwrite="true">
<fileset dir="${inst.resrc}/windows">
<include name="sc-logo.ico" />
</fileset>
</copy>
<mkdir dir="${light.dir}/lib" />
<copy todir="${light.dir}/lib" overwrite="true">
<fileset dir="${sc.basedir}/lib">
<include name="*.jar" />
</fileset>
<fileset dir="${sc.basedir}/lib/os-specific/windows">
<include name="*.jar" />
<exclude name="jmf.jar"/>
<exclude name="sound.jar"/>
</fileset>
<fileset dir="${sc.basedir}/lib">
<include name="felix.client.run.properties" />
</fileset>
<fileset dir="${sc.basedir}/resources/install">
<include name="logging.properties" />
</fileset>
</copy>
<!-- Add the windows specific bundle path in the felix.client.run.properties file -->
<echo file="${light.dir}/lib/felix.client.run.properties"
append="true">felix.auto.start.14= reference:file:sc-bundles/windows-clean-shutdown.jar
</echo>
<mkdir dir="${light.dir}/lib/bundle" />
<copy todir="${light.dir}/lib/bundle" overwrite="true">
<fileset dir="${sc.basedir}/lib/bundle">
<include name="*.jar" />
<exclude name="junit.jar" />
</fileset>
</copy>
<mkdir dir="${light.dir}/native" />
<copy todir="${light.dir}/native" overwrite="true">
<fileset dir="${windows_native_path}">
<include name="*" />
</fileset>
</copy>
<antcall target="wix-sign-dlls">
<param name="folder.to.sign" value="${light.dir}/native"/>
</antcall>
<mkdir dir="${light.dir}/sc-bundles" />
<copy todir="${light.dir}/sc-bundles" overwrite="true">
<fileset dir="${sc.basedir}/sc-bundles">
<include name="*.jar" />
<exclude name="*slick.jar" />
</fileset>
<fileset dir="${sc.basedir}/sc-bundles/os-specific/windows">
<include name="*.jar" />
<exclude name="*slick.jar" />
</fileset>
</copy>
<!--
Include a private Java Runtime Environment if it has been specified.
-->
<condition property="windows.jre.arch.zip.isset">
<and>
<isset property="windows.jre.arch.zip" />
<not>
<equals arg1="${windows.jre.arch.zip}" arg2="" />
</not>
</and>
</condition>
<antcall target="unzip-windows-jre">
<param name="unzip.windows.jre.src" value="${windows.jre.arch.zip}" />
<param name="unzip.windows.jre.dest" value="${light.dir}" />
</antcall>
<!-- Include any additional files if provided. -->
<copy todir="${light.dir}">
<fileset
casesensitive="false"
dir="${inst.resrc}/windows/installer-windows.wxs_FILES"
erroronmissingdir="false"
includes="**" />
</copy>
<!--
This update-location.properties file is the only of interest to the
MSI i.e. it gets installed on the user machine.
-->
<copy
file="${inst.resrc}/windows/update-location.properties"
todir="${light.dir}"
overwrite="true" />
<property name="wix.home" value="C:\Program Files\WiX" />
<!-- Execute heat.exe -->
<exec
executable="${wix.home}\heat.exe"
dir="${light.dir}"
failonerror="true">
<arg value="dir" />
<arg value="." />
<arg value="-nologo" />
<arg value="-ag" />
<arg value="-cg" />
<arg value="ComponentGroup_HeatExe" />
<arg value="-out" />
<arg value="${windows.app.dir}\tmp\heat.wxs" />
<arg value="-sfrag" />
<arg value="-suid" />
<!--
Suppress SelfReg because we do not have files that need it and
we do not want the private Java Runtime Environment to end up
registering such files.
-->
<arg value="-scom" />
<arg value="-sreg" />
<arg value="-svb6" />
<arg value="-var" />
<arg value="var.SourceDir" />
</exec>
<xslt
in="${windows.app.dir}/tmp/heat.wxs"
out="${windows.app.dir}/tmp/component-defines.wxi"
style="${inst.resrc}/windows/heat-component-defines.xsl" />
<xslt
in="${windows.app.dir}/tmp/heat.wxs"
out="${windows.app.dir}/tmp/component-refs.wxi"
style="${inst.resrc}/windows/heat-component-refs.xsl" />
<condition property="windows.is.64" value="yes" else="no">
<equals arg1="${windows.arch}" arg2="64" />
</condition>
<!--
Build cleansweep.exe because it is to be included in the setup by
candle.exe
-->
<exec
dir="${src}/native/windows/setup/cleansweep"
executable="make.exe"
failonerror="true">
<env key="PATH" path="${mingw.home}/bin;${env.PATH}" />
<arg value="PRODUCTNAME=${application.name}" />
<arg value="MINGW_HOME=${mingw.home}" />
<arg value="TARGET_DIR=${light.dir}" />
</exec>
<antcall target="wix-sign-file">
<param name="file.to.sign" value="${light.dir}/cleansweep.exe"/>
</antcall>
<delete>
<fileset dir="${light.dir}">
<include name="config.h" />
<include name="cleansweep.res" />
</fileset>
</delete>
<!-- prepare properties for executing candle.exe -->
<condition property="candle.var.Platform" value="x64" else="x86">
<equals arg1="${windows.arch}" arg2="64" />
</condition>
<condition
property="candle.arg.var.JRESetup"
value="-dJRESetup=${windows.jre.arch.file}"
else="-nologo">
<and>
<isset property="windows.jre.arch.file" />
<not>
<equals arg1="${windows.jre.arch.file}" arg2="" />
</not>
<not>
<isset property="windows.jre.arch.zip.isset" />
</not>
</and>
</condition>
<!-- should we create a separate msi target -->
<condition property="msi.var.store" value="true" else="false">
<equals arg1="${wix.store.msi}" arg2="true" />
</condition>
<antcall target="build-installation-wix-msi">
<param name="msi.var.compress" value="high"/>
</antcall>
<move
failonerror="false"
file="${windows.app.dir}/tmp/setup.msi"
preservelastmodified="true"
tofile="${windows.app.dir}\${windows.msi.package.name}" />
<!-- now build msi needed for the exe distribution without compression -->
<antcall target="build-installation-wix-msi">
<param name="msi.var.compress" value="none"/>
<param name="wix.store.msi" value="true"/>
</antcall>
<!-- Bootstrap the MSI into an EXE. -->
<exec
dir="${windows.app.dir}/tmp"
executable="${inst.resrc}/windows/xz.exe"
failonerror="true">
<arg value="-zk9ev" />
<arg value="setup.msi" />
</exec>
<exec
dir="${src}/native/windows/setup"
executable="make.exe"
failonerror="true">
<env key="PATH" path="${mingw.home}/bin;${env.PATH}" />
<arg value="MINGW_HOME=${mingw.home}" />
<arg value="TARGET_DIR=${windows.app.dir}/tmp" />
<arg value="PRODUCTBUILDVERSION=${sip-communicator.version}" />
</exec>
<antcall target="wix-sign-file">
<param name="file.to.sign" value="${windows.app.dir}\tmp\setup.exe"/>
</antcall>
<move
file="${windows.app.dir}/tmp/setup.exe"
preservelastmodified="true"
tofile="${windows.app.dir}\${windows.package.name}" />
<!-- before deleting try building the deltas -->
<antcall target="build-wix-delta-updates"/>
<delete dir="${light.dir}" />
<delete dir="${windows.app.dir}/tmp" />
</target>
<target name="build-installation-wix-msi" if="wix.store.msi">
<!-- if application publisher is not set use application name -->
<condition property="application.publisher"
value="${application.name}">
<not>
<isset property="application.publisher" />
</not>
</condition>
<!-- Finish the preparation for the execution of candle.exe -->
<filter token="APP_EMAIL" value="${application.email}" />
<filter token="APP_NAME" value="${application.name}" />
<filter token="APP_LAUNCHER_NAME" value="${wix.app.launcher.name}" />
<filter token="APP_WEB" value="${application.web}" />
<filter token="APP_PUBLISHER" value="${application.publisher}" />
<filter token="PRODUCTBUILDVERSION" value="${sip-communicator.version}" />
<filter token="WelcomeText1" value="${installer.welcome.wtext1}" />
<filter token="WelcomeText2" value="${installer.welcome.wtext2}" />
<filter token="WelcomeText3" value="${installer.welcome.wtext3}" />
<filter token="WINDOWS_IS_64" value="${windows.is.64}" />
<filter token="WIX_PRODUCT_ID" value="${wix.product.id}" />
<filter token="WIX_UPGRADE_CODE" value="${wix.upgrade.code}" />
<filter token="WIX_COMPRESS_LEVEL" value="${msi.var.compress}" />
<copy
todir="${windows.app.dir}/tmp"
overwrite="true"
filtering="yes">
<fileset dir="${inst.resrc}/windows">
<include name="*.wxl" />
<include name="installer-windows.wxs" />
<include name="SCRegistrySpec.wxi" />
<include name="windows_shortcut_specification.wxi" />
</fileset>
</copy>
<!-- Execute candle.exe -->
<exec
executable="${wix.home}\candle.exe"
dir="${windows.app.dir}/tmp"
failonerror="true">
<arg value="-nologo" />
<arg value="-dcodepage=1252" />
<arg value="-dPlatform=${candle.var.Platform}" />
<arg value="-ext" />
<arg value="WixUIExtension" />
<arg value="-ext" />
<arg value="WixUtilExtension" />
<arg value="-dSourceDir=light" />
<arg value="${candle.arg.var.JRESetup}" />
<arg value="installer-windows.wxs" />
</exec>
<!-- Finish the preparation for the execution of light.exe -->
<copy todir="${light.dir}" overwrite="true">
<fileset dir="${inst.resrc}/doc">
<include name="License.rtf" />
</fileset>
<fileset dir="${inst.resrc}/windows">
<include name="wix-*.jpg" />
</fileset>
</copy>
<!-- Execute light.exe -->
<exec
executable="${wix.home}\light.exe"
dir="${light.dir}"
failonerror="true">
<arg value="-nologo" />
<arg value="-ext" />
<arg value="WixUIExtension" />
<arg value="-ext" />
<arg value="WixUtilExtension" />
<arg value="-cultures:en-us" />
<arg value="-loc" />
<arg value="${windows.app.dir}\tmp\en-us.wxl" />
<arg value="-out" />
<arg value="${windows.app.dir}\tmp\setup.msi" />
<arg value="${windows.app.dir}\tmp\installer-windows.wixobj" />
</exec>
<!-- create transform files for the supported setup locales -->
<antcall target="build-installation-wix-locale">
<param name="locale.name" value="fr-fr"/>
<param name="locale.codepage" value="1252"/>
</antcall>
<!--antcall target="build-installation-wix-locale">
<property name="locale.name" value="bg-bg"/>
<property name="locale.codepage" value="1251"/>
</antcall-->
<!-- After we have created all transform files for all locales,
embed them into the setup msi one by one,
the last param is the LCID in order language to be
autoselected when msi is started
LCID info at:
http://msdn.microsoft.com/en-us/library/0h88fahh(v=vs.85).aspx
Note(2011-09-16 damencho):
every language added must be listed and in installer-windows.wxs
in the language attribute in Package and UpgradeVersion.
-->
<exec
executable="cscript.exe"
dir="${light.dir}"
failonerror="true">
<arg value="${inst.resrc}\windows\WiSubStg.vbs" />
<arg value="${windows.app.dir}\tmp\setup.msi" />
<arg value="${windows.app.dir}\tmp\fr-fr.mst" />
<arg value="1036" />
</exec>
<!--exec
executable="cscript.exe"
dir="${light.dir}"
failonerror="true">
<arg value="${inst.resrc}\windows\WiSubStg.vbs" />
<arg value="${windows.app.dir}\tmp\setup.msi" />
<arg value="${windows.app.dir}\tmp\bg-bg.mst" />
<arg value="1026" />
</exec-->
<antcall target="wix-sign-file">
<param name="file.to.sign" value="${windows.app.dir}\tmp\setup.msi"/>
</antcall>
</target>
<!-- Creates localized msi installers and the resulting
transform files-->
<target name="build-installation-wix-locale">
<!-- Execute candle.exe for locale.name-->
<exec
executable="${wix.home}\candle.exe"
dir="${windows.app.dir}/tmp"
failonerror="true">
<arg value="-nologo" />
<arg value="-dcodepage=${locale.codepage}" />
<arg value="-dPlatform=${candle.var.Platform}" />
<arg value="-ext" />
<arg value="WixUIExtension" />
<arg value="-ext" />
<arg value="WixUtilExtension" />
<arg value="-dSourceDir=light" />
<arg value="${candle.arg.var.JRESetup}" />
<arg value="installer-windows.wxs" />
</exec>
<!-- Execute light.exe for locale.name -->
<exec
executable="${wix.home}\light.exe"
dir="${light.dir}"
failonerror="true">
<arg value="-nologo" />
<arg value="-ext" />
<arg value="WixUIExtension" />
<arg value="-ext" />
<arg value="WixUtilExtension" />
<arg value="-cultures:${locale.name}" />
<arg value="-loc" />
<arg value="${windows.app.dir}\tmp\${locale.name}.wxl" />
<arg value="-out" />
<arg value="${windows.app.dir}\tmp\setup_${locale.name}.msi" />
<arg value="${windows.app.dir}\tmp\installer-windows.wixobj" />
</exec>
<exec
executable="${wix.home}\torch.exe"
dir="${light.dir}"
failonerror="true">
<arg value="-p" />
<arg value="-t" />
<arg value="language" />
<arg value="${windows.app.dir}\tmp\setup.msi" />
<arg value="${windows.app.dir}\tmp\setup_${locale.name}.msi" />
<arg value="-out" />
<arg value="${windows.app.dir}\tmp\${locale.name}.mst" />
</exec>
</target>
<target name="build-wix-delta-updates"
if="delta.history.location"
depends="define-ant-contrib-task">
<!-- Find all previous builds we have to build deltas for them -->
<foreach param="build-location" target="-make-wix-delta"
inheritall="true" inheritrefs="true">
<path>
<dirset dir="${delta.history.location}">
<include name="*"/>
</dirset>
</path>
</foreach>
<!-- copy data for next delta builds-->
<mkdir dir="${delta.history.location}/${build.label}/${windows.arch}"/>
<copy file="${windows.app.dir}\tmp\setup.msi"
todir="${delta.history.location}/${build.label}/${windows.arch}"/>
<!-- now delete old one -->
<antcall target="-delete-oldest-delta-data"/>
</target>
<target name="-make-wix-delta">
<basename property="old.wix.build" file="${build-location}"/>
<!-- we must skip building deltas for current build
and if the source setup file is missing
-->
<condition property="process.delta">
<and>
<not>
<equals arg1="${old.wix.build}" arg2="${build.label}"/>
</not>
<available file="${build-location}\${windows.arch}\setup.msi"/>
</and>
</condition>
<antcall target="-make-wix-delta-msi"/>
</target>
<target name="-make-wix-delta-msi" if="process.delta">
<echo message="Creating msi delta for ${old.wix.build}-${build.label}"/>
<!-- make the actual diff -->
<exec executable="${inst.resrc}\windows\bsdiff.exe" failonerror="true">
<arg value="${build-location}\${windows.arch}\setup.msi"/>
<arg value="${windows.app.dir}\tmp\setup.msi"/>
<arg value="${windows.app.dir}\tmp\setup.bspatch"/>
</exec>
<exec
executable="cscript.exe"
dir="${light.dir}"
outputproperty="old.packagecode"
failonerror="true">
<arg value="//NoLogo" />
<arg value="${inst.resrc}\windows\WiSumInf.vbs" />
<arg value="${build-location}\${windows.arch}\setup.msi" />
</exec>
<echo message="Old package code is: ${old.packagecode}"/>
<length
file="${build-location}/${windows.arch}/setup.msi"
property="old.packagesize" />
<echo message="Old package size is: ${old.packagesize}"/>
<exec
dir="${src}/native/windows/setup"
executable="make.exe"
failonerror="true">
<env key="PATH" path="${mingw.home}/bin;${env.PATH}" />
<arg value="MINGW_HOME=${mingw.home}" />
<arg value="TARGET_DIR=${windows.app.dir}/tmp" />
<arg value="PACKAGECODE=${old.packagecode}" />
<arg value="PACKAGESIZE=${old.packagesize}" />
<arg value="PRODUCTBUILDVERSION=${sip-communicator.version}" />
</exec>
<antcall target="wix-sign-file">
<param name="file.to.sign" value="${windows.app.dir}\tmp\setup.exe"/>
</antcall>
<move
file="${windows.app.dir}/tmp/setup.exe"
preservelastmodified="true"
tofile="${windows.app.dir}\${package.name}-${sip-communicator.version}-delta-${old.wix.build}-${windows.package.name.suffix}" />
</target>
<target name="wix-sign-file" if="sign.cert.file">
<exec executable="${inst.resrc}/windows/signtool.exe"
failonerror="false">
<arg value="sign" />
<arg value="/d" />
<arg value="${application.name}" />
<arg value="/t" />
<arg value="http://tsa.starfieldtech.com" />
<arg value="/f" />
<arg value="${sign.cert.file}" />
<arg value="/p" />
<arg value="${sign.cert.password}" />
<arg value="${file.to.sign}" />
</exec>
</target>
<!-- signs all dll files in folder - $folder.to.sign
do it if $sign.cert.file is available -->
<target name="wix-sign-dlls" depends="define-ant-contrib-task">
<foreach param="file.to.sign" target="wix-sign-file"
inheritall="true" inheritrefs="true">
<path>
<fileset dir="${folder.to.sign}">
<include name="*.dll"/>
</fileset>
</path>
</foreach>
</target>
<!-- - - - - - - - - - - BUILDING RELEASE PACKAGES - - - - - - - - - - - -->
<!-- Internal target called by the "clean target" - removes the macosx-specific file -->
<!-- we only execute if at least one (in this case the first) of the links we are
deleting exist as otherwise we see a bunch of warnings on every compile. -->
<available file="${macosx.resrc.dir}/logging.properties" property="macResourcesExist"/>
<target name="clean-macosx" if="macResourcesExist">
<delete failonerror="false" file="${macosx.resrc.dir}/logging.properties"/>
<delete failonerror="false" file="${macosx.resrc.dir}/felix.client.run.properties"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/libAEGetURLEventHandlerAgent.jnilib"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Headers"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Resources"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Growl"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Versions/Current"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Headers"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Resources"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Growl"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Versions/Current"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Headers"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources/fr_CA.lproj"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Sparkle"/>
<symlink action="delete" failonerror="false"
link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Versions/Current"/>
</target>
<target name="macosx" depends="load-properties,define-ant-contrib-task"
description="Create an .app package for MACOSX">
<taskdef name="jarbundler"
classname="net.sourceforge.jarbundler.JarBundler"/>
<mkdir dir="${macosx.app.dir}"/>
<property name="macosx.stubfile"
value="${macosx.resrc.dir}/JavaApplicationStub"/>
<condition property="macosx.stubfile"
value="/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub">
<equals arg1="${os.name}"
arg2="Mac OS X"
casesensitive="false"
trim="true"/>
</condition>
<!-- Prepare the logging.properties file for macosx -->
<copy file="${inst.resrc}/logging.properties"
tofile="${macosx.resrc.dir}/logging.properties"
overwrite="true"/>
<replace file="${macosx.resrc.dir}/logging.properties"
token="java.util.logging.FileHandler.pattern = %h/.sip-communicator/log"
value="java.util.logging.FileHandler.pattern = log"/>
<!-- Prepare the felix.client.run.properties file for macosx -->
<copy file="${lib}/felix.client.run.properties"
tofile="${macosx.resrc.dir}/felix.client.run.properties"
overwrite="true"/>
<replace file="${macosx.resrc.dir}/felix.client.run.properties"
token="swingnotification.jar">
<replacevalue><![CDATA[swingnotification.jar reference\:file\:sc-bundles/growlnotification.jar]]></replacevalue>
</replace>
<!-- Remove the reference to the update bundle -->
<replace file="${macosx.resrc.dir}/felix.client.run.properties"
token="reference:file:sc-bundles/update.jar"
value=""/>
<!-- colons can be escaped after some modifications -->
<replace file="${macosx.resrc.dir}/felix.client.run.properties"
token="reference\:file\:sc-bundles/update.jar"
value=""/>
<replaceregexp file="${macosx.resrc.dir}/felix.client.run.properties"
match="^org.osgi.framework.storage=\$\{user.home\}/.sip-communicator/sip-communicator.bin"
replace="org.osgi.framework.storage=$\{user.home\}/Library/Application Support/${application.name}/sip-communicator.bin"
flags="m"/>
<!-- We copy macosx-specific bundles from
sc-bundles/os-specific/macosx to sc-bundles -->
<copy todir="${bundles.dest}">
<fileset dir="${bundles.dest.mac}">
<include name="**/*.jar"/>
</fileset>
</copy>
<!-- Delete the old .app if it exists -->
<delete dir="${macosx.app.dir}/${application.name}.app"
quiet="yes" failonerror="false"/>
<!-- Delete the old tmp if it exists -->
<delete dir="${macosx.app.dir}/tmp"
quiet="yes" failonerror="false"/>
<mkdir dir="${macosx.app.dir}/tmp"/>
<!-- Sparkle needs the build number. If it is not
available, we use the normal build label -->
<condition property="sparkle.build"
value="${sparkle}"
else="${build.label}">
<isset property="sparkle"/>
</condition>
<condition property="jvmarg"
value="-client -Xmx256m"
else="" >
<os arch="i386" />
</condition>
<!-- removes any spaces from application name if any -->
<propertyregex property="macosx.stub.filename"
input="${application.name}"
regexp=" "
replace=""
override="true"
global="true"
defaultValue="${application.name}"/>
<copy file="${macosx.stubfile}"
tofile="${macosx.app.dir}/tmp/${macosx.stub.filename}"/>
<!-- This creates the .app for MacOSX -->
<jarbundler dir="${macosx.app.dir}"
name="${application.name}"
shortname="${application.name}"
signature="sipc"
mainclass="net.java.sip.communicator.launcher.SIPCommunicator"
icon="resources/images/logo/sc_logo_128x128.icns"
jvmversion="1.5+"
version="${sip-communicator.version}"
build="${sparkle.build}"
infostring="${application.name}"
bundleid="org.${package.name}"
stubfile="${macosx.app.dir}/tmp/${macosx.stub.filename}"
extraclasspath="/System/Library/Java"
workingdirectory="$APP_PACKAGE/Contents/Resources/Java"
vmoptions="-agentlib:AEGetURLEventHandlerAgent ${jvmarg}">
<javaproperty name="apple.laf.useScreenMenuBar" value="true"/>
<javaproperty name="apple.awt.brushMetalRounded" value="true"/>
<javaproperty name="apple.awt.showGrowBox" value="true"/>
<javaproperty name="java.library.path"
value="$JAVAROOT/lib/native/mac:${system.DYLD_LIBRARY_PATH}"/>
<javaproperty name="jna.library.path"
value="$JAVAROOT/lib/native/mac:${system.DYLD_LIBRARY_PATH}"/>
<javaproperty name="net.java.sip.communicator.SC_HOME_DIR_NAME"
value="${application.name}"/>
<!-- Tell felix to run sip-communicator -->
<javaproperty name="felix.config.properties"
value="file:felix.client.run.properties"/>
<!-- Tell java.util.logging about our logging preferences -->
<javaproperty name="java.util.logging.config.file"
value="logging.properties"/>
<jarfileset dir=".">
<include name="lib/*.jar" />
<include name="lib/os-specific/mac/*.jar" />
<include name="lib/bundle/*.jar" />
<exclude name="lib/bundle/junit.jar" />
<include name="lib/native/mac/*.jnilib" />
<include name="lib/native/mac/*.dylib" />
<exclude name="lib/native/mac/libgrowl4j.dylib" />
<exclude name="lib/native/mac/libsparkle_init.dylib" />
<include name="${bundles.dest}/*.jar" />
<exclude name="${bundles.dest}/*-slick.jar" />
<exclude name="${bundles.dest}/sparkle.jar" />
<exclude name="${bundles.dest}/update.jar" />
<include name="resources/images/logo/sc_logo_128x128.icns" />
</jarfileset>
<javafilelist dir="${macosx.resrc.dir}"
files="logging.properties"/>
<javafilelist dir="${macosx.resrc.dir}"
files="felix.client.run.properties"/>
</jarbundler>
<!-- Install the Growl Framework in the application package -->
<mkdir dir="${macosx.app.dir}/${application.name}.app/Contents/Frameworks"/>
<unzip src="${macosx.resrc.dir}/GrowlFramework.zip"
dest="${macosx.app.dir}/${application.name}.app/Contents/Frameworks"/>
<!-- Ant unzip tasks does not preserve symlinks, so we recreate them -->
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Versions/Current"
resource="./A"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Headers"
resource="./Versions/Current/Headers"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Resources"
resource="./Versions/Current/Resources"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Growl.framework/Growl"
resource="./Versions/Current/Growl"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Versions/Current"
resource="./A"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Headers"
resource="./Versions/Current/Headers"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Resources"
resource="./Versions/Current/Resources"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/GrowlFramework/Legacy/Growl.framework/Growl"
resource="./Versions/Current/Growl"/>
<!-- Add the url types in the Info.plist file -->
<replace file="${macosx.app.dir}/${application.name}.app/Contents/Info.plist">
<replacetoken><![CDATA[<key>CFBundleName</key>]]></replacetoken>
<replacevalue><![CDATA[<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>sip URI</string>
<key>CFBundleURLSchemes</key>
<array>
<string>sip</string>
</array>
</dict>
<dict>
<key>CFBundleURLName</key>
<string>xmpp URI</string>
<key>CFBundleURLSchemes</key>
<array>
<string>xmpp</string>
</array>
</dict>
</array>
<key>CFBundleName</key>]]></replacevalue>
</replace>
<symlink resource="lib/native/mac/libAEGetURLEventHandlerAgent.jnilib"
link="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/libAEGetURLEventHandlerAgent.jnilib"/>
<copy file="${macosx.resrc.dir}/libgrowl4j.dylib"
todir="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/lib/native/mac/"/>
<!-- Delete the tmp if it exists -->
<delete dir="${macosx.app.dir}/tmp"
quiet="yes" failonerror="false"/>
</target>
<!-- Create a MacOSX application package with Sparkle support.
Executed only if the sparkle label property is set, i.e. if the
package is built from CruiseControl -->
<target name="macosx-sparkle" depends="macosx"
if="sparkle"
description="Create an .app package for MACOSX with Sparkle support">
<!-- Add the sparkle bundle path in the felix.client.run.properties file -->
<echo file="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/felix.client.run.properties"
append="true">felix.auto.start.71= reference:file:sc-bundles/sparkle.jar
</echo>
<!-- Add the Sparkle bundle and JNI to the application package -->
<copy file="${bundles.dest}/sparkle.jar"
todir="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/sc-bundles/"/>
<copy file="lib/native/mac/libsparkle_init.dylib"
todir="${macosx.app.dir}/${application.name}.app/Contents/Resources/Java/lib/native/mac/"/>
<!-- Add public key file to the application bundle -->
<copy file="${macosx.resrc.dir}/sparkle_dsa_pub.pem"
todir="${macosx.app.dir}/${application.name}.app/Contents/Resources/"/>
<!-- Add the Sparkle properties in the Info.plist file -->
<replace file="${macosx.app.dir}/${application.name}.app/Contents/Info.plist">
<replacetoken><![CDATA[<key>CFBundleName</key>]]></replacetoken>
<replacevalue><![CDATA[<key>SUCheckAtStartup</key>
<string>YES</string>
<key>SUScheduledCheckInterval</key>
<string>86400</string>
<key>SUPublicDSAKeyFile</key>
<string>sparkle_dsa_pub.pem</string>
<key>SUFeedURL</key>
<string>_DOWNLOAD_LINK_</string>
<key>SUShowReleaseNotes</key>
<string>YES</string>
<key>CFBundleName</key>]]></replacevalue>
</replace>
<!-- Now replace the download link-->
<replace file="${macosx.app.dir}/${application.name}.app/Contents/Info.plist">
<replacefilter token="_DOWNLOAD_LINK_" value="${link.updates.macosx}"/>
</replace>
<!-- Install the Sparkle Framework in the application package -->
<mkdir dir="${macosx.app.dir}/${application.name}.app/Contents/Frameworks"/>
<unzip src="${macosx.resrc.dir}/Sparkle.framework.zip"
dest="${macosx.app.dir}/${application.name}.app/Contents/Frameworks"/>
<!-- Ant unzip tasks does not preserve symlinks, so we recreate them -->
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Versions/Current"
resource="./A"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Headers"
resource="./Versions/Current/Headers"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources"
resource="./Versions/Current/Resources"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Sparkle"
resource="./Versions/Current/Sparkle"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources/fr_CA.lproj"
resource="./fr.lproj"/>
<symlink link="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources/pt.lproj"
resource="./pt_BR.lproj" failonerror="false"/>
<!-- Restore the file permissions to the Sparke relaunch tool -->
<chmod file="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Resources/relaunch"
perm="ugo+rx"/>
<chmod file="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Versions/A/Sparkle"
perm="ugo+rx"/>
<chmod file="${macosx.app.dir}/${application.name}.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation"
perm="ugo+rx"/>
</target>
<!-- Creates empty folders in Contents/Resources for
available languages, so macosx can switch languages -->
<target name="dmg-create-language-folders"
depends="define-ant-contrib-task">
<foreach param="file.language.resource" target="dmg-language-folder"
inheritall="true" inheritrefs="true">
<path>
<fileset dir="${sc.basedir}/resources/languages">
<include name="*.properties"/>
</fileset>
</path>
</foreach>
</target>
<target name="dmg-language-folder">
<propertyregex property="jitsi.available.lang.resource"
input="${file.language.resource}"
regexp="resources_(.*)\.properties"
select="\1"
casesensitive="false"
defaultValue="en"/>
<mkdir dir="${macosx.app.dir}/${application.name}.app/Contents/Resources/${jitsi.available.lang.resource}.lproj"/>
</target>
<!-- Create the DMG - This only works on MacOSX (need hdiutil) -->
<target name="dmg" depends="macosx-sparkle"
if="is.running.macos"
description="Create a .dmg package for MACOSX (only works on MACOSX)">
<property name="macosx.dmg.name"
value="${package.name}-${sip-communicator.version}.dmg"/>
<property name="macosx.dmg.tmpname"
value="${package.name}-tmp.dmg"/>
<delete file="${macosx.app.dir}/${macosx.dmg.name}"
quiet="yes" failonerror="false"/>
<!-- Creates empty folders in Contents/Resources for
available languages, so macosx can switch languages -->
<antcall target="dmg-create-language-folders" />
<!-- Create a temporary Disk Image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="create"/>
<arg value="-srcfolder"/>
<arg value="${macosx.app.dir}/${application.name}.app"/>
<arg value="-volname"/>
<arg value="${application.name}"/>
<arg value="-ov"/>
<arg value="${macosx.app.dir}/${macosx.dmg.tmpname}"/>
<arg value="-format"/>
<arg value="UDRW"/>
</exec>
<!-- Attach the temporary image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="attach"/>
<arg value="${macosx.app.dir}/${macosx.dmg.tmpname}"/>
<arg value="-mountroot"/>
<arg value="${release}/"/>
</exec>
<!-- Copy the background, icon and DS_Store files -->
<mkdir dir="${release}/${application.name}/.background"/>
<copy file="${macosx.resrc.dir}/dmg-background.png"
tofile="${release}/${application.name}/.background/background.png"
overwrite="true"/>
<copy file="${macosx.resrc.dir}/dmg-VolumeIcon.icns"
tofile="${release}/${application.name}/.VolumeIcon.icns"
overwrite="true"/>
<copy file="${macosx.resrc.dir}/dmg-DS_Store"
tofile="${release}/${application.name}/.DS_Store"
overwrite="true"/>
<exec executable="/Developer/Tools/SetFile" os="Mac OS X">
<arg value="-a"/>
<arg value="C"/>
<arg value="${release}/${application.name}"/>
</exec>
<!-- Add a symbolic link to the Applications directory -->
<symlink link="${release}/${application.name}" resource="/Applications"/>
<antcall target="macosx-sign-app"/>
<!-- Detach the temporary image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="detach"/>
<arg value="${release}/${application.name}"/>
</exec>
<!-- Compress it to a new image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="convert"/>
<arg value="${macosx.app.dir}/${macosx.dmg.tmpname}"/>
<arg value="-format"/>
<arg value="UDZO"/>
<arg value="-o"/>
<arg value="${macosx.app.dir}/${macosx.dmg.name}"/>
</exec>
<!-- Delete the temporary image -->
<delete file="${macosx.app.dir}/${macosx.dmg.tmpname}"
quiet="yes" failonerror="false"/>
<!-- creates the sparkle xmls -->
<antcall target="macosx-sparkle-files"/>
<antcall target="macosx-sparkle-delta-updates"/>
<antcall target="macosx-sparkle-files-finish"/>
<!-- remove folder we are done -->
<delete dir="${macosx.app.dir}/${application.name}.app"
quiet="yes" failonerror="false"/>
</target>
<!--
If there is a property enabling the keychain name
we can sign.
-->
<target name="macosx-sign-app" if="macosx.sign.keychain">
<echo message="Signing application!"/>
<!-- unlocking the keychain -->
<exec executable="/usr/bin/security" os="Mac OS X" failonerror="true">
<arg value="unlock-keychain"/>
<arg value="-p"/>
<arg value=""/>
<arg value="${macosx.sign.keychain}"/>
</exec>
<!-- signing -->
<exec executable="/usr/bin/codesign" os="Mac OS X" failonerror="true">
<arg value="-s"/>
<arg value="${macosx.sign.certid}"/>
<arg value="--keychain"/>
<arg value="${macosx.sign.keychain}"/>
<arg value="${macosx.app.dir}/${application.name}.app"/>
</exec>
<!-- locking again -->
<exec executable="/usr/bin/security" os="Mac OS X" failonerror="true">
<arg value="lock-keychain"/>
<arg value="${macosx.sign.keychain}"/>
</exec>
</target>
<target name="macosx-sparkle-files" if="sparkle.signiture.location">
<exec executable="bash" os="Mac OS X" failonerror="true"
outputproperty="signature.base64">
<arg value="-c"/>
<arg value="openssl dgst -sha1 -binary &lt; '${macosx.app.dir}/${macosx.dmg.name}' | openssl dgst -dss1 -sign ${sparkle.signiture.location} | openssl enc -base64"/>
</exec>
<length file="${macosx.app.dir}/${macosx.dmg.name}"
property="dmg.file.length" />
<copy todir="${macosx.app.dir}/sparkle">
<fileset dir="${macosx.resrc.dir}/sparkle-files/sparkle"/>
</copy>
<tstamp>
<format property="current.tstamp" pattern="d MMM yyyy HH:mm:ss"/>
</tstamp>
<filter token="BUILD" value="${sparkle.build}" />
<filter token="DATE" value="${current.tstamp}" />
<filter token="APP_NAME" value="${application.name}" />
<filter token="SPARKLE_UPDATES" value="${link.updates.macosx}" />
<filter token="SPARKLE_INDEX" value="${link.sparkle.updates.index}" />
<filter token="LEN" value="${dmg.file.length}" />
<filter token="SIGNATURE" value="${signature.base64}" />
<filter token="DOWNLOAD_DMG_LINK" value="${link.download.macosx}" />
<copy file="${macosx.resrc.dir}/sparkle-files/updates.xml"
tofile="${macosx.app.dir}/sparkle/updates-tmp.xml"
overwrite="true" filtering="yes"/>
<copy file="${macosx.resrc.dir}/sparkle-files/index-top.html"
todir="${macosx.app.dir}/sparkle"
overwrite="true" filtering="yes"/>
<get src="${link.update.changelog.prefix}/extended-changelog-${label}.html"
dest="changelog-${label}.html"
ignoreerrors="true"/>
<loadfile property="latest.changelog"
srcFile="changelog-${label}.html"
failonerror="false"/>
<!-- Load a default value if file with changelogs is missing -->
<condition property="latest.changelog" value="Nightly builds">
<not>
<isset property="latest.changelog"/>
</not>
</condition>
<concat destfile="${macosx.app.dir}/sparkle/index.html">
<fileset dir="${macosx.app.dir}/sparkle/">
<include name="index-top.html"/>
</fileset>
<propertyset>
<propertyref name="latest.changelog"/>
</propertyset>
<fileset dir="${macosx.resrc.dir}/sparkle-files">
<include name="index-bottom.html"/>
</fileset>
</concat>
<delete file="${macosx.app.dir}/sparkle/index-top.html"/>
<delete file="changelog-${label}.html"/>
</target>
<!-- task only finishes generating sparkle files if needed -->
<target name="macosx-sparkle-files-finish"
if="sparkle.signiture.location">
<!-- To be able to insert deltas in the updates xml
we use the token @SPARKLE_DELTAS@. And when finished
puting deltas (no matter if there were any at all if option
is not enabled) we must remove the SPARKLE_DELTAS token if left.
-->
<filter token="SPARKLE_DELTAS" value="" />
<move file="${macosx.app.dir}/sparkle/updates-tmp.xml"
tofile="${macosx.app.dir}/sparkle/updates.xml"
overwrite="true" filtering="yes"/>
</target>
<target name="macosx-sparkle-delta-updates"
if="delta.history.location"
depends="define-ant-contrib-task">
<!-- create temp dir for making delta diffs -->
<mkdir dir="${macosx.app.dir}/tmp"/>
<!-- Attach the current image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="attach"/>
<arg value="${macosx.app.dir}/${macosx.dmg.name}"/>
<arg value="-mountroot"/>
<arg value="${macosx.app.dir}/tmp/"/>
</exec>
<unzip src="${macosx.resrc.dir}/Sparkle.framework.zip"
dest="${macosx.app.dir}/tmp"/>
<copy file="${macosx.resrc.dir}/BinaryDelta"
todir="${macosx.app.dir}/tmp"/>
<chmod file="${macosx.app.dir}/tmp/BinaryDelta"
perm="ugo+rx"/>
<!-- Find all previous builds we have to build deltas for them -->
<foreach param="build-location" target="-make-sparkle-delta"
inheritall="true" inheritrefs="true">
<path>
<dirset dir="${delta.history.location}">
<include name="*"/>
</dirset>
</path>
</foreach>
<!-- Detach the temporary image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="detach"/>
<arg value="${macosx.app.dir}/tmp/${application.name}"/>
</exec>
<!-- delete the temp dir -->
<delete dir="${macosx.app.dir}/tmp"/>
<!-- copy data for next delta builds-->
<mkdir dir="${delta.history.location}/${sparkle.build}"/>
<copy file="${macosx.app.dir}/${macosx.dmg.name}"
tofile="${delta.history.location}/${sparkle.build}/${package.name}.dmg"/>
<!-- now delete old one -->
<antcall target="-delete-oldest-delta-data"/>
</target>
<target name="-make-sparkle-delta">
<basename property="old.sparkle.build" file="${build-location}"/>
<echo message="Creating dmg delta for ${old.sparkle.build}-${sparkle.build}"/>
<!-- create temp dir for making delta diffs -->
<mkdir dir="${macosx.app.dir}/tmp/${old.sparkle.build}"/>
<!-- Attach the image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="attach"/>
<arg value="${build-location}/${package.name}.dmg"/>
<arg value="-mountroot"/>
<arg value="${macosx.app.dir}/tmp/${old.sparkle.build}/"/>
</exec>
<!-- make the actual diff -->
<exec executable="${macosx.app.dir}/tmp/BinaryDelta"
os="Mac OS X" failonerror="true">
<arg value="create"/>
<arg value="${macosx.app.dir}/tmp/${old.sparkle.build}/${application.name}/${application.name}.app"/>
<arg value="${macosx.app.dir}/tmp/${application.name}/${application.name}.app"/>
<arg value="${macosx.app.dir}/${application.name}-${old.sparkle.build}-to-${sparkle.build}.delta"/>
</exec>
<!-- Detach the temporary image -->
<exec executable="/usr/bin/hdiutil" os="Mac OS X" failonerror="true">
<arg value="detach"/>
<arg value="${macosx.app.dir}/tmp/${old.sparkle.build}/${application.name}"/>
</exec>
<!-- delete the temp dir -->
<delete dir="${macosx.app.dir}/tmp/${old.sparkle.build}"/>
<exec executable="bash" os="Mac OS X" failonerror="true"
outputproperty="delta.signature.base64">
<arg value="-c"/>
<arg value="openssl dgst -sha1 -binary &lt; '${macosx.app.dir}/${application.name}-${old.sparkle.build}-to-${sparkle.build}.delta' | openssl dgst -dss1 -sign ${sparkle.signiture.location} | openssl enc -base64"/>
</exec>
<length file="${macosx.app.dir}/${application.name}-${old.sparkle.build}-to-${sparkle.build}.delta"
property="delta.file.length" />
<copy file="${macosx.app.dir}/sparkle/updates-tmp.xml"
tofile="${macosx.app.dir}/sparkle/updates-tmp1.xml"/>
<move file="${macosx.app.dir}/sparkle/updates-tmp1.xml"
tofile="${macosx.app.dir}/sparkle/updates-tmp.xml"
overwrite="true" filtering="yes">
<filterset recurse="false">
<filter token="SPARKLE_DELTAS" value="
&lt;enclosure type=&quot;application/octet-stream&quot;
sparkle:version=&quot;${sparkle.build}&quot; length=&quot;${delta.file.length}&quot;
sparkle:dsaSignature=&quot;${delta.signature.base64}&quot;
sparkle:deltaFrom=&quot;${old.sparkle.build}&quot;
url=&quot;${sparkle.delta.download.location}/${application.name}-${old.sparkle.build}-to-${sparkle.build}.delta&quot;/&gt;
@SPARKLE_DELTAS@
" />
</filterset>
</move>
</target>
<target name="-delete-oldest-delta-data">
<resourcecount property="build.history.current.size">
<dirset dir="${delta.history.location}">
<include name="*"/>
</dirset>
</resourcecount>
<math result="build.history.to.delete"
operand1="${build.history.current.size}"
operation="-"
operand2="${delta.history.size}"
datatype="int"/>
<timestampselector outputsetid="oldest.builds"
count="${build.history.to.delete}"
age="eldest">
<path>
<dirset dir="${delta.history.location}">
<include name="*" />
</dirset>
</path>
</timestampselector>
<foreach param="build.to.delete"
target="-delete-oldest-delta-data-folder">
<path refid="oldest.builds"/>
</foreach>
</target>
<target name="-delete-oldest-delta-data-folder">
<echo message="!!! Deleting old data dir ${build.to.delete} !!! " />
<delete dir="${build.to.delete}" failonerror="false"/>
</target>
<!-- Outputs a warning notifying the user that a dpkg tool is missing. -->
<target name="dpkg-build-warning" unless="dpkg.build.present">
<echo message="Either the ${dpkg-buildpackage} tool or the debhelper tools was not found on your system."/>
<echo message="Try installing the 'dpkg-dev' and 'debhelper' packages"/>
</target>
<!-- Create a Debian package - This needs dpkg utilities -->
<target name="deb" depends="load-properties,dpkg-build-warning,-prepare-debian-sh"
if="dpkg.build.present"
description="Create a .deb package for Debian (needs dpkg utilities)">
<!-- Prepare the changelog file -->
<copy file="${inst.resrc}/debian/changelog.tmpl"
tofile="${inst.resrc}/debian/changelog"
overwrite="true"/>
<replace file="${inst.resrc}/debian/changelog"
token="_VERSION_"
value="${sip-communicator.version}"/>
<replace file="${inst.resrc}/debian/changelog"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<get src="${link.update.changelog.prefix}/extended-changelog-${label}.txt"
dest="changelog-${label}.txt" ignoreerrors="true"/>
<loadfile property="latest.changelog"
srcFile="changelog-${label}.txt" failonerror="false"/>
<!-- Load a default value if file with changelogs is missing -->
<condition property="latest.changelog" value="Nightly builds">
<not>
<isset property="latest.changelog"/>
</not>
</condition>
<replace file="${inst.resrc}/debian/changelog"
token="_CHANGES_"
value="${latest.changelog}"/>
<delete file="changelog-${label}.txt"/>
<!-- Prepare the control file -->
<copy file="${inst.resrc}/debian/control.tmpl"
tofile="${inst.resrc}/debian/control"
overwrite="true"/>
<replace file="${inst.resrc}/debian/control"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<replace file="${inst.resrc}/debian/control"
token="_APP_NAME_"
value="${application.name}"/>
<!-- Prepare the rules file -->
<copy file="${inst.resrc}/debian/rules.tmpl"
tofile="${inst.resrc}/debian/rules"
overwrite="true"/>
<replace file="${inst.resrc}/debian/rules"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<chmod file="${inst.resrc}/debian/rules" perm="+x"/>
<!-- Prepare dirs file -->
<copy file="${inst.resrc}/debian/dirs.tmpl"
tofile="${inst.resrc}/debian/dirs"
overwrite="true"/>
<replace file="${inst.resrc}/debian/dirs"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<!-- Prepare README.Debian file -->
<copy file="${inst.resrc}/debian/README.Debian.tmpl"
tofile="${inst.resrc}/debian/README.Debian"
overwrite="true"/>
<replace file="${inst.resrc}/debian/README.Debian"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<replace file="${inst.resrc}/debian/README.Debian"
token="_APP_NAME_"
value="${application.name}"/>
<replace file="${inst.resrc}/debian/README.Debian"
token="_APP_WEB_"
value="${application.web}"/>
<!-- Prepare man page file -->
<copy file="${inst.resrc}/debian/sip-communicator.1.tmpl"
tofile="${inst.resrc}/debian/${package.name}.1"
overwrite="true"/>
<replace file="${inst.resrc}/debian/${package.name}.1"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<replace file="${inst.resrc}/debian/${package.name}.1"
token="_APP_NAME_"
value="${application.name}"/>
<!-- Prepare debian shortcuts -->
<copy file="${inst.resrc}/debian/sip-communicator.desktop.tmpl"
tofile="${inst.resrc}/debian/${package.name}.desktop"
overwrite="true"/>
<replace file="${inst.resrc}/debian/${package.name}.desktop"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<replace file="${inst.resrc}/debian/${package.name}.desktop"
token="_APP_NAME_"
value="${application.name}"/>
<copy file="${inst.resrc}/debian/sip-communicator.menu.tmpl"
tofile="${inst.resrc}/debian/${package.name}.menu"
overwrite="true"/>
<replace file="${inst.resrc}/debian/${package.name}.menu"
token="_PACKAGE_NAME_"
value="${package.name}"/>
<replace file="${inst.resrc}/debian/${package.name}.menu"
token="_APP_NAME_"
value="${application.name}"/>
<!-- Prepare icon files -->
<copy file="${inst.resrc}/debian/sip-communicator-16.xpm"
tofile="${inst.resrc}/debian/${package.name}-16.xpm"
overwrite="true"/>
<copy file="${inst.resrc}/debian/sip-communicator-32.xpm"
tofile="${inst.resrc}/debian/${package.name}-32.xpm"
overwrite="true"/>
<copy file="${inst.resrc}/debian/sip-communicator.svg"
tofile="${inst.resrc}/debian/${package.name}.svg"
overwrite="true"/>
<!-- Put the current date in the changelog -->
<tstamp>
<format property="date"
pattern="EEE, d MMM yyyy HH:mm:ss Z"
locale="en,US"/>
</tstamp>
<replace file="${inst.resrc}/debian/changelog"
token="_DATE_"
value="${date}"/>
<!-- Prepare felix.client.run.properties and put some specific bundles -->
<copy file="${lib}/felix.client.run.properties"
tofile="${inst.resrc}/debian/felix.client.run.properties"
overwrite="true"/>
<replace file="${inst.resrc}/debian/felix.client.run.properties"
token="reference:file:sc-bundles/swingnotification.jar \">
<replacevalue><![CDATA[reference:file:sc-bundles/galagonotification.jar \
reference:file:sc-bundles/swingnotification.jar \]]></replacevalue>
</replace>
<!-- Build i386 binary package -->
<exec executable="${dpkg-buildpackage}" dir="${inst.resrc}">
<arg value="-rfakeroot"/>
<arg value="-tc"/>
<arg value="-us"/>
<arg value="-uc"/>
<arg value="-b"/>
<arg value="-d"/>
<arg value="-ai386"/>
</exec>
<!-- Build amd64 binary package -->
<exec executable="${dpkg-buildpackage}" dir="${inst.resrc}">
<arg value="-rfakeroot"/>
<arg value="-tc"/>
<arg value="-us"/>
<arg value="-uc"/>
<arg value="-b"/>
<arg value="-d"/>
<arg value="-aamd64"/>
</exec>
<mkdir dir="${debian.dir}"/>
<move todir="${debian.dir}">
<fileset dir="${sc.basedir}/resources">
<include name="${package.name}*"/>
</fileset>
</move>
<!-- Only i386 for now -->
<propertyfile file="${debian.dir}/versionupdate.properties"
comment="Last Build Version">
<entry key="last_version" value="${sip-communicator.version}"/>
<entry key="download_link"
value="${link.download.debian}"/>
</propertyfile>
<!--
Copy changelogs before deleting them, this changelogs are used from
tools like Update Manager in Ubuntu distribution.
-->
<copy file="${inst.resrc}/debian/changelog"
tofile="${debian.dir}/${package.name}_${sip-communicator.version}_i386.changelog"/>
<copy file="${inst.resrc}/debian/changelog"
tofile="${debian.dir}/${package.name}_${sip-communicator.version}_amd64.changelog"/>
<!-- Delete the temporary files -->
<delete quiet="yes" failonerror="false">
<fileset dir="${inst.resrc}/debian/">
<include name="changelog"/>
<include name="control"/>
<include name="rules"/>
<include name="${package.name}.sh"/>
<include name="felix.client.run.properties"/>
<include name="dirs"/>
<include name="README.Debian"/>
<include name="${package.name}.desktop"/>
<include name="${package.name}.menu"/>
<include name="${package.name}.1"/>
<include name="${package.name}-16.xpm"/>
<include name="${package.name}-32.xpm"/>
<include name="${package.name}.svg"/>
</fileset>
</delete>
</target>
<!-- Outputs a warning notifying the user that dpkg-scanpackages is not installed. -->
<target name="dpkg-scan-warning" unless="dpkg.scan.present">
<echo message="The ${dpkg-scanpackages} tool was not found on your system."/>
<echo message="Try installing the 'dpkg-dev' package "/>
</target>
<!-- Prepare to deploy the Debian package - This needs dpkg utilities -->
<target name="deb-rel" depends="deb,dpkg-scan-warning"
if="dpkg.scan.present"
description="Prepare to deploy Debian package (needs dpkg utilities)">
<mkdir dir="${debian.binary.dir}"/>
<move todir="${debian.binary.dir}">
<fileset dir="${debian.dir}">
<include name="sip-communicator*386*"/>
</fileset>
</move>
<exec executable="${dpkg-scanpackages}"
dir="${debian.dir}"
output="${debian.binary.dir}/dpkg-scanpackages.out"
errorproperty="dpkg-scanpackages.err">
<arg value="binary"/>
<arg value="/dev/null"/>
</exec>
<exec executable="/bin/gzip"
dir="${debian.dir}"
input="${debian.binary.dir}/dpkg-scanpackages.out"
output="${debian.binary.dir}/Packages.gz">
<arg value="-9c"/>
</exec>
<!-- Delete the temporary file -->
<delete file="${debian.binary.dir}/dpkg-scanpackages.out"
quiet="yes" failonerror="false"/>
</target>
</project>