support installation under arbitrary prefix
authorTimo Savola <tsavola@movial.fi>
Tue, 29 Apr 2008 10:48:11 +0000 (13:48 +0300)
committerTimo Savola <tsavola@movial.fi>
Tue, 29 Apr 2008 10:48:11 +0000 (13:48 +0300)
hacks to work around shortcomings of distutils:

    * intercept --prefix by filtering command-line options through optparse
      before passing them to distutils

    * guess module location from installation prefix and Python version

    * modify installed scripts in-place

bin/matrix
bin/matrix-graph
setup.py

index f216a46..b4339a9 100755 (executable)
@@ -1,20 +1,20 @@
 #!/usr/bin/env python
 
-import os.path
+moduledir = '@MODULEDIR@'
+scriptdir = '@SCRIPTDIR@'
+
 import sys
+from os.path import dirname, abspath
+
+if moduledir.startswith('@'):
+       moduledir = dirname(dirname(abspath(sys.argv[0])))
+       scriptdir = moduledir
 
-path = None
-if os.path.sep in sys.argv[0] and os.path.exists(sys.argv[0]):
-       path = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
-       if os.path.exists(os.path.join(path, 'matrix', '__init__.py')):
-               sys.path.insert(0, path)
+sys.path.insert(0, moduledir)
 
 from matrix import matrix, config, log
 
-if path and os.path.exists(os.path.join(path, 'scripts', 'matrix.mk')):
-       config.script_dir = os.path.join(path, 'scripts')
-else:
-       config.script_dir = os.path.join(sys.prefix, 'share', 'matrix', 'scripts')
+config.script_dir = scriptdir
 
 try:
        matrix.main()
index ebdeefd..52327ef 100755 (executable)
@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
-import os.path
+moduledir = '@MODULEDIR@'
+
 import sys
+from os.path import dirname, abspath
+
+if moduledir.startswith('@'):
+       moduledir = dirname(dirname(abspath(sys.argv[0])))
 
-if os.path.sep in sys.argv[0] and os.path.exists(sys.argv[0]):
-       path = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
-       if os.path.exists(os.path.join(path, 'matrix', '__init__.py')):
-               sys.path.insert(0, path)
+sys.path.insert(0, moduledir)
 
 from matrix import graph
 
index 8bc4a50..8606bce 100644 (file)
--- a/setup.py
+++ b/setup.py
 #!/usr/bin/env python
 
-from distutils.core import setup
+import distutils.core
+import optparse
+import sys
+import os
 from glob import glob
+from os.path import join
 
-setup(
+def add_flag(option, opt, value, parser):
+       dist_args.append(opt)
+
+def add_value(option, opt, value, parser):
+       dist_args.append(opt)
+       dist_args.append(value)
+
+def add_prefix_value(option, opt, value, parser):
+       global dist_prefix
+       dist_prefix = value
+       add_value(option, opt, value, parser)
+
+parser = optparse.OptionParser()
+parser.add_option(
+       '--prefix',
+       help='installation prefix',
+       action='callback', callback=add_prefix_value, type=str)
+parser.add_option(
+       '--compile',
+       help='compile .py to .pyc [default]',
+       action='callback', callback=add_flag)
+parser.add_option(
+       '--no-compile',
+       help="don't compile .py files",
+       action='callback', callback=add_flag)
+parser.add_option(
+       '-O', '--optimize',
+       help='optimize',
+       action='callback', callback=add_value, type=str)
+parser.add_option(
+       '-f', '--force',
+       help='force installation (overwrite any existing files)',
+       action='callback', callback=add_flag)
+
+parse_args = None
+dist_args = None
+dist_prefix = '/usr/local'
+
+for i in xrange(1, len(sys.argv)):
+       arg = sys.argv[i]
+       if arg.startswith('-'):
+               continue
+       if arg.startswith('install'):
+               dist_args = sys.argv[:i+1]
+               parse_args = sys.argv[i+1:]
+       break
+
+if parse_args:
+       parser.usage = '%s [options]' % ' '.join(dist_args)
+       parser.parse_args(args=parse_args)
+
+       sys.argv = dist_args
+
+binfiles = [
+       'bin/matrix',
+       'bin/matrix-graph',
+       'bin/matrix-upload',
+       'bin/matrixify',
+]
+
+scriptdir = 'share/matrix/scripts'
+
+distutils.core.setup(
        name='matrix',
        version='1.0-pre',
        license='GPL',
        packages=['matrix'],
-       scripts=[
-               'bin/matrix',
-               'bin/matrix-graph',
-               'bin/matrix-upload',
-               'bin/matrixify',
+       scripts=binfiles,
+       data_files=[
+               (scriptdir, glob('scripts/*.sh') + glob('scripts/*.mk')),
+               (join(scriptdir, 'styles'), glob('scripts/styles/*.mk')),
        ],
-       data_files=[('share/scripts', glob('scripts/*.mk') +
-                                     glob('scripts/*.sh'))],
 )
+
+python_version = 'python%d.%d' % tuple(sys.version_info[0:2])
+
+dist_moduledir = join(dist_prefix, 'lib', python_version, 'site-packages')
+dist_scriptdir = join(dist_prefix, scriptdir)
+
+dist_binfiles = [join(dist_prefix, file) for file in binfiles]
+
+try:
+       while dist_binfiles:
+               path = dist_binfiles[0]
+
+               file = open(path, 'rU')
+               lines = file.readlines()
+               file.close()
+
+               file = open(path, 'w')
+               for line in lines:
+                       line = line.replace('@MODULEDIR@', dist_moduledir)
+                       line = line.replace('@SCRIPTDIR@', dist_scriptdir)
+                       file.write(line)
+               file.close()
+
+               del dist_binfiles[0]
+finally:
+       for path in dist_binfiles:
+               try:
+                       os.unlink(path)
+               except:
+                       pass