<?xml version="1.0" encoding="UTF-8"?>
<!--
    Copyright (c) 2009, 2016 IBM Corporation and others.

    This program and the accompanying materials
    are made available under the terms of the Eclipse Public License 2.0
    which accompanies this distribution, and is available at
    https://www.eclipse.org/legal/epl-2.0/

    SPDX-License-Identifier: EPL-2.0
   
    Contributors:
        IBM Corporation - initial API and implementation
 -->

<project name="org.eclipse.swt.fragment" default="" basedir=".">

	<target name="init" depends="properties">
		<property name="compilerArg" value="" />
		<condition property="fragment" value="org.eclipse.swt.${swt.ws}.${swt.os}.${swt.arch}" else="org.eclipse.swt.${swt.ws}.${swt.os}">
			<isset property="swt.arch"/>
		</condition>
		<property name="full.name" value="${fragment}_${version.suffix}" />
		<property name="fragmentdir" value="${basedir}" />
		<property name="temp.folder" value="${fragmentdir}/temp.folder" />
		<property name="plugin.destination" value="${fragmentdir}" />
		<property name="build.result.folder" value="${fragmentdir}" />
		<property name="destination" value="${fragmentdir}/target" />
		<property name="javacVerbose" value="false" />
		<property name="logExtension" value=".xml" />
		<property name="javacSource" value="1.8" />
		<property name="javacTarget" value="1.8" />
		<condition property="bootclasspath" value="">
			<equals arg1="${swt.os}" arg2="macosx"/>
		</condition>
		<path id="path_bootclasspath">
			<fileset dir="${java.home}/lib">
				<include name="*.jar" />
			</fileset>
		</path>
		<property name="bootclasspath" refid="path_bootclasspath" />
		<property name="bundleJavacSource" value="${javacSource}" />
		<property name="bundleJavacTarget" value="${javacTarget}" />
		<property name="bundleBootClasspath" value="${bootclasspath}" />
		<condition property="p2.publish.parts" value="true">
			<istrue value="${p2.gathering}" />
		</condition>
		<mkdir dir="target"/>
	</target>

	<target name="properties" if="eclipse.running">
		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />
	</target>

	<target name="build.update.jar" depends="init">
		<delete dir="${temp.folder}" />
		<mkdir dir="${temp.folder}" />
		<antcall target="build.jars" />
		<antcall target="gather.bin.parts">
			<param name="destination.temp.folder" value="${temp.folder}/" />
		</antcall>
		<zip zipfile="${plugin.destination}/${full.name}.jar" basedir="${temp.folder}/${full.name}" filesonly="false" />
		<delete dir="${temp.folder}" />
	</target>

	<target name="@dot" depends="init" unless="@dot" description="Create jar: @dot.">
		<property name="destdir" value="${temp.folder}/@dot.bin" />
		<property name="debug" value="true" />
		<property name="jar.filename" value="swt.jar" />
		<delete dir="${temp.folder}/@dot.bin" />
		<mkdir dir="${temp.folder}/@dot.bin" />
		<antcall target="copy.${swt.ws}.src"/>
		<javac destdir="${temp.folder}/@dot.bin" verbose="${javacVerbose}" debug="${debug}" failonerror="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
			<src path="${temp.folder}/@dot.src/"/>
			<compilerarg line="-log '${temp.folder}'/@dot.bin${logExtension}" compiler="org.eclipse.jdt.core.JDTCompilerAdapter" />
			<compilerarg line="${compilerArg}" compiler="org.eclipse.jdt.core.JDTCompilerAdapter" />
		</javac>
		<copy todir="${temp.folder}/@dot.bin">
			<fileset dir="${temp.folder}/@dot.src/" excludes="**/*.java,**/package.htm*,**/library/" />
		</copy>
		<mkdir dir="${build.result.folder}/@dot" />
		<copy todir="${build.result.folder}/@dot" failonerror="true">
			<fileset dir="${temp.folder}/@dot.bin" />
		</copy>
		<condition property="arch" value="${swt.arch}" else="">
			<isset property="swt.arch"/>
		</condition>
		<jar jarfile="${build.result.folder}/${jar.filename}" basedir="${temp.folder}/@dot.bin">
			<manifest>
				<attribute name="SWT-OS" value="${swt.os}"/>
				<attribute name="SWT-WS" value="${swt.ws}"/>
				<attribute name="SWT-Arch" value="${arch}"/>
			</manifest>
		</jar>
	</target>

	<target name="build.jars" depends="init">
		<available property="@dot" file="${build.result.folder}/@dot" />
		<antcall target="@dot" />
	</target>

	<target name="src.zip" depends="init" unless="src.zip">
		<mkdir dir="${build.result.folder}/" />
		<antcall target="copy.${swt.ws}.src"/>
		<zip zipfile="${build.result.folder}/src.zip">
			<fileset dir="${temp.folder}/@dot.src" includes="**/*.java"/>
			<fileset dir="${temp.folder}/@dot.src" includes="**/*.properties"/>
			<fileset    dir="${temp.folder}/@dot.src/library/" excludes="**/*.sh"/>
			<zipfileset dir="${temp.folder}/@dot.src/library/" includes="**/*.sh" filemode="755"/>
			<fileset dir="${temp.folder}/@dot.src" includes="**/version.txt"/>
			<fileset dir="${fragmentdir}" includes="about.html,about_files/"/>
		</zip>
		<delete dir="${temp.folder}/@dot.src"/>
	</target>

	<target name="copy.src" depends="init">
		<antcall target="copy.${swt.ws}.src"/>
		<copy todir="${destination.temp.folder}/" failonerror="true" overwrite="true">
			<fileset dir="${temp.folder}/@dot.src" includes="**/*.java"/>
			<fileset dir="${temp.folder}/@dot.src" includes="**/*.properties"/>
			<fileset dir="${temp.folder}/@dot.src/library/"/>
			<fileset dir="${temp.folder}/@dot.src" includes="**/version.txt"/>
			<fileset dir="${fragmentdir}" includes="about.html,about_files/"/>
		</copy>
		<delete dir="${temp.folder}/@dot.src"/>
	</target>

	<target name="copy.cocoa.src">
		<property name="copy.src.dir" value="${temp.folder}/@dot.src"/>
		<delete dir="${copy.src.dir}" quiet="true"/>
		<copy todir="${copy.src.dir}" failonerror="true" overwrite="true">
			<fileset dir="${plugindir}/Eclipse SWT/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT/common_j2se/" excludes="**/*._properties"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/bidi/"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/coolbar/"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/expand/"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/tooltip/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT WebKit/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT Custom Widgets/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/cocoa/" excludes="**/*.extras,**/*.bridgesupport"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/cocoa/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/common/"/>
		</copy>
		<antcall target="copy.translationfiles"/>
		<antcall target="replace64"/>
	</target>

	<target name="copy.gtk.src">
		<property name="copy.src.dir" value="${temp.folder}/@dot.src"/>
		<delete dir="${copy.src.dir}" quiet="true"/>
		<copy todir="${copy.src.dir}" failonerror="true" overwrite="true">
			<fileset dir="${plugindir}/Eclipse SWT/cairo/"/>
			<fileset dir="${plugindir}/Eclipse SWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT/common_j2se/" excludes="**/*._properties"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/bidi/"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/coolbar/"/>
			<fileset dir="${plugindir}/Eclipse SWT/emulated/taskbar/"/>
			<fileset dir="${plugindir}/Eclipse SWT/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT Custom Widgets/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/glx/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/cairo/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/gtk/"/>
			<fileset dir="${plugindir}/Eclipse SWT WebKit/gtk/"/>
		</copy>
		<antcall target="copy.translationfiles"/>
		<antcall target="replace64"/>
	</target>
		
	<target name="copy.win32.src">
		<property name="copy.src.dir" value="${temp.folder}/@dot.src"/>
		<delete dir="${copy.src.dir}" quiet="true"/>
		<copy todir="${copy.src.dir}" failonerror="true" overwrite="true">
			<fileset dir="${plugindir}/Eclipse SWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT/common_j2se/" excludes="**/*._properties"/>
			<fileset dir="${plugindir}/Eclipse SWT/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Accessibility/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT AWT/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Browser/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT WebKit/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT Custom Widgets/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Drag and Drop/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT OLE Win32/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT OpenGL/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT PI/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Printing/win32/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/common/"/>
			<fileset dir="${plugindir}/Eclipse SWT Program/win32/"/>
		</copy>
		<antcall target="copy.translationfiles"/>
		<antcall target="replace64"/>
	</target>

	<target name="copy.translationfiles" if="includetranslationfiles">
		<copy todir="${copy.src.dir}" failonerror="true" overwrite="true">
			<fileset dir="${plugindir}/Eclipse SWT/common_j2se/" includes="**/*._properties"/>
			<mapper type="glob" from="*._properties" to="*.properties" />
		</copy>
	</target>

	<target name="is64">
		<condition property="is64" value="true">
			<or>
				<equals arg1="${swt.arch}" arg2="x86_64"/>
				<equals arg1="${swt.arch}" arg2="ia64"/>
				<equals arg1="${swt.arch}" arg2="ppc64le"/>
				<equals arg1="${swt.arch}" arg2="s390x"/>
				<equals arg1="${swt.arch}" arg2="sparcv9"/>
				<equals arg1="${swt.arch}" arg2="aarch64"/>
			</or>
		</condition>
		<echo>Is64=${is64}</echo>
	</target>
		
    <target name="replace64" depends="is64" unless="is64">
    	<echo>Converting java files to 32 bit</echo>
    	<replace dir="${copy.src.dir}" includes="**/*.java" value="int /*long*/" token="long /*int*/"/>
    	<replace dir="${copy.src.dir}" includes="**/*.java" value="int[] /*long[]*/" token="long[] /*int[]*/"/>
    	<replace dir="${copy.src.dir}" includes="**/*.java" value="float /*double*/" token="double /*float*/"/>
    	<replace dir="${copy.src.dir}" includes="**/*.java" value="float[] /*double[]*/" token="double[] /*float[]*/"/>
    </target>

	<target name="build.sources" depends="init">
		<available property="src.zip" file="${build.result.folder}/src.zip" />
		<antcall target="src.zip" />
	</target>

	<target name="build.zips" depends="init">
	</target>

	<target name="gather.sources" depends="init" if="destination.temp.folder">
		<mkdir dir="${destination.temp.folder}/${full.name}" />
		<copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}/${full.name}/" />
		<copy todir="${destination.temp.folder}/${full.name}">
			<fileset dir="${fragmentdir}" includes="about.html,about_files/" />
		</copy>
	</target>

	<target name="gather.individual.sources" depends="init">
		<antcall target="copy.src" />
		<copy todir="${destination.temp.folder}">
			<fileset dir="${fragmentdir}" includes="about.html,about_files/" />
		</copy>
	</target>

	<target name="gather.logs" depends="init" if="destination.temp.folder">
		<mkdir dir="${destination.temp.folder}/${full.name}" />
		<copy file="${temp.folder}/@dot.bin${logExtension}" todir="${destination.temp.folder}/${full.name}/" />
	</target>

	<target name="publish.bin.parts" depends="init" if="p2.publish.parts">
		<antcall target="gather.bin.parts">
			<param name="destination.temp.folder" value="${build.result.folder}" />
		</antcall>
		<eclipse.gatherBundle metadataRepository="${p2.build.repo}" artifactRepository="${p2.build.repo}" buildResultFolder="${build.result.folder}" targetFolder="${build.result.folder}/${full.name}" />
	</target>

	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
		<mkdir dir="${destination.temp.folder}/${full.name}" />
		<copy todir="${destination.temp.folder}/${full.name}" failonerror="true">
			<fileset dir="${build.result.folder}/@dot" includes="**" />
		</copy>
		<copy todir="${destination.temp.folder}/${full.name}">
			<fileset dir="${fragmentdir}" includes="fragment.properties,about.html,about_files/,swt*.dll,libswt*.so,libswt*.sl,libswt*.a,libswt*.jnilib,libXm.so.2,META-INF/" />
		</copy>
		<chmod perm="755" dir="${destination.temp.folder}/${full.name}" includes="swt*.dll,libswt*.so,libswt*.sl,libswt*.a,libswt*.jnilib,libXm.so.2" />
		<eclipse.versionReplacer path="${destination.temp.folder}/${full.name}" version="${version.suffix}" />
	</target>

	<target name="swtdownload" depends="init">
		<delete dir="${temp.folder}" />
		<delete dir="${build.result.folder}/@dot" />
		<mkdir dir="${temp.folder}/swtdownload/" />
		<property name="includetranslationfiles" value="true" />
		<antcall target="build.jars" />
		<jar jarfile="${build.result.folder}/swt.jar" basedir="${fragmentdir}" update="true" includes="swt*.dll,libswt*.so,libswt*.sl,libswt*.a,libswt*.jnilib,libXm.so.2" />
		<move file="${build.result.folder}/swt.jar" todir="${temp.folder}/swtdownload" />
		<delete dir="${build.result.folder}/@dot" />
		<antcall target="build.sources" />
		<move file="${build.result.folder}/src.zip" todir="${temp.folder}/swtdownload" />
		<copy file="${plugindir}/build/.project" todir="${temp.folder}/swtdownload" />
		<copy file="${plugindir}/build/.classpath" todir="${temp.folder}/swtdownload" />
		<copy todir="${temp.folder}/swtdownload">
			<fileset dir="${fragmentdir}" includes="about.html,about_files/" />
		</copy>
		<condition property="zipfilename" value="swt-${buildid}-${swt.ws}-${swt.os}-${swt.arch}.zip" else="swt-${buildid}-${swt.ws}-${swt.os}.zip">
			<isset property="swt.arch"/>
		</condition>
		<zip zipfile="${destination}/${zipfilename}">
			<zipfileset dir="${temp.folder}/swtdownload/" />
		</zip>
		<delete dir="${temp.folder}" />
	</target>

	<target name="clean" depends="init">
		<delete dir="${build.result.folder}/@dot" />
		<delete file="${build.result.folder}/src.zip" />
		<delete file="${plugin.destination}/${full.name}.jar" />
		<delete file="${plugin.destination}/${full.name}.zip" />
		<delete dir="${temp.folder}" />
	</target>

	<target name="refresh" depends="init" if="eclipse.running">
		<eclipse.refreshLocal resource="${fragment}" depth="infinite" />
	</target>

	<target name="zip.plugin" depends="init">
		<delete dir="${temp.folder}" />
		<mkdir dir="${temp.folder}" />
		<antcall target="build.jars" />
		<antcall target="build.sources" />
		<antcall target="gather.bin.parts">
			<param name="destination.temp.folder" value="${temp.folder}/" />
		</antcall>
		<antcall target="gather.sources">
			<param name="destination.temp.folder" value="${temp.folder}/" />
		</antcall>
		<delete>
			<fileset dir="${temp.folder}" includes="**/*.bin.xml" />
		</delete>
		<zip zipfile="${plugin.destination}/${full.name}.zip" basedir="${temp.folder}" filesonly="true" />
		<delete dir="${temp.folder}" />
	</target>

	<target name="jar.plugin" depends="init">
		<delete dir="${temp.folder}" />
		<mkdir dir="${temp.folder}" />
		<antcall target="build.jars" />
		<antcall target="gather.bin.parts">
			<param name="destination.temp.folder" value="${temp.folder}/" />
		</antcall>
		<condition property="arch" value="${swt.arch}" else="">
			<isset property="swt.arch"/>
		</condition>
		<jar jarfile="${plugin.destination}/${full.name}.jar" basedir="${temp.folder}/${full.name}" filesonly="true" manifest="${fragmentdir}/META-INF/MANIFEST.MF">
			<manifest>
				<attribute name="SWT-OS" value="${swt.os}"/>
				<attribute name="SWT-WS" value="${swt.ws}"/>
				<attribute name="SWT-Arch" value="${arch}"/>
			</manifest>
		</jar>
		<delete dir="${temp.folder}" />
	</target>
</project>
