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