# 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.

# The prefix that will be used inside the generated archive. This should be set to eclipse
# so that the archive can be directly unzipped into the dropins directory of the
# Eclipse installation.
# @category packaging
archivePrefix=eclipse

# The location under which all of the build output will be collected.
# @category packaging
collectingFolder=${archivePrefix}

# Choose configurations if you want to build configuration specific plug-ins. However, if you
# only want to create RCP distributables for different platforms do not change the default
# *,*,*. If you select any other entry than *,*,* you also have to provide an assemble task in allElements.xml. 
# @category compiling
# @type list separator=&;values=*,*,*&win32,win32,x86&linux,gtk,ppc&linux,gtk,x86 & linux,gtk,x86_64 & linux,motif,x86 & solaris,motif,sparc & solaris,gtk,sparc & aix,motif,ppc & hpux,motif,PA_RISC & macosx,carbon,ppc & macosx,carbon,x86
#configs=*,*,*


# By default PDE creates one archive (result) per entry listed in the configs property.
# Setting this value to true will cause PDE to only create one output containing all 
# artifacts for all the platforms listed in the configs property.
# @category packaging
# @type Boolean
#groupConfigurations=false

#The format of the archive. By default a zip is created using antZip.
#The list can only contain the configuration for which the desired format is different than zip.
# E.g. win32,win32,x86 - antZip
#archivesFormat=
    
# Set to true for Jnlp generation
# @category jnlp
# @type Boolean
# generateJnlp=false

# Codebase should be a URL that will be used as the root of all relative URLs in the output.
# @category jnlp
#jnlp.codebase=<codebase url>

# @category jnlp
#jnlp.j2se=<j2se version>

# @category jnlp
#jnlp.locale=<a locale>

# Generate <offlineAllowed/> attribute in the generated features
# @category jnlp
# @type Boolean
#jnlp.generateOfflineAllowed=

# Set to ${configs} in order to filter the content of the generated jnlp files based on the configuration being built
# @category jnlp
# @type enum values=${configs} 
# jnlp.configs=         

# Check if you want to sign jars
# @type Boolean
# @category jarsigning
#signJars=false

# The Alias used for signing jars
# @category jarsigning
#sign.alias=

# A path to the keystore used for signing jars
# @category jarsigning
#sign.keystore=

# The password for the keystore
# @category jarsigning
#sign.storepass=

#Arguments to send to the zip executable
# @category packaging
zipargs=

#Arguments to send to the tar executable
# @category packaging
tarargs=

# Control the creation of a file containing the version included in each configuration - on by default
# @type Boolean 
#generateVersionsLists=true

# Indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built
# @type Boolean
filteredDependencyCheck=false

# Indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons)
# @type Boolean
resolution.devMode=false

#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
#a location is one of:  
#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
#- a directory that contains a /plugins or /features subdirectory
#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
#pluginPath=


# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
# @category compiling
# bootclasspath=${java.home}/lib/rt.jar

# @category executionEnvironment
#CDC-1.0/Foundation-1.0=
# @category executionEnvironment
#CDC-1.1/Foundation-1.1=
# @category executionEnvironment
#OSGi/Minimum-1.0=
# @category executionEnvironment
#OSGi/Minimum-1.1=
# @category executionEnvironment
#JRE-1.1=
# @category executionEnvironment
#J2SE-1.2=
# @category executionEnvironment
#J2SE-1.3=
# @category executionEnvironment
#J2SE-1.4=
# @category executionEnvironment
#J2SE-1.5=
# @category executionEnvironment
#JavaSE-1.6=
# @category executionEnvironment
#PersonalJava-1.1=
# @category executionEnvironment
#PersonalJava-1.2=
# @category executionEnvironment
#CDC-1.0/PersonalBasis-1.0=
# @category executionEnvironment
#CDC-1.0/PersonalJava-1.0=
# @category executionEnvironment
#CDC-1.1/PersonalBasis-1.1=
# @category executionEnvironment
#CDC-1.1/PersonalJava-1.1=

# Specify the output format of the compiler log when eclipse jdt is used
# @category compiling
logExtension=.log

# Whether or not to include debug info in the output jars
# @category compiling
# @type Boolean
javacDebugInfo=false

# Whether or not to fail the build if there are compiler errors
# @category compiling
# @type Boolean
javacFailOnError=true

# Enable or disable verbose mode of the compiler
# @category compiling
# @type Boolean
javacVerbose=false

# Extra arguments for the compiler. These are specific to the java compiler being used.
# @category compiling
#compilerArg=

# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
# @category compiling
#javacSource=1.3
javacSource=1.5

# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
# @category compiling
#javacTarget=1.1
javacTarget=1.5

# Set the description for the update site. The update manager shows the description in the Updates dialog.
# @category updateSite
updateSiteDescription=Update site generated by pluginbuilder.

# There will be one category for the generated update site. Here you can set the name.
# It is more like an id with which features refer to their category and does not appear in the GUI.
# @category updateSite
updateSiteCategoryName=Builds

# Here you can set the Label of the category which will be displayed in the Updates dialog.
# @category updateSite
updateSiteCategoryLabel=Nightly Builds

# Create a provisioning (p2) repository. Since Eclipse 3.4 it is recommended that you create
# a p2 repository for your features.
# However, the installation of old-style (pre p2) update sites is still possible.
# @type Boolean
# @category p2
generate.p2.metadata=true

# @category hidden
p2.metadata.repo=file:${buildDirectory}/repo

# @category hidden
p2.artifact.repo=file:${buildDirectory}/repo

# The name of the metadata repository. The Update Manager will display this name.
# @category p2
p2.metadata.repo.name=EasyAnt For Eclipse Update Site

# The name of the artifacts repository
# @category p2
p2.artifact.repo.name=EasyAnt For Eclipse Update Site

# @category hidden
p2.flavor=tooling
# @category hidden
p2.publish.artifacts=true
