#
# Copyright (c) 2006, 2013, 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=jdk9

# 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_sparcv9_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_6.1-{product|fastdebug}, 			\
    windows_x64_6.1-{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_sparcv9_5.10-product-c2-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_6.1-product-c1-TESTNAME, 			\
    windows_x64_6.1-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},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_util}
    

# Default vm test targets (testset=core)
jprt.vm.core.test.targets=

# Core jdk test targets (testset=core)
jprt.make.rule.core.test.targets=                               \
    ${jprt.my.test.target.set:TESTNAME=jdk_lang},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_math},               \
    ${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_text},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_time},               \
    ${jprt.my.test.target.set:TESTNAME=jdk_other},              \
    ${jprt.my.test.target.set:TESTNAME=core_tools}

# Svc vm test targets (testset=svc)
jprt.vm.svc.test.targets=

# Core jdk test targets (testset=svc)
jprt.make.rule.svc.test.targets=                                \
    ${jprt.my.test.target.set:TESTNAME=jdk_management},         \
    ${jprt.my.test.target.set:TESTNAME=jdk_instrument},         \
    ${jprt.my.test.target.set:TESTNAME=jdk_jmx},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_jdi},                \
    ${jprt.my.test.target.set:TESTNAME=jdk_jfr},                \
    ${jprt.my.test.target.set:TESTNAME=svc_tools}

# 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.make.rule.svc.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_sound},		\
    ${jprt.my.test.target.set:TESTNAME=jdk_swing}

# PIT vm test targets (testset=pit)
jprt.vm.pit.test.targets=                                       \
   ${jprt.vm.all.test.targets}

# PIT jdk test targets (testset=pit)
jprt.make.rule.pit.test.targets=                                \
    ${jprt.my.test.target.set:TESTNAME=langtools_jtreg},        \
    ${jprt.make.rule.core.test.targets},                        \
    ${jprt.make.rule.svc.test.targets}

# JCK test targets in test/Makefile (no windows)
jprt.my.jck.test.target.set=					\
    solaris_sparcv9_5.10-product-c2-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

# Instruct jprt to use configure when building
jprt.build.use.configure=true
jprt.build.flavor.product.target=jprt_bundle
jprt.build.flavor.fastdebug.target=jprt_bundle
jprt.build.flavor.debug.target=jprt_bundle

# Add these configure args to all builds
jprt.build.configure.args= \
    --with-boot-jdk=$ALT_BOOTDIR \
    --with-jobs=$ALT_PARALLEL_COMPILE_JOBS

# Add these configure args to 32 bit builds
jprt.i586.build.configure.args= \
    --with-target-bits=32 \
    --with-jvm-variants=client,server

# Use these configure args to define debug level.
jprt.product.build.configure.args=--with-debug-level=release
jprt.fastdebug.build.configure.args=--with-debug-level=fastdebug
jprt.debug.build.configure.args=--with-debug-level=slowdebug
