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

# Unix toolkit to use for building on windows
jprt.windows.jdk8.build.unix.toolkit=cygwin

# 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}, 				\
    macosx_x64_10.7-{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, 				\
    macosx_x64_10.7-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},			\
    ${jprt.my.test.target.set:TESTNAME=scimark}

# Default jdk test targets (testset=default)
jprt.make.rule.default.test.targets=				\
    ${jprt.my.test.target.set:TESTNAME=langtools_jtreg},        \
    ${jprt.my.test.target.set:TESTNAME=jdk_lang},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_math}

# Default vm test targets (testset=core)
jprt.vm.core.test.targets=                                      \
    ${jprt.vm.default.test.targets}

# Core jdk test targets (testset=core)
jprt.make.rule.core.test.targets=                               \
    ${jprt.make.rule.default.test.targets},                     \
    ${jprt.my.test.target.set:TESTNAME=jdk_util},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_io},			\
    ${jprt.my.test.target.set:TESTNAME=jdk_net},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_nio},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_security1},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_security2},          \
    ${jprt.my.test.target.set:TESTNAME=jdk_security3},          \
    ${jprt.my.test.target.set:TESTNAME=jdk_rmi},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_management},         \
    ${jprt.my.test.target.set:TESTNAME=jdk_jmx},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_text},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_tools},              \
    ${jprt.my.test.target.set:TESTNAME=jdk_jfr},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_other}

# 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.core.test.targets}, 			\
    ${jprt.my.test.target.set:TESTNAME=jdk_awt},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_beans1},             \
    ${jprt.my.test.target.set:TESTNAME=jdk_beans2},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_beans3},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_jdi},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_sound},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_swing}

# 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

