diff --git a/examples/BUILD b/examples/BUILD new file mode 100644 index 0000000..d9178c1 --- /dev/null +++ b/examples/BUILD @@ -0,0 +1,16 @@ +# Copyright 2019 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. + +# A collection of examples showing the usage of rules_cc +licenses(["notice"]) diff --git a/examples/my_c_compile/BUILD b/examples/my_c_compile/BUILD new file mode 100644 index 0000000..f970895 --- /dev/null +++ b/examples/my_c_compile/BUILD @@ -0,0 +1,23 @@ +# Copyright 2019 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. + +# Example showing how to create a custom Starlark rule that just compiles C sources +licenses(["notice"]) + +load("//examples/my_c_compile:my_c_compile.bzl", "my_c_compile") + +my_c_compile( + name = "foo", + src = "foo.c", +) diff --git a/examples/my_c_compile/foo.c b/examples/my_c_compile/foo.c new file mode 100644 index 0000000..6718fbd --- /dev/null +++ b/examples/my_c_compile/foo.c @@ -0,0 +1,15 @@ +// Copyright 2019 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. + +int foo() { return 42; } diff --git a/examples/my_c_compile/my_c_compile.bzl b/examples/my_c_compile/my_c_compile.bzl new file mode 100644 index 0000000..a9cec34 --- /dev/null +++ b/examples/my_c_compile/my_c_compile.bzl @@ -0,0 +1,74 @@ +# Copyright 2019 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. + +"""Example about how to create a custom Starlark rule that just compiles C sources.""" + +load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "C_COMPILE_ACTION_NAME") + +DISABLED_FEATURES = [ +] + +def _my_c_compile_impl(ctx): + cc_toolchain = find_cpp_toolchain(ctx) + source_file = ctx.file.src + output_file = ctx.actions.declare_file(ctx.label.name + ".o") + feature_configuration = cc_common.configure_features( + cc_toolchain = cc_toolchain, + requested_features = ctx.features, + unsupported_features = DISABLED_FEATURES + ctx.disabled_features, + ) + c_compiler_path = cc_common.get_tool_for_action( + feature_configuration = feature_configuration, + action_name = C_COMPILE_ACTION_NAME, + ) + c_compile_variables = cc_common.create_compile_variables( + feature_configuration = feature_configuration, + cc_toolchain = cc_toolchain, + source_file = source_file.path, + output_file = output_file.path, + ) + command_line = cc_common.get_memory_inefficient_command_line( + feature_configuration = feature_configuration, + action_name = C_COMPILE_ACTION_NAME, + variables = c_compile_variables, + ) + env = cc_common.get_environment_variables( + feature_configuration = feature_configuration, + action_name = C_COMPILE_ACTION_NAME, + variables = c_compile_variables, + ) + + ctx.actions.run( + executable = c_compiler_path, + arguments = command_line, + env = env, + inputs = depset( + items = [source_file], + # TODO: Use CcToolchainInfo getters when available + # See https://github.com/bazelbuild/bazel/issues/7427. + transitive = [ctx.attr._cc_toolchain.files], + ), + outputs = [output_file], + ) + return [DefaultInfo(files = depset(items = [output_file]))] + +# This rule does nothing, just propagates all cc_toolchain files. +my_c_compile = rule( + implementation = _my_c_compile_impl, + attrs = { + "src": attr.label(mandatory = True, allow_single_file = True), + "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")), + }, +) diff --git a/examples/write_cc_toolchain_cpu/BUILD b/examples/write_cc_toolchain_cpu/BUILD new file mode 100644 index 0000000..07caa50 --- /dev/null +++ b/examples/write_cc_toolchain_cpu/BUILD @@ -0,0 +1,20 @@ +# Copyright 2019 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. + +# Example showing how to get CcToolchainInfo in a custom starlark rule +licenses(["notice"]) + +load("//examples/write_cc_toolchain_cpu:write_cc_toolchain_cpu.bzl", "write_cc_toolchain_cpu") + +write_cc_toolchain_cpu(name = "write_me_the_cpu") diff --git a/examples/write_cc_toolchain_cpu/write_cc_toolchain_cpu.bzl b/examples/write_cc_toolchain_cpu/write_cc_toolchain_cpu.bzl new file mode 100644 index 0000000..2a62168 --- /dev/null +++ b/examples/write_cc_toolchain_cpu/write_cc_toolchain_cpu.bzl @@ -0,0 +1,31 @@ +# Copyright 2019 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. + +"""Example about how to get CcToolchainInfo in a custom starlark rule.""" + +load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") + +def _write_cc_toolchain_cpu_impl(ctx): + cc_toolchain = find_cpp_toolchain(ctx) + output = ctx.actions.declare_file(ctx.label.name + "_cpu") + ctx.actions.write(output, cc_toolchain.cpu) + return [DefaultInfo(files = depset([output]))] + +# This rule does nothing, just writes the target_cpu from the cc_toolchain used for this build. +write_cc_toolchain_cpu = rule( + implementation = _write_cc_toolchain_cpu_impl, + attrs = { + "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")), + }, +)