# The name of the Product Configuration file (.product). You can either put a product file in the root
# folder of this pluginbuilder project and specify its name here. Or you can use an existing product file
# from one of your plug-ins by specifying a path like ${buildDirectory}/plugins/<your-plugin>/<your-product>.product.
# This field is mandatory. 
# @category rcp
product=

# Select the platforms for which you want to create RCP deliverables.
# @category rcp
# @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=win32,win32,x86

# Prefix for the created archive file name. The archive name always contains the configuration. The prefix and configuration are divided by a minus character. If you want to include the version you can reference the property ${version.full}, a sample value for archiveNamePrefix is myRcpApp-${version.full}  
# @category rcp
archiveNamePrefix=

# You need to set this to true in order to get archives for your configurations.
# @category rcp
# @type Boolean
# runPackager=false
runPackager=true

# A Pluginbuilder property which prevents running the postBuild target. Since the RCP 
# build is usually run after a regular build which includes the postBuild phase no.postBuild
# should be activated for RCP builds
# @category rcp_hidden
# @type Boolean
no.postBuild=true

# Another Pluginbuilder property which should be activated for RCP builds
# @category rcp_hidden
# @type Boolean 
build.container.feature=true

# Set the root path in the platform specific packages
# @category packaging
# archivePrefix=