from bbc microbit library

Fork of nrf51-sdk by Lancaster University

Revision:
0:bc2961fa1ef0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/script/pick_nrf51_files.py	Wed Apr 06 23:55:04 2016 +0100
@@ -0,0 +1,126 @@
+#!/usr/bin/env python
+
+import os, shutil, json, pprint, sys
+from collections import OrderedDict
+
+help_text = """
+Usage: python {} [options] <full-noridc-sdk-path> <nrf51-sdk-yotta-module-path>
+options: --purge   : to delete all existing files and start again
+         --dry-run : to list the files to be copied but not actually copy them
+""".format(os.path.basename(__file__))
+
+# exclude path to avoid confusion over files of the same name
+exclude_path = ["examples", "SVD", "s110", "s120", "s210", "s310", "nrf_soc_nosd", "serialization/connectivity",
+                'components/libraries/hci/config', 'components/libraries/bootloader_dfu/ble_transport']
+
+def find(name, path):
+    paths = []
+    for root, dirs, files in os.walk(path):
+        if True not in [x in root for x in exclude_path]:
+            if name in files:
+                paths.append(os.path.join(root, name))
+
+    if len(paths) == 0:
+        print "-"*30
+        print "Warning! No {} found!!!!".format(name)
+        print "-"*30
+        return None
+    elif len(paths) > 1:
+        print "-"*30
+        print "Warning! More than one {} found!!!!".format(name)
+        print paths
+        print "-"*30
+        return None
+    else:
+        return paths[0]
+
+def find_dir(dir_name, path):
+    paths = []
+    for root, dirs, files in os.walk(path):
+        if dir_name in root:
+            for fn in files:
+                paths.append(os.path.join(root, fn))
+    return paths
+
+if __name__ == "__main__":
+    # define source and destination of copy
+    arg_valid = True
+    if len(sys.argv) not in [3, 4]:
+        arg_valid = False
+    else:
+        src_folder = sys.argv[-2]
+        yt_module_dir = sys.argv[-1]
+
+        for d in [src_folder, yt_module_dir]:
+            if not os.path.isdir(d):
+                arg_valid = False
+                print src_folder, "is not a folder"
+
+    purge = ("--purge" in sys.argv)
+    dry_run = ("--dry-run" in sys.argv)
+
+    if not arg_valid:
+        print help_text
+        sys.exit(1)
+
+    dst_folder = os.path.join(yt_module_dir, "source/nordic_sdk")
+
+    # build a file_list from required_files.txt
+    file_list = []
+    with open("required_files.txt", "r") as fd:
+        for line in fd:
+            line = line.strip()
+            if line.startswith("D "):
+                directory = line.split(" ")[-1]
+                file_list += find_dir(directory, src_folder)
+            elif not line.startswith("#") and line != '':
+                fn = os.path.basename(line).strip()
+                fn = find(fn, src_folder)
+                file_list.append(fn)
+
+    # remove everything from the destination folder
+    if purge and not dry_run and os.path.exists(dst_folder):
+        shutil.rmtree(dst_folder)
+
+    # copy files
+    extra_includes = []
+    for src in file_list:
+        if src:
+            rel_dst = os.path.relpath(src, src_folder)
+            dst = os.path.join(dst_folder, rel_dst)
+            print src, "->", dst
+
+            directory = os.path.dirname(dst)
+            if not os.path.exists(directory):
+                print "Creating directory:", directory
+                if not dry_run:
+                    os.makedirs(directory)
+            if not os.path.isfile(dst):
+                print "Copying file", dst
+                if not dry_run:
+                    shutil.copyfile(src, dst)
+
+            # build a list of extra includes to be added to module.json
+            if dst.endswith(".h"):
+                inc_rel_path = os.path.relpath(dst, yt_module_dir)
+                inc_dir_path = os.path.dirname(inc_rel_path)
+                if inc_dir_path not in extra_includes:
+                    extra_includes.append(inc_dir_path)
+
+    # write extraIncludes in the module.json file
+    mod_json = os.path.join(yt_module_dir, "module.json")
+    print "-"*30
+    print "Writing extra_includes to {}".format(mod_json)
+    print "-"*30
+    for n in sorted(extra_includes):
+        print n
+
+    if not dry_run:
+        with open(mod_json, 'r+') as fd:
+            jobj = json.loads(fd.read(), object_pairs_hook=OrderedDict)
+            jobj['extraIncludes'] = sorted(extra_includes)
+            jdump = json.dumps(jobj, indent=2, separators=(',', ': '))
+            fd.seek(0)
+            fd.write(jdump)
+            fd.write("\n")
+            fd.truncate()