xref: /aosp_15_r20/external/skia/tools/macsdk_dir.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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