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

# This is from Bazel's former travis setup, to avoid blowing up the RAM usage.
startup --host_jvm_args=-Xmx2500m
startup --host_jvm_args=-Xms2500m
startup --batch
test --local_ram_resources=HOST_RAM*0.10
test --test_output=errors

# This is so we understand failures better
build --verbose_failures

build --show_timestamps
test --show_timestamps

# Limits the jobs to 25 since the resources are limited
build --jobs 25

# Link with the appropriate libs
build --linkopt -lm
build --linkopt -lpthread
build --linkopt -lrt
build --experimental_action_listener=tools/cpp:compile_cpp
build --experimental_action_listener=tools/java:compile_java
build --experimental_action_listener=tools/python:compile_python
build --workspace_status_command scripts/release/status.sh

# This is so we use a recent enough GCC when building.
# build --crosstool_top //tools/travis/toolchain:CROSSTOOL

# This is so we don't use sandboxed execution. Sandboxed execution
# runs stuff in a container, and since Travis already runs its script
# in a container (unless you require sudo in your .travis.yml) this
# fails to run tests.
build --spawn_strategy=standalone --genrule_strategy=standalone
test --test_strategy=standalone

# Ignore unsupported warning for sandboxing
build --ignore_unsupported_sandboxing

# Below this line, .travis.yml will cat the default bazelrc.
# This is needed so Bazel starts with the base workspace in its
# package path.
