blob: 393eff317abccba3beb0ef4cda3634acce45617d [file] [log] [blame]
#!/bin/bash
#
# Copyright 2018 The Bazel Authors. All rights reserved.
#
# Licensed 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.
# Load the test setup defined in the parent directory
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CURRENT_DIR}/../integration_test_setup.sh" \
|| { echo "integration_test_setup.sh not found!" >&2; exit 1; }
function set_up() {
create_new_workspace
}
function write_test_target() {
cat > BUILD <<EOF
load("@bazel_tools//tools/cpp:cc_flags_supplier.bzl", "cc_flags_supplier")
cc_flags_supplier(name = "cc_flags")
load(":display.bzl", "display")
display(
name = "display",
toolchains = [":cc_flags"],
)
EOF
# Add a rule to display CC_FLAGS
cat >>display.bzl <<EOF
def _impl(ctx):
cc_flags = ctx.var["CC_FLAGS"]
print("CC_FLAGS: %s" % cc_flags)
return []
display = rule(
implementation = _impl,
)
EOF
}
function write_crosstool() {
action_configs="$1"
make_variables="$2"
builtin_sysroot="$3"
mkdir -p setup
cat > setup/BUILD <<EOF
package(default_visibility = ["//visibility:public"])
load(":cc_toolchain_config.bzl", "cc_toolchain_config")
cc_library(
name = "malloc",
)
filegroup(
name = "empty",
srcs = [],
)
cc_toolchain_suite(
name = "toolchain",
toolchains = {
"local|local": ":local",
"local": ":local",
},
)
cc_toolchain_config(
name = "local_config",
cpu = "local",
toolchain_identifier = "local",
host_system_name = "local",
target_system_name = "local",
target_libc = "local",
compiler = "local",
abi_version = "local",
abi_libc_version = "local",
)
cc_toolchain(
name = "local",
toolchain_identifier = "local",
toolchain_config = ":local_config",
all_files = ":empty",
ar_files = ":empty",
as_files = ":empty",
compiler_files = ":empty",
dwp_files = ":empty",
linker_files = ":empty",
objcopy_files = ":empty",
strip_files = ":empty",
)
toolchain(
name = "cc-toolchain-local",
exec_compatible_with = [
],
target_compatible_with = [
],
toolchain = ":local",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)
EOF
cat >> WORKSPACE <<EOF
register_toolchains("//setup:cc-toolchain-local")
EOF
cat > setup/cc_toolchain_config.bzl <<EOF
load("@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"action_config",
"make_variable",
"flag_set",
"flag_group",
)
def _get_make_variables():
return [${make_variables}]
def _get_action_configs():
return [${action_configs}]
def _impl(ctx):
out = ctx.actions.declare_file(ctx.label.name)
ctx.actions.write(out, "Fake executable")
return [
cc_common.create_cc_toolchain_config_info(
ctx = ctx,
target_cpu = ctx.attr.cpu,
compiler = ctx.attr.compiler,
toolchain_identifier = ctx.attr.toolchain_identifier,
host_system_name = ctx.attr.host_system_name,
target_system_name = ctx.attr.target_system_name,
target_libc = ctx.attr.target_libc,
abi_version = ctx.attr.abi_version,
abi_libc_version = ctx.attr.abi_libc_version,
builtin_sysroot = ${builtin_sysroot},
action_configs = _get_action_configs(),
make_variables = _get_make_variables(),
),
DefaultInfo(
executable = out,
),
]
cc_toolchain_config = rule(
implementation = _impl,
attrs = {
"cpu": attr.string(mandatory = True),
"compiler": attr.string(mandatory = True),
"toolchain_identifier": attr.string(mandatory = True),
"host_system_name": attr.string(mandatory = True),
"target_system_name": attr.string(mandatory = True),
"target_libc": attr.string(mandatory = True),
"abi_version": attr.string(mandatory = True),
"abi_libc_version": attr.string(mandatory = True),
},
provides = [CcToolchainConfigInfo],
executable = True,
)
EOF
}
function test_legacy_make_variable() {
write_crosstool \
"" \
"make_variable(name = 'CC_FLAGS', value = '-test-cflag1 -test-cflag2')" \
"''"
write_test_target
bazel build --cpu local --crosstool_top=//setup:toolchain //:display &> "$TEST_log" || fail "Build failed"
expect_log "CC_FLAGS: -test-cflag1 -test-cflag2"
}
function test_sysroot() {
write_crosstool \
"" \
"" \
"'/sys/root'"
write_test_target
bazel build --cpu local --crosstool_top=//setup:toolchain //:display &> "$TEST_log" || fail "Build failed"
expect_log "CC_FLAGS: --sysroot=/sys/root"
}
function test_feature_config() {
write_crosstool \
"
action_config(
action_name = 'cc-flags-make-variable',
flag_sets = [
flag_set(
flag_groups=[flag_group(flags=['foo', 'bar', 'baz'])],
),
],
),
" \
"" \
"''"
write_test_target
bazel build --cpu local --crosstool_top=//setup:toolchain //:display &> "$TEST_log" || fail "Build failed"
expect_log "CC_FLAGS: foo bar baz"
}
function test_all_sources() {
write_crosstool \
"
action_config(
action_name = 'cc-flags-make-variable',
flag_sets = [
flag_set(
flag_groups=[flag_group(flags=['foo', 'bar', 'baz'])],
),
],
),
" \
"make_variable(name = 'CC_FLAGS', value = '-test-cflag1 -test-cflag2')" \
"'/sys/root'"
write_test_target
bazel build --cpu local --crosstool_top=//setup:toolchain //:display &> "$TEST_log" || fail "Build failed"
expect_log "CC_FLAGS: -test-cflag1 -test-cflag2 --sysroot=/sys/root foo bar baz"
}
run_suite "cc_flag_supplier tests"