about summary refs log tree commit diff homepage
path: root/scripts/build/build-ci-container.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/build/build-ci-container.py')
-rwxr-xr-xscripts/build/build-ci-container.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/scripts/build/build-ci-container.py b/scripts/build/build-ci-container.py
new file mode 100755
index 00000000..c9264674
--- /dev/null
+++ b/scripts/build/build-ci-container.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+import yaml
+import subprocess
+import os
+
+(abs_path, _) = os.path.split(os.path.abspath(__file__))
+
+with open(os.path.join(abs_path,"../../.github/workflows/build.yaml"), 'r') as stream:
+    try:
+        ci_config = yaml.safe_load(stream)
+        global_env = ci_config['env']
+        print(ci_config['jobs']['Linux']['strategy']['matrix']['include'])
+        for job in ci_config['jobs']['Linux']['strategy']['matrix']['include']:
+            if job['name'] in ["Docker", "macOS"]:
+                print("Skip: {}".format(job['name']))
+                continue
+
+            print("Building: {}".format(job['name']))
+
+            build_env = os.environ.copy()
+
+            # Copy current global build configurations
+            build_vars = dict(global_env)
+
+            # Override with job specific values
+            for k,v in job['env'].items():
+                build_vars[k] = v
+
+            cmd = [os.path.join(abs_path, 'build.sh'),
+                  'klee', # build KLEE and all its dependencies
+                  '--docker', # using docker containers
+                  '--push-docker-deps', # push containers if possible
+                  '--debug', # print debug output
+                  '--create-final-image', # assume KLEE is the final image
+                  ]
+
+            env_str = ["{}={}".format(k,v) for k,v in build_vars.items()]
+            print("{} {}".format(" ".join(env_str)," ".join(cmd)) )
+
+            process = subprocess.Popen(cmd, # Assume KLEE is the final image
+                            stdout=subprocess.PIPE,
+                            universal_newlines=True,
+                            env = build_env)
+
+            while True:
+                output = process.stdout.readline()
+                print(output.strip())
+                return_code = process.poll()
+                if return_code is not None:
+                    print('Building image failed: {}'.format(return_code))
+                    for output in process.stdout.readlines():
+                        print(output.strip())
+                    break
+
+    except yaml.YAMLError as exc:
+        print(exc)
\ No newline at end of file