[ostree] ostbuild: Clean up artifact splitting, put non-symlink .so in runtime



commit d5def94b54a7045285d0fc1897ed3795a9cf96ed
Author: Colin Walters <walters verbum org>
Date:   Sun Jan 15 21:45:12 2012 -0500

    ostbuild: Clean up artifact splitting, put non-symlink .so in runtime
    
    We were breaking nss which just installs libnss3.so as the real
    shared library.

 src/ostbuild/pyostbuild/builtin_compile_one.py |  154 +++++++++---------------
 1 files changed, 56 insertions(+), 98 deletions(-)
---
diff --git a/src/ostbuild/pyostbuild/builtin_compile_one.py b/src/ostbuild/pyostbuild/builtin_compile_one.py
index de99d67..b18f00d 100755
--- a/src/ostbuild/pyostbuild/builtin_compile_one.py
+++ b/src/ostbuild/pyostbuild/builtin_compile_one.py
@@ -30,24 +30,15 @@ from .subprocess_helpers import run_sync
 
 PREFIX = '/usr'
 
-_BLACKLIST_REGEXPS = map(re.compile, 
-                         [r'.*\.la$',
-                          ])
+_DOC_DIRS = ['usr/share/doc',
+             'usr/share/gtk-doc',
+             'usr/share/man',
+             'usr/share/info']
 
-_RUNTIME_DIRS = ['/etc']
-
-_DOC_DIRS = ['/usr/share/doc',
-             '/usr/share/gtk-doc',
-             '/usr/share/man',
-             '/usr/share/info']
-
-_DEVEL_DIRS = ['/usr/include',
-               '/usr/share/aclocal',
-               '/usr/share/pkgconfig',
-               '/usr/lib/pkgconfig']
-
-_DEVEL_REGEXPS = map(re.compile,
-                     [r'/(?:usr/)lib/[^/]+\.(?:so|a)$'])
+_DEVEL_DIRS = ['usr/include',
+               'usr/share/aclocal',
+               'usr/share/pkgconfig',
+               'usr/lib/pkgconfig']
 
 class OstbuildCompileOne(builtins.Builtin):
     name = "compile-one"
@@ -207,66 +198,49 @@ class OstbuildCompileOne(builtins.Builtin):
         args = ['make', 'install', 'DESTDIR=' + tempdir]
         run_sync(args, cwd=builddir)
     
-        devel_files = set()
-        doc_files = set()
-        runtime_files = set()
-    
-        oldpwd=os.getcwd()
-        os.chdir(tempdir)
-        for root, dirs, files in os.walk('.'):
-            deleted_dirs = set() 
-            for dirname in dirs:
-                path = os.path.join(root, dirname)
-                subpath = path[1:]
-                matched = False
-                for runtime_name in _RUNTIME_DIRS:
-                    if subpath.startswith(runtime_name):
-                        runtime_files.add(path)
-                        matched = True
-                        break
-                if not matched:
-                    for devel_name in _DEVEL_DIRS:
-                        if subpath.startswith(devel_name):
-                            devel_files.add(path)
-                            matched = True
-                            break
-                if not matched:
-                    for doc_name in _DOC_DIRS:
-                        if subpath.startswith(doc_name):
-                            doc_files.add(path)
-                            matched = True
-                            break
-                if matched:
-                    deleted_dirs.add(dirname)
-            for dirname in deleted_dirs:
-                dirs.remove(dirname)
-    
-            for filename in files:
-                path = os.path.join(root, filename)
-    
-                blacklisted = False
-                for r in _BLACKLIST_REGEXPS:
-                    if r.match(path):
-                        blacklisted = True
-                        break
-    
-                if blacklisted:
+        runtime_path = os.path.join(self.ostbuild_resultdir, 'runtime')
+        devel_path = os.path.join(self.ostbuild_resultdir, 'devel')
+        docs_path = os.path.join(self.ostbuild_resultdir, 'docs')
+        for artifact_type in ['runtime', 'devel', 'docs']:
+            resultdir = os.path.join(self.ostbuild_resultdir, artifact_type)
+            if os.path.isdir(resultdir):
+                shutil.rmtree(resultdir)
+            os.makedirs(resultdir)
+
+        # Move symbolic links for shared libraries as well
+        # as static libraries.  And delete all .la files.
+        for libdirname in ['lib', 'usr/lib']:
+            path = os.path.join(tempdir, libdirname)
+            if not os.path.isdir(path):
+                continue
+            for filename in os.listdir(path):
+                subpath = os.path.join(path, filename)
+                if filename.endswith('.la'):
+                    os.unlink(subpath)
                     continue
-
-                matched = False
-                for r in _DEVEL_REGEXPS:
-                    if not r.match(path[1:]):
-                        continue
-                    devel_files.add(path)
-                    matched = True
-                    break
-                if not matched:    
-                    runtime_files.add(path)
-        os.chdir(oldpwd)
+                if not ((filename.endswith('.so')
+                         and os.path.islink(filename))
+                        or filename.endswith('.a')):
+                    continue
+                dest = os.path.join(devel_path, libdirname, filename)
+                self._install_and_unlink(subpath, dest)
+
+        for dirname in _DEVEL_DIRS:
+            dirpath = os.path.join(tempdir, dirname)
+            if os.path.isdir(dirpath):
+                dest = os.path.join(devel_path, dirname)
+                self._install_and_unlink(dirpath, dest)
+
+        for dirname in _DOC_DIRS:
+            dirpath = os.path.join(tempdir, dirname)
+            if os.path.isdir(dirpath):
+                dest = os.path.join(docs_path, dirname)
+                self._install_and_unlink(dirpath, dest)
     
-        self.make_artifact('devel', devel_files, tempdir=tempdir)
-        self.make_artifact('doc', doc_files, tempdir=tempdir)
-        self.make_artifact('runtime', runtime_files, tempdir=tempdir)
+        for filename in os.listdir(tempdir):
+            src_path = os.path.join(tempdir, filename)
+            dest_path = os.path.join(runtime_path, filename)
+            self._install_and_unlink(src_path, dest_path)
 
         for tmpname in self.tempfiles:
             assert os.path.isabs(tmpname)
@@ -278,9 +252,11 @@ class OstbuildCompileOne(builtins.Builtin):
                 except OSError, e:
                     pass
 
-    def _rename_or_copy(self, src, dest):
+    def _install_and_unlink(self, src, dest):
         statsrc = os.lstat(src)
-        statdest = os.lstat(os.path.dirname(dest))
+        dirname = os.path.dirname(dest)
+        if not os.path.isdir(dirname):
+            os.makedirs(dirname)
 
         if stat.S_ISDIR(statsrc.st_mode):
             if not os.path.isdir(dest):
@@ -289,7 +265,8 @@ class OstbuildCompileOne(builtins.Builtin):
                 src_child = os.path.join(src, filename)
                 dest_child = os.path.join(dest, filename)
 
-                self._rename_or_copy(src_child, dest_child)
+                self._install_and_unlink(src_child, dest_child)
+            os.rmdir(src)
         else:
             try:
                 os.rename(src, dest)
@@ -299,25 +276,6 @@ class OstbuildCompileOne(builtins.Builtin):
                     os.symlink(linkto, dest)
                 else:
                     shutil.copy2(src, dest)
-    
-    def make_artifact(self, dirtype, from_files, tempdir):
-        resultdir = os.path.join(self.ostbuild_resultdir, dirtype)
-        if os.path.isdir(resultdir):
-            shutil.rmtree(resultdir)
-        os.makedirs(resultdir)
-                                 
-        for filename in from_files:
-            if filename.startswith('./'):
-                filename = filename[2:]
-            src_path = os.path.join(tempdir, filename)
-            dest_path = os.path.join(resultdir, filename)
-            dest_dir = os.path.dirname(dest_path)
-            if not os.path.isdir(dest_dir):
-                os.makedirs(dest_dir)
-            try:
-                self._rename_or_copy(src_path, dest_path)
-            except OSError, e:
-                fatal("Failed to copy %r to %r: %d %s" % (src_path, dest_path, e.errno, e.strerror))
-        log("created: %s" % (os.path.abspath (resultdir), ))
+                os.unlink(src)
     
 builtins.register(OstbuildCompileOne)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]