| #!/usr/bin/env python3 |
| # |
| # Copyright 2023 Google LLC. |
| # |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """ |
| This script writes the full path to the MacSDK that is being used |
| by the clang_mac toolchain for builds within this workspace. This |
| path is created by //toolchain/download_mac_toolchain.bzl when |
| downloading the mac toolchain, and the MacSDK directory is populated |
| with symlinks to XCode's MacSDK contents. |
| """ |
| |
| import codecs |
| import hashlib |
| import os |
| import subprocess |
| import sys |
| from pathlib import Path |
| |
| |
| def GetWorkspaceDir() -> str: |
| """Return the workspace directory containing this script.""" |
| this_script_path = Path(os.path.realpath(__file__)) |
| return str(this_script_path.parent.parent) |
| |
| |
| def GetBazelWorkspaceHash() -> str: |
| """Return the Bazel hash for this workspace. |
| |
| This is the MD5 has of the full path to the workspace. See |
| https://bazel.build/remote/output-directories#layout-diagram for more detail.""" |
| ws = GetWorkspaceDir().encode("utf-8") |
| return hashlib.md5(ws).hexdigest() |
| |
| |
| def GetBazelRepositoryCacheDir() -> str: |
| """Return the Bazel repository cache directory.""" |
| |
| prev_cwd = os.getcwd() |
| os.chdir(GetWorkspaceDir()) |
| cmd = ["bazelisk", "info", "repository_cache"] |
| output = subprocess.check_output(cmd) |
| decoded_output = codecs.decode(output, "utf-8") |
| return decoded_output.strip() |
| |
| |
| def GetBazelOutputDir() -> str: |
| """Return the Bazel output directory. |
| |
| This is described in https://bazel.build/remote/output-directories""" |
| repo_cache_dir = Path(GetBazelRepositoryCacheDir()) |
| # The repository cache is inside the output directory, so going up |
| # three levels returns the output directory. |
| output_dir = repo_cache_dir.parent.parent.parent |
| return str(output_dir) |
| |
| |
| def GetBazelWorkspaceCacheDir() -> str: |
| """Determine the output directory cache for this workspace. |
| |
| Note: The Bazel docs(1) are very clear that the organization of the output |
| directory may change at any time. |
| |
| (1) https://bazel.build/remote/output-directories |
| """ |
| return os.path.join(GetBazelOutputDir(), GetBazelWorkspaceHash()) |
| |
| |
| def GetMacSDKSymlinkDir() -> str: |
| """Determine the MacSDK symlinks directory for this workspace.""" |
| return os.path.join(GetBazelWorkspaceCacheDir(), "external", "clang_mac", "symlinks", "xcode", "MacSDK") |
| |
| |
| if "__main__" == __name__: |
| print(GetMacSDKSymlinkDir()) |