diff options
Diffstat (limited to 'cmake/glob-symlinks.py')
| -rwxr-xr-x | cmake/glob-symlinks.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/cmake/glob-symlinks.py b/cmake/glob-symlinks.py new file mode 100755 index 0000000..23a869c --- /dev/null +++ b/cmake/glob-symlinks.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 + +# Helper script used by the NestedVM cmake build script. +# +# Usage: glob-symlinks.py <srcdir> <wildcard> [<srcdir> <wildcard> ...] +# +# Each pair of command-line arguments is treated as a source +# directory, followed by either a single filename or a wildcard. +# +# The result is to create symlinks in the program's working directory +# mirroring all the files matched by the filenames/wildcards, each +# pointing at the appropriate source directory. +# +# For example, this command +# glob-symlinks.py /foo \*.txt /bar wibble.blah +# might create symlinks as follows: +# this.txt -> /foo/this.txt +# that.txt -> /foo/that.txt +# wibble.blah -> /bar/wibble.blah +# +# CMake could mostly do this itself, except that some of the files +# that need symlinking during the NestedVM build (to make a tree that +# we archive up into a .jar file) are Java class files with some +# '$suffix' in the name, and CMake doesn't escape the $ signs, so that +# the suffix vanishes during shell expansion. + +import sys +import os +import glob + +def get_arg_pairs(): + args = iter(sys.argv) + next(args) # skip program name + while True: + try: + yield next(args), next(args) + except StopIteration: + break + +def get_globbed_pairs(): + for srcdir, pattern in get_arg_pairs(): + if glob.escape(pattern) == pattern: + # Assume that unglobbed filenames exist + #print("non-glob:", srcdir, pattern) + yield srcdir, pattern + else: + #print("globbing:", srcdir, pattern) + prefix = srcdir + "/" + for filename in glob.iglob(prefix + pattern): + assert filename.startswith(prefix) + filename = filename[len(prefix):] + #print(" ->", srcdir, filename) + yield srcdir, filename + +for srcdir, filename in get_globbed_pairs(): + dirname = os.path.dirname(filename) + if len(dirname) > 0: + try: + os.makedirs(dirname) + except FileExistsError: + pass + try: + os.symlink(os.path.join(srcdir, filename), filename) + except FileExistsError: + pass |