blob: dbd741e2dbd75ca05ee6af91c0d922988a5d391a [file] [log] [blame]
# Copyright 2023 The Pigweed Authors
#
# 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
#
# https://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.
"""Xcode configuration for Bazel build.
This replaces xcode_configure, but only intends to work with macOS host builds,
and exclusively attempts to support xcode command-line tools.
"""
load("//cc_toolchain/private:providers.bzl", "ToolchainFeatureInfo") # buildifier: disable=bzl-visibility
load("//cc_toolchain/private:toolchain_feature.bzl", "build_toolchain_feature_info") # buildifier: disable=bzl-visibility
XcodeSdkInfo = provider(
doc = "A simple provider that provides the path to the macOS Xcode SDK",
fields = {
"sdk_path": "str: Path to the macOS sdk",
},
)
def _pw_xcode_repository_impl(repository_ctx):
"""Generated repository containing a pw_xcode_info target.
Args:
repository_ctx: The context of the current repository.
Returns:
None
"""
# This is required to make a repository, so make a stub for all other
# operating systems.
if repository_ctx.os.name != "mac os x":
lines = [
"filegroup(",
" name = \"default\",",
" visibility = [\"@pw_toolchain//features/macos:__pkg__\"],",
")",
]
repository_ctx.file("BUILD", "\n".join(lines))
return
xcrun_result = repository_ctx.execute(["/usr/bin/xcrun", "--show-sdk-path"])
if xcrun_result.return_code != 0:
fail("Failed locating Xcode SDK: {}".format(xcrun_result.stderr))
sdk_path = xcrun_result.stdout.replace("\n", "")
lines = [
"load(\"@pw_toolchain//features/macos/private:xcode_command_line_tools.bzl\", \"pw_xcode_info\")",
"pw_xcode_info(",
" name = \"default\",",
" sdk_path = \"{}\",".format(sdk_path),
" visibility = [\"@pw_toolchain//features/macos:__pkg__\"],",
")",
]
if xcrun_result.return_code == 0:
repository_ctx.file("BUILD", "\n".join(lines))
pw_xcode_repository = repository_rule(
_pw_xcode_repository_impl,
attrs = {},
doc = "Initializes a macOS SDK repository",
)
def _xcode_info_impl(ctx):
"""Rule that provides XcodeSdkInfo.
Args:
ctx: The context of the current build rule.
Returns:
XcodeSdkInfo
"""
return [XcodeSdkInfo(sdk_path = ctx.attr.sdk_path)]
pw_xcode_info = rule(
implementation = _xcode_info_impl,
attrs = {
"sdk_path": attr.string(),
},
provides = [XcodeSdkInfo],
)
def _pw_macos_sysroot_impl(ctx):
"""Rule that provides an Xcode-provided sysroot as ToolchainFeatureInfo.
Args:
ctx: The context of the current build rule.
Returns:
ToolchainFeatureInfo
"""
sdk_path = ctx.attr.sdk[XcodeSdkInfo].sdk_path
return build_toolchain_feature_info(
ctx = ctx,
cxx_builtin_include_directories = ["%sysroot%/usr/include"],
builtin_sysroot = sdk_path,
)
pw_macos_sysroot = rule(
implementation = _pw_macos_sysroot_impl,
attrs = {
"sdk": attr.label(),
},
provides = [ToolchainFeatureInfo],
)