#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# Properties for jprt

# Locked down to jdk8
jprt.tools.default.release=jdk8

# The different build flavors we want, we override here so we just get these 2
jprt.build.flavors=product,fastdebug

# Standard list of jprt build targets for this source tree
jprt.build.targets=                                         	\
    solaris_sparc_5.10-{product|fastdebug},                 	\
    solaris_sparcv9_5.10-{product|fastdebug}, 			\
    solaris_i586_5.10-{product|fastdebug}, 			\
    solaris_x64_5.10-{product|fastdebug}, 			\
    linux_i586_2.6-{product|fastdebug}, 			\
    linux_x64_2.6-{product|fastdebug}, 				\
    windows_i586_5.1-{product|fastdebug}, 			\
    windows_x64_5.2-{product|fastdebug}

# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}

# Test target list (no fastdebug & limited c2 testing)
jprt.my.test.target.set= \
    solaris_sparc_5.10-product-c1-TESTNAME,                     \
    solaris_sparcv9_5.10-product-c2-TESTNAME,                   \
    solaris_i586_5.10-product-c1-TESTNAME,                      \
    solaris_x64_5.10-product-c2-TESTNAME,                       \
    linux_i586_2.6-product-{c1|c2}-TESTNAME,                    \
    linux_x64_2.6-product-c2-TESTNAME,                          \
    windows_i586_5.1-product-c1-TESTNAME,                       \
    windows_x64_5.2-product-c2-TESTNAME

# Default vm test targets (testset=default)
jprt.vm.default.test.targets=					\
    ${jprt.my.test.target.set:TESTNAME=jvm98}

# Default jdk test targets (testset=default)
jprt.make.rule.default.test.targets=				\
    ${jprt.my.test.target.set:TESTNAME=jdk_beans1},             \
    ${jprt.my.test.target.set:TESTNAME=jdk_io},                 \
    ${jprt.my.test.target.set:TESTNAME=jdk_lang},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_math},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_misc},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_net},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_nio1},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_nio2},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_nio3},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_security1},          \
    ${jprt.my.test.target.set:TESTNAME=jdk_text},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_util}

# All vm test targets (testset=all)
jprt.vm.all.test.targets=                                       \
    ${jprt.vm.default.test.targets},                            \
    ${jprt.my.test.target.set:TESTNAME=runThese},               \
    ${jprt.my.test.target.set:TESTNAME=jbb_default}

# All jdk test targets (testset=all)
jprt.make.rule.all.test.targets=    				\
    ${jprt.make.rule.default.test.targets}, 			\
    ${jprt.my.test.target.set:TESTNAME=jdk_awt},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_beans2},             \
    ${jprt.my.test.target.set:TESTNAME=jdk_beans3},             \
    ${jprt.my.test.target.set:TESTNAME=jdk_management1},        \
    ${jprt.my.test.target.set:TESTNAME=jdk_management2},        \
    ${jprt.my.test.target.set:TESTNAME=jdk_rmi},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_security2},          \
    ${jprt.my.test.target.set:TESTNAME=jdk_security3},          \
    ${jprt.my.test.target.set:TESTNAME=jdk_sound},              \
    ${jprt.my.test.target.set:TESTNAME=jdk_swing},              \
    ${jprt.my.test.target.set:TESTNAME=jdk_tools1},             \
    ${jprt.my.test.target.set:TESTNAME=jdk_tools2}

# JCK test targets in test/Makefile (no windows)
jprt.my.jck.test.target.set=					\
    solaris_sparc_5.10-product-c1-JCK7TESTRULE, 		\
    solaris_sparcv9_5.10-product-c2-JCK7TESTRULE, 		\
    solaris_i586_5.10-product-c1-JCK7TESTRULE, 			\
    solaris_x64_5.10-product-c2-JCK7TESTRULE, 			\
    linux_i586_2.6-product-c1-JCK7TESTRULE, 			\
    linux_x64_2.6-product-c2-JCK7TESTRULE

# JCK testset targets (e.g. jprt submit -testset jck ... )
jprt.make.rule.jck.test.targets=				\
    ${jprt.my.jck.test.target.set:JCK7TESTRULE=jck7devtools},   \
    ${jprt.my.jck.test.target.set:JCK7TESTRULE=jck7runtime},    \
    ${jprt.my.jck.test.target.set:JCK7TESTRULE=jck7compiler}

# Select list to use (allow for testset to be empty too)
jprt.make.rule..test.targets=${jprt.make.rule.default.test.targets}
jprt.make.rule.test.targets=${jprt.make.rule.${jprt.my.test.set}.test.targets}
jprt.vm..test.targets=${jprt.vm.default.test.targets}
jprt.test.targets=${jprt.vm.${jprt.my.test.set}.test.targets}

# Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev

