[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)