79 lines
2.4 KiB
Python
Executable File
79 lines
2.4 KiB
Python
Executable File
#!/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())
|