<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<project name="allElements delegation and assemble customTargets.xml">
<!-- FILE WILL BE OVERWRITTEN WHEN GENERATED -->
  	<target name="allElementsExceptSvnFetch" unless="is.svn.fetch">
  		<antcall target="norcpbuild"/>
  		<antcall target="rcpbuild"/>
    </target>
	
	<target name="norcpbuild" unless="build.container.feature">
		<ant antfile="${genericTargets}" target="${target}">
			<property name="type" value="feature" />
			<property name="id" value="org.apache.easyant4e.feature" />
		</ant>
		
	</target>

	<target name="rcpbuild" if="build.container.feature">
		<ant antfile="${genericTargets}" target="${target}">
			<property name="type" value="feature" />
			<property name="id" value="org.eclipse.pde.build.container.feature" />
		</ant>
	</target>
	
	<!-- generated assemble targets -->	     
	<target name="assemble.org.apache.easyant4e.feature">
		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
			<property name="zipargs" value="" />
		</ant>
	</target>

	
	<!-- assmble targets for RCP build -->	
	<target name="assemble.org.eclipse.pde.build.container.feature.win32.win32.x86">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-win32.win32.x86.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.x86">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.x86.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.ppc">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.ppc.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.x86_64">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.x86_64.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.linux.motif.x86">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-linux.motif.x86.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.solaris.motif.sparc">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-solaris.motif.sparc.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.solaris.gtk.sparc">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-solaris.gtk.sparc.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.aix.motif.ppc">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-aix.motif.ppc.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.hpux.motif.PA_RISC">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-hpux.motif.PA_RISC.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.macosx.carbon.ppc">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-macosx.carbon.ppc.zip"/>
		</ant>
	</target>
	<target name="assemble.org.eclipse.pde.build.container.feature.macosx.carbon.x86">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
 			<property name="archiveName" value="${archiveNamePrefix}-macosx.carbon.x86.zip"/>
		</ant>
	</target>	
</project>