#!/bin/bash
#
#   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.
#
# NOTE: "./gradlew s4-tools:installApp" will prepare/update the tools subproject and related startup scripts

S4_DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
S4_SCRIPT_PATH="$S4_DIR/s4"

# JVM options for starting nodes and for other s4 tools can be configured here
# export JAVA_OPTS=-Xmx1G

subprojects/s4-tools/build/install/s4-tools/bin/s4-tools -s4ScriptPath=$S4_SCRIPT_PATH $@



