1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2023 Google LLC. 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker""" 9*c8dee2aaSAndroid Build Coastguard WorkerThis script writes the full path to the MacSDK that is being used 10*c8dee2aaSAndroid Build Coastguard Workerby the clang_mac toolchain for builds within this workspace. This 11*c8dee2aaSAndroid Build Coastguard Workerpath is created by //toolchain/download_mac_toolchain.bzl when 12*c8dee2aaSAndroid Build Coastguard Workerdownloading the mac toolchain, and the MacSDK directory is populated 13*c8dee2aaSAndroid Build Coastguard Workerwith symlinks to XCode's MacSDK contents. 14*c8dee2aaSAndroid Build Coastguard Worker""" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workerimport codecs 17*c8dee2aaSAndroid Build Coastguard Workerimport hashlib 18*c8dee2aaSAndroid Build Coastguard Workerimport os 19*c8dee2aaSAndroid Build Coastguard Workerimport subprocess 20*c8dee2aaSAndroid Build Coastguard Workerimport sys 21*c8dee2aaSAndroid Build Coastguard Workerfrom pathlib import Path 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Workerdef GetWorkspaceDir() -> str: 25*c8dee2aaSAndroid Build Coastguard Worker """Return the workspace directory containing this script.""" 26*c8dee2aaSAndroid Build Coastguard Worker this_script_path = Path(os.path.realpath(__file__)) 27*c8dee2aaSAndroid Build Coastguard Worker return str(this_script_path.parent.parent) 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Workerdef GetBazelWorkspaceHash() -> str: 31*c8dee2aaSAndroid Build Coastguard Worker """Return the Bazel hash for this workspace. 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker This is the MD5 has of the full path to the workspace. See 34*c8dee2aaSAndroid Build Coastguard Worker https://bazel.build/remote/output-directories#layout-diagram for more detail.""" 35*c8dee2aaSAndroid Build Coastguard Worker ws = GetWorkspaceDir().encode("utf-8") 36*c8dee2aaSAndroid Build Coastguard Worker return hashlib.md5(ws).hexdigest() 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Workerdef GetBazelRepositoryCacheDir() -> str: 40*c8dee2aaSAndroid Build Coastguard Worker """Return the Bazel repository cache directory.""" 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker prev_cwd = os.getcwd() 43*c8dee2aaSAndroid Build Coastguard Worker os.chdir(GetWorkspaceDir()) 44*c8dee2aaSAndroid Build Coastguard Worker cmd = ["bazelisk", "info", "repository_cache"] 45*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output(cmd) 46*c8dee2aaSAndroid Build Coastguard Worker decoded_output = codecs.decode(output, "utf-8") 47*c8dee2aaSAndroid Build Coastguard Worker return decoded_output.strip() 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Workerdef GetBazelOutputDir() -> str: 51*c8dee2aaSAndroid Build Coastguard Worker """Return the Bazel output directory. 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker This is described in https://bazel.build/remote/output-directories""" 54*c8dee2aaSAndroid Build Coastguard Worker repo_cache_dir = Path(GetBazelRepositoryCacheDir()) 55*c8dee2aaSAndroid Build Coastguard Worker # The repository cache is inside the output directory, so going up 56*c8dee2aaSAndroid Build Coastguard Worker # three levels returns the output directory. 57*c8dee2aaSAndroid Build Coastguard Worker output_dir = repo_cache_dir.parent.parent.parent 58*c8dee2aaSAndroid Build Coastguard Worker return str(output_dir) 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Workerdef GetBazelWorkspaceCacheDir() -> str: 62*c8dee2aaSAndroid Build Coastguard Worker """Determine the output directory cache for this workspace. 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker Note: The Bazel docs(1) are very clear that the organization of the output 65*c8dee2aaSAndroid Build Coastguard Worker directory may change at any time. 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker (1) https://bazel.build/remote/output-directories 68*c8dee2aaSAndroid Build Coastguard Worker """ 69*c8dee2aaSAndroid Build Coastguard Worker return os.path.join(GetBazelOutputDir(), GetBazelWorkspaceHash()) 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Workerdef GetMacSDKSymlinkDir() -> str: 73*c8dee2aaSAndroid Build Coastguard Worker """Determine the MacSDK symlinks directory for this workspace.""" 74*c8dee2aaSAndroid Build Coastguard Worker return os.path.join(GetBazelWorkspaceCacheDir(), "external", "clang_mac", "symlinks", "xcode", "MacSDK") 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Workerif "__main__" == __name__: 78*c8dee2aaSAndroid Build Coastguard Worker print(GetMacSDKSymlinkDir()) 79