Skip to content

Commit 8076f1f

Browse files
author
Justin Nolan
committed
Prevents VariantDir from duplicating source files
1 parent d8f908c commit 8076f1f

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

SConstruct

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ if _SCRIPTS_DIR not in sys.path:
1414

1515
# Local
1616
from build.option_handler import OptionsClass
17-
from build.glob_recursive import GlobRecursive
17+
from build.glob_recursive import GlobRecursive, GlobRecursiveVariant
1818
from build.git_info import get_git_info, git_builder
1919
from build.license_info import license_builder
2020
from build.author_info import author_builder
@@ -287,6 +287,7 @@ def FinalizeOptions():
287287
env.SetupOptions = SetupOptions
288288
env.FinalizeOptions = FinalizeOptions
289289
env.GlobRecursive = GlobRecursive
290+
env.GlobRecursiveVariant = lambda pattern, src, variant, exclude=None: GlobRecursiveVariant(env, pattern, src, variant, exclude)
290291
env.get_git_info = get_git_info
291292
env.license_builder = license_builder
292293
env.git_builder = git_builder

build/glob_recursive.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,23 @@ def norm(s):
2929
norm_exclude = [norm(p) for p in exclude]
3030
results = [r for r in results if not any(fnmatch.fnmatch(norm(r), p) for p in norm_exclude)]
3131
return results
32+
33+
34+
def GlobRecursiveVariant(env, pattern, src_root, variant_root, exclude=None):
35+
src_nodes = GlobRecursive(pattern, [src_root])
36+
src_abs = env.Dir(src_root).abspath.replace("\\", "/").rstrip("/") + "/"
37+
variant_prefix = env.Dir(variant_root).abspath.replace("\\", "/").rstrip("/") + "/"
38+
if exclude is None:
39+
exclude_abs = set()
40+
else:
41+
if isinstance(exclude, str):
42+
exclude = [exclude]
43+
exclude_abs = {env.File(e).abspath.replace("\\", "/") for e in exclude}
44+
out = []
45+
for n in src_nodes:
46+
p = n.abspath.replace("\\", "/")
47+
if p in exclude_abs:
48+
continue
49+
assert p.startswith(src_abs), f"{p!r} not under {src_abs!r}"
50+
out.append(env.File(variant_prefix + p[len(src_abs) :]))
51+
return out

0 commit comments

Comments
 (0)