[poky] [PATCH 1/1] scripts/multilib-check: Check for multilib build results

Dongxiao Xu dongxiao.xu at intel.com
Mon Jul 2 15:09:22 PDT 2012


This script is used to check whether the multilib build for a certain
recipe outcomes the right files/directories.

The usage for the script is:

$ source oe-init-build-env
$ multilib-check recipeA recipeB ...

or

$ source oe-init-build-env
$ multilib-check world

This fixes [YOCTO #2038]

Signed-off-by: Dongxiao Xu <dongxiao.xu at intel.com>
---
 scripts/multilib-check |  117 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 117 insertions(+), 0 deletions(-)
 create mode 100755 scripts/multilib-check

diff --git a/scripts/multilib-check b/scripts/multilib-check
new file mode 100755
index 0000000..69a5dd3
--- /dev/null
+++ b/scripts/multilib-check
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+
+import os
+import os.path
+import sys
+
+# AAA: BBB
+# AAA is the multilib prefix, BBB is its DEFAULTTUNE.
+multilib_arch_tune = {"lib32": "x86", "lib64": "x86-64"}
+
+# The machine we now support is x86 and x86-64.
+machine = "qemux86"
+
+def usage():
+    print("Usage: multilib-check recipe_name1 recipe_name2 ... \n \
+           or multilib-check world")
+
+def generate_multilib_config():
+    os.system("cp -f conf/local.conf conf/local.conf.orig")
+    f = open("conf/local.conf", "a")
+    f.write('require conf/multilib.conf\n')
+    multilibs = ""
+    for i in multilib_arch_tune.keys():
+        f.write('DEFAULTTUNE_virtclass-multilib-%s="%s"\n' % (i, multilib_arch_tune[i]))
+        multilibs += "multilib:%s " % i
+    f.write('MULTILIBS="%s"\n' % multilibs.strip())
+    f.close()
+    
+def restore_original_config():
+    os.system("mv -f conf/local.conf.orig conf/local.conf")
+
+def build_recipe(mach, recipe_name):
+    print("INFO: Building %s ..." % recipe_name)
+    return os.system("MACHINE=%s bitbake %s &> /dev/null" % (mach, recipe_name))
+
+def get_variable(mach, recipe_name, variable):
+    return os.popen('bitbake -e %s | grep "^%s="' % (recipe_name, variable)).readline().split("%s=" % variable)[1].strip("\"\n")
+
+# Check if dir2 contains the same set of files as in dir1.
+def compare_folders(dir1, dir2):
+    if not os.path.exists(dir1):
+        return
+    for i in os.listdir(dir1):
+        path_normal = os.path.join(dir1, i)
+        path_multilib = os.path.join(dir2, i)
+
+        if not os.path.exists(path_multilib):
+            print("ERROR: %s exists while %s doesn't" % (path_normal, path_multilib))
+            continue
+
+        if os.path.isdir(path_normal):
+            if not os.path.isdir(path_multilib):
+                print("ERROR: %s is a directory while %s is a file" % (path_normal, path_multilib))
+                continue
+            compare_folders(path_normal, path_multilib)
+        else:
+            if not os.path.isfile(path_multilib):
+                print("ERROR: %s is a file while %s is a directory" % (path_normal, path_multilib))
+
+def multilib_sanity_check(rootdir_normal, baselib_normal, rootdir_multilib, baselib_multilib):
+    compare_folders(rootdir_normal+"/usr/"+baselib_normal, rootdir_multilib+"/usr/"+baselib_multilib)
+    compare_folders(rootdir_normal+"/"+baselib_normal, rootdir_multilib+"/"+baselib_multilib)
+
+# Use bitbake -s to get the recipe list, for example "world"
+def get_recipe_list(name):
+    begin = False
+    recipe_list = []
+    fd = os.popen('bitbake -s %s' % name)
+    for i in fd:
+        if i.startswith("============"):
+            begin = True
+            continue
+        if begin and i.strip("\n"):
+            recipe_name = i.split()[0].strip()
+            if "native" in recipe_name:
+                continue
+            else:
+                recipe_list.append(recipe_name)
+
+    return recipe_list
+
+def main():
+    if len(sys.argv) <= 1:
+        usage()
+        exit(1)
+    elif len(sys.argv) == 2 and sys.argv[1] == "world":
+        recipe_list = get_recipe_list("world")
+    else:
+        recipe_list = sys.argv[1:]
+
+    mach = machine
+    generate_multilib_config()
+    try:
+        for i in range(0, len(recipe_list)):
+            print("INFO: checking for recipe %s ..." % recipe_list[i])
+            ret = build_recipe(mach, recipe_list[i])
+            if ret:
+                print("ERROR: Build %s failed" % recipe_list[i])
+                continue
+            rootdir_normal = get_variable(mach, recipe_list[i], "WORKDIR") + "/image"
+            baselib_normal = get_variable(mach, recipe_list[i], "baselib")
+
+            for j in multilib_arch_tune.keys():
+                ret = build_recipe(mach, j + "-" + recipe_list[i])
+                if ret:
+                    print("ERROR: Build %s failed" % (j + "-" + recipe_list[i]))
+                    continue
+                rootdir_multilib = get_variable(mach, j + "-" + recipe_list[i], "WORKDIR") + "/image"
+                baselib_multilib = get_variable(mach, j + "-" + recipe_list[i], "baselib")
+
+                multilib_sanity_check(rootdir_normal, baselib_normal, rootdir_multilib, baselib_multilib)
+    except Exception as e:
+        print "ERROR: %s" % e
+    finally:
+        restore_original_config()
+
+main()
-- 
1.7.4.1




More information about the poky mailing list