]> git.ipfire.org Git - pakfire.git/commitdiff
Fix automatic dependency detection.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 30 Aug 2011 14:34:36 +0000 (16:34 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 30 Aug 2011 14:34:36 +0000 (16:34 +0200)
pakfire/builder.py
pakfire/constants.py
pakfire/packages/make.py
pakfire/packages/packager.py
po/pakfire.pot

index 28c6fb1398d5a868b0afc5c9af4740bfebab5460..a6185471ec9d5ebfb2db41e93659bb9d667eeb5c 100644 (file)
@@ -696,7 +696,8 @@ class Builder2(object):
                # Make all these little package from the build environment.
                logging.info(_("Creating packages:"))
                for pkg in reversed(self.pkg.packages):
-                       packager = packages.packager.BinaryPackager(self.pakfire, pkg, self.buildroot)
+                       packager = packages.packager.BinaryPackager(self.pakfire, pkg,
+                               self, self.buildroot)
                        packager.run(self.resultdir)
                logging.info("")
 
index 06c3f01b62e76bc8da07b6bba6f72f76b1e54c55..a6bbf6160dd2524219130c22e391da0f5cba8f47 100644 (file)
@@ -117,6 +117,7 @@ package
        license     = %(license)s
 
        summary     = %(summary)s
+
        def description
 %(description)s
        end
index 813ae4f3eafa0cd81558688e0749f966b24b3b03..8f51c57f69e45cf75596f2881f0247309fbf0299 100644 (file)
@@ -21,6 +21,7 @@
 
 import logging
 import os
+import re
 import shutil
 import socket
 import tarfile
@@ -31,6 +32,7 @@ from urlgrabber.progress import TextMeter
 import lexer
 import packager
 
+import pakfire.chroot as chroot
 import pakfire.util as util
 
 from base import Package
@@ -368,6 +370,9 @@ class MakefilePackage(MakefileBase):
                self._name = name
                self.lexer = lexer
 
+               # Store additional dependencies in here.
+               self._dependencies = {}
+
        @property
        def name(self):
                return self._name
@@ -388,28 +393,57 @@ class MakefilePackage(MakefileBase):
        def uuid(self):
                return None
 
-       def get_deps_from_builder(self, builder):
-               pass
+       def track_dependencies(self, builder, path):
+               result = builder.do("/usr/lib/buildsystem-tools/dependency-tracker %s" \
+                       % path, returnOutput=True)
+
+               for line in result.splitlines():
+                       m = re.match(r"^(\w+)=(.*)$", line)
+                       if m is None:
+                               continue
+
+                       key, val = m.groups()
+
+                       if not key in ("prerequires", "requires", "provides", "conflicts", "obsoletes",):
+                               continue
+
+                       val = val.strip("\"")
+                       val = val.split()
+
+                       self._dependencies[key] = sorted(val)
+
+       def get_deps(self, key):
+               # Collect all dependencies that were set in the makefile by the user.
+               deps = self.lexer.get_var(key).split()
+
+               # Collect all dependencies that were discovered by the tracker.
+               deps += self._dependencies.get(key, [])
+
+               # Remove duplicates.
+               deps = set(deps)
+               deps = list(deps)
+
+               return sorted(deps)
 
        @property
        def prerequires(self):
-               return []
+               return self.get_deps("prerequires")
 
        @property
        def requires(self):
-               return []
+               return self.get_deps("requires")
 
        @property
        def provides(self):
-               return []
+               return self.get_deps("provides")
 
        @property
        def obsoletes(self):
-               return []
+               return self.get_deps("obsoletes")
 
        @property
        def conflicts(self):
-               return []
+               return self.get_deps("conflicts")
 
        def get_scriptlet(self, type):
                return self.lexer.scriptlets.get(type, None)
index c5a1fbee3850783bc7154bdc0f5df0cbdcebc8b1..b97bac678c040c7fbcb7887350b52f2ba3aeab5f 100644 (file)
@@ -59,12 +59,19 @@ class Packager(object):
                                continue
 
                        logging.debug("Removing tmpfile: %s" % file)
-                       os.remove(file)
 
-       def mktemp(self):
+                       if os.path.isdir(file):
+                               util.rm(file)
+                       else:
+                               os.remove(file)
+
+       def mktemp(self, directory=False):
                # XXX use real mk(s)temp here
                filename = os.path.join("/", LOCAL_TMP_PATH, util.random_string())
 
+               if directory:
+                       os.makedirs(filename)
+
                self.tmpfiles.append(filename)
 
                return filename
@@ -170,14 +177,25 @@ class Packager(object):
 
 
 class BinaryPackager(Packager):
-       def __init__(self, pakfire, pkg, buildroot):
+       def __init__(self, pakfire, pkg, builder, buildroot):
                Packager.__init__(self, pakfire, pkg)
 
+               self.builder = builder
                self.buildroot = buildroot
 
        def create_metafile(self, datafile):
                info = collections.defaultdict(lambda: "")
 
+               # Extract datafile in temporary directory and scan for dependencies.
+               tmpdir = self.mktemp(directory=True)
+
+               tarfile = InnerTarFile(datafile)
+               tarfile.extractall(path=tmpdir)
+               tarfile.close()
+
+               # Run the dependency tracker.
+               self.pkg.track_dependencies(self.builder, tmpdir)
+
                # Generic package information including Pakfire information.
                info.update({
                        "pakfire_version" : PAKFIRE_VERSION,
@@ -190,8 +208,17 @@ class BinaryPackager(Packager):
 
                # Update package information for string formatting.
                info.update({
-                       "groups"   : " ".join(self.pkg.groups),
-                       "requires" : " ".join(self.pkg.requires),
+                       "groups"      : " ".join(self.pkg.groups),
+                       "prerequires" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+                               for d in self.pkg.prerequires]),
+                       "requires"    : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+                               for d in self.pkg.requires]),
+                       "provides"    : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+                               for d in self.pkg.provides]),
+                       "conflicts"   : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+                               for d in self.pkg.conflicts]),
+                       "obsoletes"   : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+                               for d in self.pkg.obsoletes]),
                })
 
                # Format description.
index 2f6c0805c29882a693362aaa12b7065571ac0e24..ffeb57b566fe62fab9f3ad8c0e2bebbf4bad4728 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-08-29 18:18+0200\n"
+"POT-Creation-Date: 2011-08-29 19:24+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -334,7 +334,7 @@ msgstr ""
 msgid "Do not verify build dependencies."
 msgstr ""
 
-#: ../pakfire/compress.py:133 ../pakfire/packages/packager.py:462
+#: ../pakfire/compress.py:133 ../pakfire/packages/packager.py:483
 #, python-format
 msgid "Compressing %s"
 msgstr ""
@@ -465,11 +465,11 @@ msgid "Package version is undefined."
 msgstr ""
 
 #. Load progressbar.
-#: ../pakfire/packages/packager.py:288
+#: ../pakfire/packages/packager.py:309
 msgid "Packaging"
 msgstr ""
 
-#: ../pakfire/packages/packager.py:579
+#: ../pakfire/packages/packager.py:600
 #, python-format
 msgid "Building source package %s:"
 msgstr ""