#!/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())