xref: /aosp_15_r20/external/executorch/third-party/glob_defs.bzl (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Copy from caffe2/tools/build_defs/glob_defs.bzl
2*523fa7a6SAndroid Build Coastguard Worker# Only used for PyTorch open source BUCK build
3*523fa7a6SAndroid Build Coastguard Worker
4*523fa7a6SAndroid Build Coastguard Worker"""Provides utility macros for working with globs."""
5*523fa7a6SAndroid Build Coastguard Worker
6*523fa7a6SAndroid Build Coastguard Workerload("@prelude//:paths.bzl", "paths")
7*523fa7a6SAndroid Build Coastguard Worker
8*523fa7a6SAndroid Build Coastguard Workerdef subdir_glob(glob_specs, exclude = None, prefix = ""):
9*523fa7a6SAndroid Build Coastguard Worker    """Returns a dict of sub-directory relative paths to full paths.
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard Worker    The subdir_glob() function is useful for defining header maps for C/C++
12*523fa7a6SAndroid Build Coastguard Worker    libraries which should be relative the given sub-directory.
13*523fa7a6SAndroid Build Coastguard Worker    Given a list of tuples, the form of (relative-sub-directory, glob-pattern),
14*523fa7a6SAndroid Build Coastguard Worker    it returns a dict of sub-directory relative paths to full paths.
15*523fa7a6SAndroid Build Coastguard Worker
16*523fa7a6SAndroid Build Coastguard Worker    Please refer to native.glob() for explanations and examples of the pattern.
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker    Args:
19*523fa7a6SAndroid Build Coastguard Worker      glob_specs: The array of tuples in form of
20*523fa7a6SAndroid Build Coastguard Worker        (relative-sub-directory, glob-pattern inside relative-sub-directory).
21*523fa7a6SAndroid Build Coastguard Worker        type: List[Tuple[str, str]]
22*523fa7a6SAndroid Build Coastguard Worker      exclude: A list of patterns to identify files that should be removed
23*523fa7a6SAndroid Build Coastguard Worker        from the set specified by the first argument. Defaults to [].
24*523fa7a6SAndroid Build Coastguard Worker        type: Optional[List[str]]
25*523fa7a6SAndroid Build Coastguard Worker      prefix: If is not None, prepends it to each key in the dictionary.
26*523fa7a6SAndroid Build Coastguard Worker        Defaults to None.
27*523fa7a6SAndroid Build Coastguard Worker        type: Optional[str]
28*523fa7a6SAndroid Build Coastguard Worker
29*523fa7a6SAndroid Build Coastguard Worker    Returns:
30*523fa7a6SAndroid Build Coastguard Worker      A dict of sub-directory relative paths to full paths.
31*523fa7a6SAndroid Build Coastguard Worker    """
32*523fa7a6SAndroid Build Coastguard Worker    if exclude == None:
33*523fa7a6SAndroid Build Coastguard Worker        exclude = []
34*523fa7a6SAndroid Build Coastguard Worker
35*523fa7a6SAndroid Build Coastguard Worker    results = []
36*523fa7a6SAndroid Build Coastguard Worker
37*523fa7a6SAndroid Build Coastguard Worker    for dirpath, glob_pattern in glob_specs:
38*523fa7a6SAndroid Build Coastguard Worker        results.append(
39*523fa7a6SAndroid Build Coastguard Worker            _single_subdir_glob(dirpath, glob_pattern, exclude, prefix),
40*523fa7a6SAndroid Build Coastguard Worker        )
41*523fa7a6SAndroid Build Coastguard Worker
42*523fa7a6SAndroid Build Coastguard Worker    return _merge_maps(*results)
43*523fa7a6SAndroid Build Coastguard Worker
44*523fa7a6SAndroid Build Coastguard Workerdef _merge_maps(*file_maps):
45*523fa7a6SAndroid Build Coastguard Worker    result = {}
46*523fa7a6SAndroid Build Coastguard Worker    for file_map in file_maps:
47*523fa7a6SAndroid Build Coastguard Worker        for key in file_map:
48*523fa7a6SAndroid Build Coastguard Worker            if key in result and result[key] != file_map[key]:
49*523fa7a6SAndroid Build Coastguard Worker                fail(
50*523fa7a6SAndroid Build Coastguard Worker                    "Conflicting files in file search paths. " +
51*523fa7a6SAndroid Build Coastguard Worker                    "\"%s\" maps to both \"%s\" and \"%s\"." %
52*523fa7a6SAndroid Build Coastguard Worker                    (key, result[key], file_map[key]),
53*523fa7a6SAndroid Build Coastguard Worker                )
54*523fa7a6SAndroid Build Coastguard Worker
55*523fa7a6SAndroid Build Coastguard Worker            result[key] = file_map[key]
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Worker    return result
58*523fa7a6SAndroid Build Coastguard Worker
59*523fa7a6SAndroid Build Coastguard Workerdef _single_subdir_glob(dirpath, glob_pattern, exclude = None, prefix = None):
60*523fa7a6SAndroid Build Coastguard Worker    if exclude == None:
61*523fa7a6SAndroid Build Coastguard Worker        exclude = []
62*523fa7a6SAndroid Build Coastguard Worker    results = {}
63*523fa7a6SAndroid Build Coastguard Worker    files = native.glob([paths.join(dirpath, glob_pattern)], exclude = exclude)
64*523fa7a6SAndroid Build Coastguard Worker    for f in files:
65*523fa7a6SAndroid Build Coastguard Worker        if dirpath:
66*523fa7a6SAndroid Build Coastguard Worker            key = f[len(dirpath) + 1:]
67*523fa7a6SAndroid Build Coastguard Worker        else:
68*523fa7a6SAndroid Build Coastguard Worker            key = f
69*523fa7a6SAndroid Build Coastguard Worker        if prefix:
70*523fa7a6SAndroid Build Coastguard Worker            key = paths.join(prefix, key)
71*523fa7a6SAndroid Build Coastguard Worker        results[key] = f
72*523fa7a6SAndroid Build Coastguard Worker
73*523fa7a6SAndroid Build Coastguard Worker    return results
74*523fa7a6SAndroid Build Coastguard Worker
75*523fa7a6SAndroid Build Coastguard Worker# Using a flat list will trigger build errors on Android.
76*523fa7a6SAndroid Build Coastguard Worker# cxx_library will generate an apple_library on iOS, a cxx_library on Android.
77*523fa7a6SAndroid Build Coastguard Worker# Those rules have different behaviors. Using a map will make the behavior consistent.
78*523fa7a6SAndroid Build Coastguard Worker#
79*523fa7a6SAndroid Build Coastguard Workerdef glob_private_headers(glob_patterns, exclude = []):
80*523fa7a6SAndroid Build Coastguard Worker    result = {}
81*523fa7a6SAndroid Build Coastguard Worker    headers = native.glob(glob_patterns, exclude = exclude)
82*523fa7a6SAndroid Build Coastguard Worker    for header in headers:
83*523fa7a6SAndroid Build Coastguard Worker        result[paths.basename(header)] = header
84*523fa7a6SAndroid Build Coastguard Worker    return result
85*523fa7a6SAndroid Build Coastguard Worker
86*523fa7a6SAndroid Build Coastguard Workerdef glob(include, exclude = (), **kwargs):
87*523fa7a6SAndroid Build Coastguard Worker    buildfile = native.read_config("buildfile", "name", "BUCK")
88*523fa7a6SAndroid Build Coastguard Worker    subpkgs = [
89*523fa7a6SAndroid Build Coastguard Worker        target[:-len(buildfile)] + "**/*"
90*523fa7a6SAndroid Build Coastguard Worker        for target in native.glob(["*/**/" + buildfile])
91*523fa7a6SAndroid Build Coastguard Worker    ]
92*523fa7a6SAndroid Build Coastguard Worker    return native.glob(include, exclude = list(exclude) + subpkgs, **kwargs)
93