/[thuban]/branches/WIP-pyshapelib-bramz/setup.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/setup.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 203 - (hide annotations)
Mon Jul 8 15:04:57 2002 UTC (22 years, 8 months ago) by bh
Original Path: trunk/thuban/setup.py
File MIME type: text/x-python
File size: 31508 byte(s)
	* setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
	handle the prefix properly which means that the default for the
	installation prefix should be /usr for RPMs and /usr/local when
	doing a normal source install.
	(bdist_rpm_install_script): Script to override the default install
	commands in the specfile generated by the bdist_rpm command.
	(thuban_bdist_rpm.user_options): Add a prefix option
	(thuban_bdist_rpm.initialize_options): Init the prefix option.
	Create the script files for the spec files as empty files here
	(thuban_bdist_rpm._make_spec_file): Override the inherited method
	to fill the script files with content.

1 bh 86 # Copyright (c) 2001, 2002 by Intevation GmbH
2 bh 6 # Authors:
3     # Bernhard Herzog <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     """Distutils setup script for Thuban."""
9    
10     __version__ = "$Revision$"
11    
12     # Configuration:
13     #
14     # depending on your platform you may have to configure some variables by
15     # hand below.
16     #
17    
18     import os
19 bh 15 from types import TupleType
20 bh 6 from distutils.core import setup, Extension, Command
21     from distutils.command.install import install
22     from distutils.command.build_py import build_py
23 bh 19 from distutils.command.bdist_rpm import bdist_rpm
24 bh 15 from distutils.file_util import write_file
25 bh 67 from distutils.filelist import FileList
26 bh 18 from distutils.util import convert_path, change_root
27 bh 6
28 bh 67 from distutils import archive_util, dir_util
29 bh 6 import distutils
30    
31     from string import split
32     import string
33    
34     if os.name == "posix":
35     ###################################################################
36     # Posix configuration. Adapt this if you're running some kind of
37     # Unix like system.
38    
39     # Directories where Proj4 is installed
40     proj4_prefix = "/usr/local/"
41     proj4_incdir = os.path.join(proj4_prefix, "include")
42     proj4_libdir = os.path.join(proj4_prefix, "lib")
43     proj4_lib = "proj"
44    
45    
46     # You shpuldn't have to modify anything below here
47     ###################################################################
48    
49     # The installation prefix (similar to autoconf's --prefix). This is
50     # only the default value, you can override it on the command line
51 bh 203 # with the install command's --prefix option.
52     #
53     # Note that there's a separate prefix option for the bdist_rpm
54     # command completely independend of this one.
55 bh 6 prefix = "/usr/local/"
56    
57     # On POSIX-systems we run wxgtk-config to determine the C++-compiler
58     # flags
59 bh 19 wx_config_script = "wx-config"
60 bh 6 # These lists will be filled automatically below
61     wx_defs = []
62     wx_incdirs = []
63     wx_libdirs = []
64     wx_libs = []
65    
66     elif os.name == "nt":
67     #################################################################
68     # Windows configuration.
69     #
70    
71     # Directories where Proj4 is installed
72     proj4_prefix = r"D:\cygwin\home\user\proj-4.4.3\src"
73     proj4_incdir = proj4_prefix
74     proj4_libdir = proj4_prefix
75     proj4_lib = "proj_i"
76    
77 bh 15 # Define include and lib directories for wxWindows and
78     wx_prefix = r"D:\wx230"
79     wx_inc = os.path.join(wx_prefix, "include")
80     wx_lib = os.path.join(wx_prefix, "lib")
81    
82 bh 6 #
83     # Unless you use a wxPython version other than 2.3.1, you probably
84     # shouldn't have to modify anything below here
85     ##################################################################
86    
87     # Installation prefix. Just install relative to current directory by
88     # default. This is only the default value, you can override it on
89     # the command line with the install command's --prefix option
90     prefix = r"install"
91    
92     # There doesn't seem to be an easy way to get at the wx compiler
93     # flags, so we define them here. These flags work for us with
94     # wxPython 2.3.1. They may have to be modified for other versions.
95    
96     # there's no config script.
97     wx_config_script = ""
98    
99     # the values of wx_defs and wx_libs. copied from the wxPython
100     # setup.py
101     wx_defs = [ ('WIN32', None), # Some of these are no longer
102     ('__WIN32__', None), # necessary. Anybody know which?
103     ('_WINDOWS', None),
104     ('__WINDOWS__', None),
105     ('WINVER', '0x0400'),
106     ('__WIN95__', None),
107     ('STRICT', None),
108    
109     ('__WXMSW__', None),
110     ('WXUSINGDLL', '1'),
111    
112     ('SWIG_GLOBAL', None),
113     ('HAVE_CONFIG_H', None),
114     ('WXP_USE_THREAD', '1'),
115     ]
116    
117     wx_incdirs = [wx_inc]
118     wx_libdirs = [wx_lib]
119     wx_libs = ["wx23_1h"]
120     wx_libs = wx_libs + ['kernel32', 'user32', 'gdi32', 'comdlg32',
121     'winspool', 'winmm', 'shell32', 'oldnames',
122     'comctl32', 'ctl3d32', 'odbc32', 'ole32', 'oleaut32',
123     'uuid', 'rpcrt4', 'advapi32', 'wsock32']
124     else:
125     raise RuntimeError("Unsupported platform " + os.name)
126    
127    
128     ######################################################################
129     #
130     # There's nothing beyond this point that has to be modified for a
131     # normal installation
132     #
133     ######################################################################
134    
135    
136     #
137     # Functions to determine wxWindows config on POSIX systems
138     #
139    
140     def run_script(cmdline):
141     """Run command and return its stdout or none in case of errors"""
142     pipe = os.popen(cmdline)
143     result = pipe.read()
144     if pipe.close() is not None:
145     print '"' + cmdline + '"', 'failed'
146     return None
147     return result
148    
149    
150     def run_wx_script(command):
151 bh 19 # first, determine the C++ preprocessor flags Use --cflags here
152     # because it seems that older version don't have --cxxflags and
153     # newer ones return the same result for both
154     flags = run_script(command + ' --cflags ')
155 bh 6 if flags is None:
156     return 0
157     for flag in split(flags):
158     start = flag[:2]
159     value = flag[2:]
160     if start == "-I":
161     wx_incdirs.append(value)
162     elif start == "-D":
163     wx_defs.append((value, None))
164    
165     # determine the library flags
166     flags = run_script(command + ' --libs')
167     if flags is None:
168     return 0
169     for flag in split(flags):
170     start = flag[:2]
171     value = flag[2:]
172     if start == "-L":
173     wx_libdirs.append(value)
174     elif start == "-l":
175     wx_libs.append(value)
176    
177     if wx_config_script:
178     # if there's a wx config script, run it to determine the configuration
179     run_wx_script(wx_config_script)
180    
181    
182    
183     #
184     # Define some extension and python modules
185     #
186     # The C-extension names are prefixed woth "Lib." so they get put into
187     # the Lib/ subdirectory. Lib/ is not really a package but distutils
188     # doesn't care
189    
190     # subdirectory containing the extensions
191     ext_dir = "extensions"
192    
193     # subdirectory with some shapelib files
194     shp_dir = ext_dir + "/shapelib"
195    
196     # lists to fill with the module descriptions
197     extensions = []
198     py_modules = []
199    
200    
201     #
202     # Thuban specific modules
203     #
204    
205     extensions.append(Extension("Lib.wxproj",
206 bh 97 [ext_dir + "/thuban/wxproj.cpp"],
207     include_dirs = ([shp_dir, proj4_incdir,
208     ext_dir + "/pyshapelib/"]
209     + wx_incdirs),
210 bh 6 define_macros = wx_defs,
211     library_dirs = [proj4_libdir] + wx_libdirs,
212     libraries = [proj4_lib] + wx_libs))
213    
214     #
215     # shapelib wrappers are also distributed with thuban
216     #
217    
218     extensions.append(Extension("Lib.shapelibc",
219     [ext_dir + "/pyshapelib/shapelib_wrap.c",
220 bh 142 shp_dir + "/shpopen.c",
221     shp_dir + "/shptree.c"],
222 bh 6 include_dirs = [shp_dir]))
223 bh 142 extensions.append(Extension("Lib.shptree",
224     [ext_dir + "/pyshapelib/shptreemodule.c"],
225     include_dirs = [shp_dir]))
226 bh 6 extensions.append(Extension("Lib.dbflibc",
227     [ext_dir + "/pyshapelib/dbflib_wrap.c",
228     shp_dir + "/dbfopen.c"],
229     include_dirs = [shp_dir]))
230 bh 164 for name in ("shapelib", "dbflib"):
231 bh 6 py_modules.append(ext_dir + "/pyshapelib/" + name)
232    
233     #
234     # PROJ4 bindings are also distributed with thuban
235     #
236     extensions.append(Extension("Lib.Projectionc",
237     [ext_dir + "/pyprojection/Projection_wrap.c"],
238     include_dirs = [proj4_incdir],
239     library_dirs = [proj4_libdir],
240     libraries = [proj4_lib]))
241     py_modules.append(ext_dir + "/pyprojection/Projection")
242    
243    
244     #
245     # Data files
246     #
247    
248     data_files = []
249    
250     # bitmaps
251 bh 15 dir = "Resources/Bitmaps"
252 bh 6 bitmaps = []
253     for file in os.listdir(os.path.join("Resources", "Bitmaps")):
254     if string.lower(file[-4:]) == ".xpm":
255 bh 15 bitmaps.append(dir + '/' + file)
256 bh 6 data_files.append((dir, bitmaps))
257    
258     #
259     # Command definitions
260     #
261     # So far distutils are only meant to distribute python extensions, not
262     # complete applications, so we have to redefine a few commands
263 bh 67 #
264 bh 6
265    
266 bh 67 # Much of the data_dist command is directly copied from the distutils'
267     # sdist command
268     class data_dist(Command):
269 bh 6
270 bh 67 description = "create a data distribution (tarball, zip file, etc.)"
271    
272     user_options = [
273     ('formats=', None,
274     "formats for source distribution (comma-separated list)"),
275     ('keep-temp', 'k',
276     "keep the distribution tree around after creating " +
277     "archive file(s)"),
278     ('dist-dir=', 'd',
279     "directory to put the source distribution archive(s) in "
280     "[default: dist]"),
281     ]
282    
283     boolean_options = ['keep-temp']
284    
285     def initialize_options (self):
286     self.formats = None
287     self.keep_temp = 0
288     self.dist_dir = None
289    
290     def finalize_options (self):
291     self.ensure_string_list('formats')
292     if self.formats is None:
293     self.formats = ["zip"]
294     bad_format = archive_util.check_archive_formats(self.formats)
295     if bad_format:
296     raise DistutilsOptionError, \
297     "unknown archive format '%s'" % bad_format
298    
299     if self.dist_dir is None:
300     self.dist_dir = "dist"
301    
302    
303     def run(self):
304     # 'filelist' contains the list of files that will make up the
305     # manifest
306     self.filelist = FileList()
307    
308     # Do whatever it takes to get the list of files to process.
309     # File list is accumulated in 'self.filelist'.
310     self.get_file_list()
311    
312     # Otherwise, go ahead and create the source distribution tarball,
313     # or zipfile, or whatever.
314     self.make_distribution()
315    
316     def get_file_list(self):
317     """Figure out the list of files to include in the data
318     distribution, and put it in 'self.filelist'.
319     """
320     self.filelist.findall("Data")
321     self.filelist.include_pattern("*", anchor = 0)
322     self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
323     self.filelist.sort()
324     self.filelist.remove_duplicates()
325    
326     def make_release_tree(self, base_dir, files):
327     """Create the directory tree that will become the source
328     distribution archive. All directories implied by the filenames in
329     'files' are created under 'base_dir', and then we hard link or copy
330     (if hard linking is unavailable) those files into place.
331     Essentially, this duplicates the developer's source tree, but in a
332     directory named after the distribution, containing only the files
333     to be distributed.
334     """
335     # Create all the directories under 'base_dir' necessary to
336     # put 'files' there; the 'mkpath()' is just so we don't die
337     # if the manifest happens to be empty.
338     self.mkpath(base_dir)
339     dir_util.create_tree(base_dir, files,
340     verbose=self.verbose, dry_run=self.dry_run)
341    
342     # And walk over the list of files, either making a hard link (if
343     # os.link exists) to each one that doesn't already exist in its
344     # corresponding location under 'base_dir', or copying each file
345     # that's out-of-date in 'base_dir'. (Usually, all files will be
346     # out-of-date, because by default we blow away 'base_dir' when
347     # we're done making the distribution archives.)
348    
349     if hasattr(os, 'link'): # can make hard links on this system
350     link = 'hard'
351     msg = "making hard links in %s..." % base_dir
352     else: # nope, have to copy
353     link = None
354     msg = "copying files to %s..." % base_dir
355    
356     if not files:
357     self.warn("no files to distribute -- empty manifest?")
358     else:
359     self.announce(msg)
360     for file in files:
361     if not os.path.isfile(file):
362     self.warn("'%s' not a regular file -- skipping" % file)
363     else:
364     dest = os.path.join(base_dir, file)
365     self.copy_file(file, dest, link=link)
366    
367    
368     def make_distribution (self):
369     """Create the source distribution(s). First, we create the release
370     tree with 'make_release_tree()'; then, we create all required
371     archive files (according to 'self.formats') from the release tree.
372     Finally, we clean up by blowing away the release tree (unless
373     'self.keep_temp' is true). The list of archive files created is
374     stored so it can be retrieved later by 'get_archive_files()'.
375     """
376     # Don't warn about missing meta-data here -- should be (and is!)
377     # done elsewhere.
378     base_dir = "Thuban-data-" + self.distribution.get_version()
379     base_name = os.path.join(self.dist_dir, base_dir)
380    
381     self.make_release_tree(base_dir, self.filelist.files)
382     archive_files = [] # remember names of files we create
383     for fmt in self.formats:
384     file = self.make_archive(base_name, fmt, base_dir=base_dir)
385     archive_files.append(file)
386    
387     self.archive_files = archive_files
388    
389     if not self.keep_temp:
390     dir_util.remove_tree(base_dir, self.verbose, self.dry_run)
391    
392    
393    
394 bh 6 class InstallLocal(Command):
395    
396     """
397     A new install command to just link (or copy, on non-POSIX systems)
398     the extension modules to the top directory so that Thuban can be run
399     directly from the source dir.
400     """
401    
402     description =\
403 bh 71 "Create some symlinks so you can run thuban from the source directory"
404 bh 6
405     user_options = [
406     ('skip-build', None, "skip the build steps"),
407     ]
408    
409     def initialize_options (self):
410     self.extensions = None
411     self.build_dir = None
412     self.skip_build = None
413    
414     def finalize_options (self):
415     self.set_undefined_options("install",
416     ("build_lib", "build_dir"),
417     ('skip_build', 'skip_build'))
418     self.extensions = self.distribution.ext_modules
419    
420     def run(self):
421     # Make sure we have built everything we need first
422     self.build()
423    
424     # now do the work. Simply link or copy the Lib dir
425     libdir = os.path.join(self.build_dir, "Lib")
426     if os.name == "posix":
427 bh 71 # on posix, just link the Lib dir
428 bh 6 self.link_dir(libdir, "Lib")
429     else:
430     self.copy_tree(libdir, "Lib")
431    
432     def link_dir(self, src, dest):
433     """Create a symbolic link dest pointing to src"""
434     if self.verbose:
435 bh 15 self.announce("symlinking %s -> %s" % (src, dest))
436 bh 6 if self.dry_run:
437     return
438    
439     if not (os.path.exists(dest) and os.path.samefile(src, dest)):
440     os.symlink(src, dest)
441    
442     def build (self):
443     if not self.skip_build:
444     if self.distribution.has_pure_modules():
445     self.run_command('build_py')
446     if self.distribution.has_ext_modules():
447     self.run_command('build_ext')
448    
449    
450    
451     class thuban_build_py(build_py):
452    
453     """
454 bh 8 A new build_py that can deal with both packages and modules in one
455     distribution.
456 bh 6 """
457    
458     def run(self):
459 bh 8 """The same the as the original in build_py revision 1.33 except
460 bh 6 that this allows both packages and modules to be in one
461     distribution
462     """
463     if not self.py_modules and not self.packages:
464     return
465    
466     # Now we're down to two cases: 'py_modules' only and 'packages' only.
467     if self.py_modules:
468     self.build_modules()
469     if self.packages:
470     self.build_packages()
471    
472     self.byte_compile(self.get_outputs(include_bytecode=0))
473    
474     def find_modules (self):
475     """Thuban specific version of build_py.find_modules. Unlike the
476     original version, we assume that the modules in self.py_modules
477     can contain directories and are all to be placed into the same
478     subdirectory, Lib, in the build directory. This is achieved by
479     returning the modules as a list (package, module, filename)
480     where package is 'Lib', module is the basename of the module name
481     and filename is the filename relative to the package root.
482     """
483     modules = []
484     for module in self.py_modules:
485     module_base = os.path.basename(module)
486     module_file = module + ".py"
487     if not self.check_module(module, module_file):
488     continue
489    
490     modules.append(("Lib", module_base, module_file))
491     return modules
492    
493 bh 15 def find_all_modules (self):
494     # same as find_all_modules of the original build_py command
495     # (rev. 1.33) but handle installations with both modules and
496     # packages. Needed here so tha the get_outputs works correctly
497     modules = []
498     if self.py_modules:
499     modules.extend(self.find_modules())
500     if self.packages:
501     for package in self.packages:
502     package_dir = self.get_package_dir(package)
503     m = self.find_package_modules(package, package_dir)
504     modules.extend(m)
505 bh 6
506 bh 15 return modules
507    
508    
509    
510 bh 6 class ThubanInstall(install):
511    
512 bh 8 """
513     Thuban specific install command.
514    
515     Extend the standard install command to symlink the installed script
516     to $prefix/bin/
517     """
518 bh 15
519     user_options = install.user_options[:]
520     user_options.extend([("do-symlink", None,
521     "Create a symlink to the script in <prefix>/bin."
522     "(default on posix systems and only relevant there)"),
523    
524     ("extra-files", None,
525     "List of filenames or (src, dest) pairs describing "
526     " extra files to install "
527     "(can only be set from witin setup.py"),
528     ])
529    
530     boolean_options = install.boolean_options[:]
531     boolean_options.append("do-symlink")
532    
533     def initialize_options(self):
534     self.do_symlink = None
535     self.extra_files = []
536     install.initialize_options(self)
537    
538     def finalize_options(self):
539     if self.do_symlink is None:
540     if os.name == "posix":
541     self.do_symlink = 1
542     else:
543     self.do_symlink = 0
544     install.finalize_options(self)
545    
546 bh 6 def run(self):
547     install.run(self)
548 bh 15 for item in self.extra_files:
549     if type(item) == TupleType:
550     src, dest = item
551     else:
552     src = dest = item
553     self.copy_file(convert_path(src),
554     os.path.join(self.root, convert_path(dest)))
555    
556     if os.name == "posix" and self.do_symlink:
557 bh 19 install_scripts = self.install_scripts
558     if self.root:
559     install_scripts = install_scripts[len(self.root):]
560     scriptfile = os.path.join(install_scripts, "thuban.py")
561 bh 6 bindir = os.path.join(self.prefix, "bin")
562 bh 18 if self.root:
563     bindir = change_root(self.root, bindir)
564 bh 6 binfile = os.path.join(bindir, "thuban")
565     self.mkpath(bindir)
566 bh 19 self.link_file(scriptfile, binfile)
567 bh 6
568 bh 19 def link_file(self, src, dest):
569     """Create a symbolic link dest pointing to src.
570    
571     Unlike the symlink variant of the command object's copy_file
572     method, this method even performs the link if src doesn't exist.
573     This is useful when installing with an alternat root directory"""
574     if self.verbose:
575     self.announce("symlinking %s -> %s" % (src, dest))
576     if self.dry_run:
577     return
578    
579     if not os.path.exists(dest):
580     os.symlink(src, dest)
581    
582    
583 bh 15 def get_outputs (self):
584     outputs = install.get_outputs(self)
585     for item in self.extra_files:
586     if type(item) == TupleType:
587     src, dest = item
588     else:
589     src = dest = item
590     outputs.append(os.path.join(self.root, convert_path(dest)))
591 bh 19 if os.name == "posix" and self.do_symlink:
592     bindir = os.path.join(self.prefix, "bin")
593     if self.root:
594     bindir = change_root(self.root, bindir)
595     binfile = os.path.join(bindir, "thuban")
596     outputs.append(binfile)
597 bh 15 return outputs
598 bh 6
599 bh 19
600 bh 203 # scripts to override some of the commands put into the spec-file by the
601     # bdist_rpm command.
602    
603 bh 19 bdist_rpm_prep_script = '''
604     %setup
605     cp extensions/pyshapelib/{README,README.pyshapelib}
606     cp extensions/pyshapelib/{COPYING,COPYING.pyshapelib}
607     cp extensions/pyprojection/{LICENSE,LICENSE.pyprojection}
608     '''
609    
610 bh 203 bdist_rpm_install_script = '''
611     %(python)s setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES \
612     --prefix=%(prefix)s
613     '''
614 bh 19
615    
616     class thuban_bdist_rpm(bdist_rpm):
617    
618     """Thuban specific RPM distribution command"""
619    
620 bh 203 user_options = bdist_rpm.user_options[:]
621     user_options.extend([("prefix=", None, "Install prefix for the RPM"),
622     ])
623    
624 bh 90 def initialize_options(self):
625 bh 203 # per default, RPMs are installed in /usr
626     self.prefix = "/usr/"
627 bh 19
628 bh 203 # create the scripts we want to override. We actually fill them
629     # with contents later because some values we put into those
630     # scripts such as the python interpreter to use are only known
631     # then.
632     open("bdist_rpm_prep", "w").close()
633     open("bdist_rpm_install", "w").close()
634 bh 90 bdist_rpm.initialize_options(self)
635 bh 19
636 bh 203 def _make_spec_file(self):
637     # create the scripts for the spec-file. Now we know the python
638     # interpreter to use.
639     open("bdist_rpm_prep", "w").write(bdist_rpm_prep_script)
640     install = bdist_rpm_install_script % {"python": self.python,
641     "prefix": self.prefix}
642     open("bdist_rpm_install", "w").write(install)
643 bh 19
644 bh 203 #
645     return bdist_rpm._make_spec_file(self)
646    
647    
648 bh 15 class bdist_inno(Command):
649    
650     """Command to create a windows installer with Inno Setup"""
651    
652     description = "Create a windows installer with Inno Setup"
653    
654     user_options = [
655     ('skip-build', None, "skip the build steps"),
656     ('bdist-dir=', None,
657     "temporary directory for creating the distribution"),
658     ('run-inno', None,
659     "Run inno-setup to create the installer. On by default on nt"),
660     ('iss-name', None,
661     "The name of the iss file to generate. "
662     "Shouldn't contain directories"),
663    
664     # Parameters for the Inno Setup script
665     ('copyright', None, "Copyright notice for the Inno Setup file"),
666     ('default-dir-name', None,
667     "Default installation directory. Defaults to '{pf}\\<name>'"),
668     ('default-group-name', None,
669     "Default program group name. Defaults to <name>'"),
670     ("license-file", None, "File containing the license."),
671     ("output-basename", None,
672     "Base filename for the Inno Setup output "
673     "(defaults to <name>-<version>-<issrevision>)."),
674     ("iss-revision", None,
675     "revision of the generated installer of the package version"),
676    
677     ("icons-entries", None,
678     "List if InnoIconItems "
679     "(this can only be set from inside the setup.py script)"),
680     ]
681    
682     boolean_options = ["do-symlink"]
683    
684     def initialize_options(self):
685     self.skip_build = 0
686     self.bdist_dir = None
687     self.run_inno = None
688     self.iss_name = None
689     self.copyright = ""
690     self.default_dir_name = None
691     self.default_group_name = None
692     self.license_file = None
693     self.output_basename = None
694     self.iss_revision = None
695     self.icons_entries = []
696    
697     def finalize_options(self):
698     self.set_undefined_options("install",
699     ('skip_build', 'skip_build'))
700     if self.bdist_dir is None:
701     bdist_base = self.get_finalized_command('bdist').bdist_base
702     self.bdist_dir = os.path.join(bdist_base, 'inno')
703    
704     if self.run_inno is None:
705     self.run_inno = os.name == "nt"
706    
707     name = self.distribution.get_name()
708     if self.iss_name is None:
709     self.iss_name = name + '.iss'
710    
711     if self.default_dir_name is None:
712     self.default_dir_name = "{pf}\\" + name
713     if self.default_group_name is None:
714     self.default_group_name = name
715    
716     if self.iss_revision is None:
717     self.iss_revision = 0
718     if self.output_basename is None:
719     self.output_basename = "%s-%s-%d" \
720     % (name, self.distribution.get_version(),
721     self.iss_revision)
722    
723     def run(self, install_options = None):
724     """Execute the command. install_options if given, should be a
725     directory of additional options to set in the install step"""
726     # Obviously have to build before we can install
727     if not self.skip_build:
728     self.run_command('build')
729    
730     # Install in a temporary directory
731     install = self.reinitialize_command('install')
732     install.root = self.bdist_dir
733     if install_options is not None:
734     for key, value in install_options.items():
735     setattr(install, key, value)
736     if os.name != 'nt':
737     # Must force install to use the 'nt' scheme;
738     install.select_scheme('nt')
739    
740     self.announce("installing to %s" % self.bdist_dir)
741     install.ensure_finalized()
742     install.run()
743    
744     # Create the iss file
745     iss_file = os.path.join(self.bdist_dir, self.iss_name)
746     self.execute(write_file, (iss_file, self.generate_iss()),
747     "Create Inno Setup script file %s" % iss_file)
748    
749     # and invoke
750     if self.run_inno:
751     self.spawn(["iscc", iss_file])
752    
753     def generate_iss(self):
754     """Return the contents of the iss file as list of strings, one
755     string per line"""
756    
757     # first, turn the icons entries into a more usable form
758     icons = {}
759     for item in self.icons_entries:
760     icons[item.filename] = item
761    
762     iss = []
763    
764     name = self.distribution.get_name()
765     iss.extend(["[Setup]",
766     "AppName=" + name,
767     "AppVerName=" + name + " "+self.distribution.get_version(),
768     "DefaultDirName=" + self.default_dir_name,
769     "DefaultGroupName=" + self.default_group_name,
770     ])
771     if self.copyright:
772     iss.append("AppCopyright=" + self.copyright)
773     if self.license_file:
774     iss.append("LicenseFile=" + self.license_file)
775    
776     iss.append("OutputBasefilename=" + self.output_basename)
777    
778     iss.append("")
779     iss.append("[Files]")
780    
781     install = self.get_finalized_command("install")
782     install_scripts = self.get_finalized_command("install_scripts")
783     script_files = install_scripts.get_outputs()
784     prefixlen = len(self.bdist_dir) + len(os.sep)
785     for filename in install.get_outputs():
786     filename = filename[prefixlen:]
787     icon = icons.get(filename)
788     dirname = os.path.dirname(filename)
789     if os.name != "nt":
790     # change the separators to \ on non-windos systems
791     filename = string.join(string.split(filename, os.sep), "\\")
792     dirname = string.join(string.split(dirname, os.sep), "\\")
793     line = 'Source: "%s"' % filename
794     if icon is not None:
795     # install it as defined in the icon object
796     backslash = string.rfind(icon.install_name, "\\")
797     if backslash >= 0:
798     dirname = icon.install_name[:backslash]
799     basename = icon.install_name[backslash + 1:]
800     else:
801     dirname = ""
802     basename = icon.install_name
803     line = '%s; DestDir: "%s"; DestName: "%s"' % (line, dirname,
804     basename)
805     else:
806     line = line + '; DestDir: "{app}\\%s"' % (dirname)
807     iss.append(line)
808    
809     iss.append("")
810     iss.append("[Icons]")
811     for icon in self.icons_entries:
812     line = 'Name: "{group}\\%s"; Filename: "%s";' \
813     % (icon.title, icon.install_name)
814     iss.append(line)
815    
816     return iss
817    
818    
819     class InnoIconItem:
820    
821 bh 54 """Describe one item for the start menu for the Inno Setup installer"""
822 bh 15
823     def __init__(self, filename, title, install_name = None):
824     self.filename = filename
825     self.title = title
826     if install_name is not None:
827     self.install_name = install_name
828     else:
829     self.install_name = filename
830    
831 bh 54
832 bh 15 class thuban_bdist_inno(bdist_inno):
833    
834     """Thuban specific Inno Setup stuff"""
835    
836     def run(self):
837     install_options = {
838     "prefix": ".",
839     "install_scripts": "$base",
840     "warn_dir": 0,
841     "extra_files": ["COPYING", "Lib/proj.dll"],
842     }
843 bh 54 # don't make a symlink because we're simulating windows, so
844     # that we can generate the iss-file even on Linux
845     install_options["do_symlink"] = 0
846 bh 15 bdist_inno.run(self, install_options)
847    
848    
849     #
850     # Run the script
851     #
852    
853    
854 bh 6 long_description = """\
855     Thuban is a viewer for geographic data written in Python
856     """
857    
858 bh 15 setup(name = "Thuban",
859 bh 160 version = "0.1.2",
860 bh 6 description = "Geographic data viewer",
861     long_description = long_description,
862     licence = "GPL",
863     author = "Intevation GmbH",
864     author_email = "[email protected]",
865     url = "ftp:intevation.de/",
866    
867     scripts = ["thuban.py"],
868     packages = ["Thuban", "Thuban.Lib", "Thuban.Model", "Thuban.UI"],
869     ext_modules = extensions,
870     py_modules = py_modules,
871     data_files = data_files,
872    
873     # defaults for the install command
874     options = {"install":
875     # prefix defaults to python's prefix normally
876     {"prefix": prefix,
877     # make sure both libs and scripts are installed in the
878     # same directory.
879 bh 200 "install_lib": "$base/lib/thuban",
880     "install_scripts": "$base/lib/thuban",
881     "install_data": "$base/lib/thuban",
882 bh 6
883     # Don't print warning messages about the lib dir not
884     # being on Python's path. The libraries are Thuban
885     # specific and are installed just for Thuban. They'll
886     # be automatically on Python's path when Thuban is run
887     "warn_dir": 0,
888 bh 15 },
889     "bdist_inno":
890     {"icons_entries": [InnoIconItem(".\\thuban.py",
891     "Start Thuban",
892     "{app}\\thuban.pyw")],
893     "license_file": "COPYING",
894     }
895     },
896 bh 6 cmdclass = {"build_py": thuban_build_py,
897     "install_local": InstallLocal,
898 bh 15 "install": ThubanInstall,
899 bh 19 "bdist_rpm": thuban_bdist_rpm,
900 bh 67 "bdist_inno": thuban_bdist_inno,
901     "data_dist": data_dist
902 bh 15 })
903 bh 6
904 bh 15

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26