comparison setup.py @ 27909:bdcbec65750b

setup.py: don't rewrite @LIBDIR@ when creating wheels This is necessary to produce wheels that install properly. More details are captured in an in-line comment. After this patch, produced wheels can be installed via `pip install` and appear to "just work," including on Windows.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 05 Dec 2015 17:52:50 -0800
parents ed1660ce99d9
children cc72b627304e 83a8219fb790
comparison
equal deleted inserted replaced
27908:ed1660ce99d9 27909:bdcbec65750b
477 ('install_lib', 'install_lib')) 477 ('install_lib', 'install_lib'))
478 478
479 def run(self): 479 def run(self):
480 install_scripts.run(self) 480 install_scripts.run(self)
481 481
482 # It only makes sense to replace @LIBDIR@ with the install path if
483 # the install path is known. For wheels, the logic below calculates
484 # the libdir to be "../..". This is because the internal layout of a
485 # wheel archive looks like:
486 #
487 # mercurial-3.6.1.data/scripts/hg
488 # mercurial/__init__.py
489 #
490 # When installing wheels, the subdirectories of the "<pkg>.data"
491 # directory are translated to system local paths and files therein
492 # are copied in place. The mercurial/* files are installed into the
493 # site-packages directory. However, the site-packages directory
494 # isn't known until wheel install time. This means we have no clue
495 # at wheel generation time what the installed site-packages directory
496 # will be. And, wheels don't appear to provide the ability to register
497 # custom code to run during wheel installation. This all means that
498 # we can't reliably set the libdir in wheels: the default behavior
499 # of looking in sys.path must do.
500
482 if (os.path.splitdrive(self.install_dir)[0] != 501 if (os.path.splitdrive(self.install_dir)[0] !=
483 os.path.splitdrive(self.install_lib)[0]): 502 os.path.splitdrive(self.install_lib)[0]):
484 # can't make relative paths from one drive to another, so use an 503 # can't make relative paths from one drive to another, so use an
485 # absolute path instead 504 # absolute path instead
486 libdir = self.install_lib 505 libdir = self.install_lib
496 data = fp.read() 515 data = fp.read()
497 fp.close() 516 fp.close()
498 517
499 # skip binary files 518 # skip binary files
500 if b('\0') in data: 519 if b('\0') in data:
520 continue
521
522 # During local installs, the shebang will be rewritten to the final
523 # install path. During wheel packaging, the shebang has a special
524 # value.
525 if data.startswith(b'#!python'):
526 log.info('not rewriting @LIBDIR@ in %s because install path '
527 'not known' % outfile)
501 continue 528 continue
502 529
503 data = data.replace(b('@LIBDIR@'), libdir.encode(libdir_escape)) 530 data = data.replace(b('@LIBDIR@'), libdir.encode(libdir_escape))
504 fp = open(outfile, 'wb') 531 fp = open(outfile, 'wb')
505 fp.write(data) 532 fp.write(data)