[Distutils] Proposed bdist_dumb fix

Andrew Kuchling akuchlin@mems-exchange.org
Thu Nov 21 14:43:01 2002


Here's a proposed patch to alleviate the bdist_dumb problem.  (Patch
also attached to bug #410541.)

It adds a --from-root Boolean option to bdist_dumb.  from-root
defaults to true, in which case you get the current behaviour.  If you
set it to false, the archive is built from $base, not /, so you end up
with an archive containing ./lib/python2.3/site-packages/my-package on
Unix.  On Windows you should end up with
./Lib/site-packages/mypackage, ./Include/mypackage.h, etc.  Ditto for
the Mac.

The only problem is on Unix if $platbase is different from $base.  For
example, you're installing Python code into /usr/share and C
extensions into /usr/local/.  Here the code simply throws up its hands
and raises an exception.

Thoughts?  Is this a good solution?  Does it work as I expect on
Windows and MacOS 9?

--amk                                                             (www.amk.ca)
I'll never be cruel to an electron in a particle accelerator again.
      -- The Doctor, in "The Pirate Planet"

Index: bdist_dumb.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/distutils/command/bdist_dumb.py,v
retrieving revision 1.22
diff -u -r1.22 bdist_dumb.py
--- bdist_dumb.py	19 Nov 2002 13:12:28 -0000	1.22
+++ bdist_dumb.py	21 Nov 2002 19:35:10 -0000
@@ -33,9 +33,13 @@
                      "directory to put final built distributions in"),
                     ('skip-build', None,
                      "skip rebuilding everything (for testing/debugging)"),
+                    ('from-root=', None,
+                     "build the archive using paths from the root directory "
+                     "and not relative paths " 
+                     "(default: true)"),
                    ]
 
-    boolean_options = ['keep-temp', 'skip-build']
+    boolean_options = ['keep-temp', 'skip-build', 'from-root']
 
     default_format = { 'posix': 'gztar',
                        'nt': 'zip',
@@ -49,7 +53,8 @@
         self.keep_temp = 0
         self.dist_dir = None
         self.skip_build = 0
-
+        self.from_root = 1
+        
     # initialize_options()
 
 
@@ -97,9 +102,29 @@
         if os.name == "os2":
             archive_basename = archive_basename.replace(":", "-")
 
-        self.make_archive(os.path.join(self.dist_dir, archive_basename),
-                          self.format,
-                          root_dir=self.bdist_dir)
+        pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
+        if self.from_root:
+            archive_root = self.bdist_dir
+        else:
+            if (self.distribution.has_ext_modules() and
+                (install.install_base != install.install_platbase)):
+                raise DistutilsPlatformError, \
+                      ("can't make a dumb built distribution where "
+                       "base and platbase are different (%s, %s)"
+                       % (repr(install.install_base),
+                          repr(install.install_platbase)))
+            else:
+                # install_base usually is a full path; we need to
+                # make it a relative path so it can be the second argument
+                # to os.path.join().
+                t = install.install_base
+                if t[0:1] == os.sep:
+                    t = t[1:]
+                archive_root = os.path.join(self.bdist_dir, t)
+
+        # Make the archive
+        self.make_archive(pseudoinstall_root,
+                          self.format, root_dir=archive_root)
 
         if not self.keep_temp:
             remove_tree(self.bdist_dir, dry_run=self.dry_run)