]> granicus.if.org Git - python/commitdiff
Reworked --strip option: it will now look at _any_ file that's marked
authorJust van Rossum <just@letterror.com>
Fri, 20 Jun 2003 21:18:22 +0000 (21:18 +0000)
committerJust van Rossum <just@letterror.com>
Fri, 20 Jun 2003 21:18:22 +0000 (21:18 +0000)
executable in the bundle. Therefore got rid of the "binaries" attribute.

Lib/plat-mac/bundlebuilder.py

index 9780fe638dd85277609d007499758a22ae8df4e2..a07e97f22ecf038b928bcfe36e9e7d3311faed2e 100755 (executable)
@@ -363,7 +363,7 @@ class AppBuilder(BundleBuilder):
     # Include these packages.
     includePackages = []
 
-    # Strip binaries.
+    # Strip binaries from debug info.
     strip = 0
 
     # Found Python modules: [(name, codeobject, ispkg), ...]
@@ -373,9 +373,6 @@ class AppBuilder(BundleBuilder):
     missingModules = []
     maybeMissingModules = []
 
-    # List of all binaries (executables or shared libs), for stripping purposes
-    binaries = []
-
     def setup(self):
         if self.standalone and self.mainprogram is None:
             raise BundleBuilderError, ("must specify 'mainprogram' when "
@@ -425,7 +422,6 @@ class AppBuilder(BundleBuilder):
             execpath = pathjoin(self.execdir, execname)
             if not self.symlink_exec:
                 self.files.append((self.executable, execpath))
-                self.binaries.append(execpath)
             self.execpath = execpath
 
         if self.mainprogram is not None:
@@ -502,8 +498,6 @@ class AppBuilder(BundleBuilder):
         for item in PYTHONFRAMEWORKGOODIES:
             src = pathjoin(frameworkpath, item)
             dst = pathjoin(destbase, item)
-            if item == "Python":
-                self.binaries.append(dst)
             self.files.append((src, dst))
 
     def addPythonModules(self):
@@ -546,12 +540,30 @@ class AppBuilder(BundleBuilder):
             self.message("Error: can't strip binaries: no strip program at "
                 "%s" % STRIP_EXEC, 0)
         else:
+            import stat
             self.message("Stripping binaries", 1)
-            for relpath in self.binaries:
-                self.message("Stripping %s" % relpath, 2)
-                abspath = pathjoin(self.bundlepath, relpath)
-                if not os.path.islink(abspath):
-                    rv = os.system("%s -S \"%s\"" % (STRIP_EXEC, abspath))
+            def walk(top):
+                for name in os.listdir(top):
+                    path = pathjoin(top, name)
+                    if os.path.islink(path):
+                        continue
+                    if os.path.isdir(path):
+                        walk(path)
+                    else:
+                        mod = os.stat(path)[stat.ST_MODE]
+                        if not (mod & 0100):
+                            continue
+                        relpath = path[len(self.bundlepath):]
+                        self.message("Stripping %s" % relpath, 2)
+                        inf, outf = os.popen4("%s -S \"%s\"" %
+                                              (STRIP_EXEC, path))
+                        output = outf.read().strip()
+                        if output:
+                            # usually not a real problem, like when we're
+                            # trying to strip a script
+                            self.message("Problem stripping %s:" % relpath, 3)
+                            self.message(output, 3)
+            walk(self.bundlepath)
 
     def findDependencies(self):
         self.message("Finding module dependencies", 1)
@@ -598,7 +610,6 @@ class AppBuilder(BundleBuilder):
                     dstpath = name.split(".")[:-1] + [filename]
                     dstpath = pathjoin("Contents", "Resources", *dstpath)
                 self.files.append((path, dstpath))
-                self.binaries.append(dstpath)
             if mod.__code__ is not None:
                 ispkg = mod.__path__ is not None
                 if not USE_ZIPIMPORT or name != "site":