[PATCH] build: Add build specification items pickle cache

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Nov 8 14:02:48 UTC 2019


---
 .gitignore |  1 +
 wscript    | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore
index d7ca74b338..0ff9d6929e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@ doc
 .lock*
 Makefile.in
 *.pyc
+/spec/build/items.cache
 /testsuites/build/bin/fake-rtems5-g++
 /testsuites/build/build
 /testsuites/build/wscript
diff --git a/wscript b/wscript
index 785272deb9..101bd9b8e1 100755
--- a/wscript
+++ b/wscript
@@ -27,6 +27,7 @@
 
 from __future__ import print_function
 
+import pickle
 import os
 import re
 import stat
@@ -645,22 +646,58 @@ class BuildItemContext(object):
         self.objects = objects
 
 
-def load_items_in_directory(ctx, ctors, path):
+def must_update_item_cache(ctx, path, mtime):
+    try:
+        names = os.listdir(path)
+    except Exception as e:
+        ctx.fatal("Cannot list build specification directory: {}".format(e))
+    for name in names:
+        path2 = os.path.join(path, name)
+        if name.endswith(".yml") and not name.startswith("."):
+            mtime2 = os.path.getmtime(path2)
+            if mtime <= mtime2:
+                return True
+        else:
+            mode = os.lstat(path2).st_mode
+            if stat.S_ISDIR(mode) and must_update_item_cache(ctx, path2, mtime):
+                return True
+    return False
+
+
+def create_cache_from_yaml(ctx, data_by_uid, path):
     try:
         names = os.listdir(path)
     except Exception as e:
         ctx.fatal("Cannot list build specification directory: {}".format(e))
     for name in names:
-        fullname = os.path.join(path, name)
+        path2 = os.path.join(path, name)
         if name.endswith(".yml") and not name.startswith("."):
             uid = os.path.basename(name).replace(".yml", "")
-            data = yaml.safe_load(open(fullname, "r").read())
-            if data["type"] == "build":
-                items[uid] = ctors[data["build-type"]](uid, data)
+            with open(path2, "r") as f:
+                data_by_uid[uid] = yaml.safe_load(f.read())
         else:
-            mode = os.lstat(fullname).st_mode
+            mode = os.lstat(path2).st_mode
             if stat.S_ISDIR(mode):
-                load_items_in_directory(ctx, ctors, fullname)
+                create_cache_from_yaml(ctx, data_by_uid, path2)
+
+
+def load_items_in_directory(ctx, ctors, path):
+    cache_file = path + "/items.cache"
+    try:
+        mtime = os.path.getmtime(cache_file)
+    except:
+        mtime = 0
+    data_by_uid = {}
+    if must_update_item_cache(ctx, path, mtime):
+        create_cache_from_yaml(ctx, data_by_uid, path)
+        with open(cache_file, "wb") as f:
+            pickle.dump(data_by_uid, f)
+    else:
+        with open(cache_file, "rb") as f:
+            data_by_uid = pickle.load(f)
+    for uid, data in data_by_uid.items():
+        if data["type"] == "build":
+            items[uid] = ctors[data["build-type"]](uid, data)
 
 
 def load_items(ctx, specs):
-- 
2.16.4



More information about the devel mailing list