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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 203 - (show 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 # Copyright (c) 2001, 2002 by Intevation GmbH
2 # 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 from types import TupleType
20 from distutils.core import setup, Extension, Command
21 from distutils.command.install import install
22 from distutils.command.build_py import build_py
23 from distutils.command.bdist_rpm import bdist_rpm
24 from distutils.file_util import write_file
25 from distutils.filelist import FileList
26 from distutils.util import convert_path, change_root
27
28 from distutils import archive_util, dir_util
29 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 # 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 prefix = "/usr/local/"
56
57 # On POSIX-systems we run wxgtk-config to determine the C++-compiler
58 # flags
59 wx_config_script = "wx-config"
60 # 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 # 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 #
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 # 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 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 [ext_dir + "/thuban/wxproj.cpp"],
207 include_dirs = ([shp_dir, proj4_incdir,
208 ext_dir + "/pyshapelib/"]
209 + wx_incdirs),
210 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 shp_dir + "/shpopen.c",
221 shp_dir + "/shptree.c"],
222 include_dirs = [shp_dir]))
223 extensions.append(Extension("Lib.shptree",
224 [ext_dir + "/pyshapelib/shptreemodule.c"],
225 include_dirs = [shp_dir]))
226 extensions.append(Extension("Lib.dbflibc",
227 [ext_dir + "/pyshapelib/dbflib_wrap.c",
228 shp_dir + "/dbfopen.c"],
229 include_dirs = [shp_dir]))
230 for name in ("shapelib", "dbflib"):
231 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 dir = "Resources/Bitmaps"
252 bitmaps = []
253 for file in os.listdir(os.path.join("Resources", "Bitmaps")):
254 if string.lower(file[-4:]) == ".xpm":
255 bitmaps.append(dir + '/' + file)
256 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 #
264
265
266 # Much of the data_dist command is directly copied from the distutils'
267 # sdist command
268 class data_dist(Command):
269
270 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 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 "Create some symlinks so you can run thuban from the source directory"
404
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 # on posix, just link the Lib dir
428 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 self.announce("symlinking %s -> %s" % (src, dest))
436 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 A new build_py that can deal with both packages and modules in one
455 distribution.
456 """
457
458 def run(self):
459 """The same the as the original in build_py revision 1.33 except
460 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 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
506 return modules
507
508
509
510 class ThubanInstall(install):
511
512 """
513 Thuban specific install command.
514
515 Extend the standard install command to symlink the installed script
516 to $prefix/bin/
517 """
518
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 def run(self):
547 install.run(self)
548 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 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 bindir = os.path.join(self.prefix, "bin")
562 if self.root:
563 bindir = change_root(self.root, bindir)
564 binfile = os.path.join(bindir, "thuban")
565 self.mkpath(bindir)
566 self.link_file(scriptfile, binfile)
567
568 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 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 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 return outputs
598
599
600 # scripts to override some of the commands put into the spec-file by the
601 # bdist_rpm command.
602
603 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 bdist_rpm_install_script = '''
611 %(python)s setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES \
612 --prefix=%(prefix)s
613 '''
614
615
616 class thuban_bdist_rpm(bdist_rpm):
617
618 """Thuban specific RPM distribution command"""
619
620 user_options = bdist_rpm.user_options[:]
621 user_options.extend([("prefix=", None, "Install prefix for the RPM"),
622 ])
623
624 def initialize_options(self):
625 # per default, RPMs are installed in /usr
626 self.prefix = "/usr/"
627
628 # 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 bdist_rpm.initialize_options(self)
635
636 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
644 #
645 return bdist_rpm._make_spec_file(self)
646
647
648 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 """Describe one item for the start menu for the Inno Setup installer"""
822
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
832 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 # 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 bdist_inno.run(self, install_options)
847
848
849 #
850 # Run the script
851 #
852
853
854 long_description = """\
855 Thuban is a viewer for geographic data written in Python
856 """
857
858 setup(name = "Thuban",
859 version = "0.1.2",
860 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 "install_lib": "$base/lib/thuban",
880 "install_scripts": "$base/lib/thuban",
881 "install_data": "$base/lib/thuban",
882
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 },
889 "bdist_inno":
890 {"icons_entries": [InnoIconItem(".\\thuban.py",
891 "Start Thuban",
892 "{app}\\thuban.pyw")],
893 "license_file": "COPYING",
894 }
895 },
896 cmdclass = {"build_py": thuban_build_py,
897 "install_local": InstallLocal,
898 "install": ThubanInstall,
899 "bdist_rpm": thuban_bdist_rpm,
900 "bdist_inno": thuban_bdist_inno,
901 "data_dist": data_dist
902 })
903
904

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26