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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 18 by bh, Mon Sep 3 16:25:09 2001 UTC revision 164 by bh, Fri May 10 09:34:40 2002 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001 by Intevation GmbH  # Copyright (c) 2001, 2002 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 20  from types import TupleType Line 20  from types import TupleType
20  from distutils.core import setup, Extension, Command  from distutils.core import setup, Extension, Command
21  from distutils.command.install import install  from distutils.command.install import install
22  from distutils.command.build_py import build_py  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  from distutils.file_util import write_file
25    from distutils.filelist import FileList
26  from distutils.util import convert_path, change_root  from distutils.util import convert_path, change_root
27    
28    from distutils import archive_util, dir_util
29  import distutils  import distutils
30    
31  from string import split  from string import split
# Line 50  if os.name == "posix": Line 53  if os.name == "posix":
53    
54      # On POSIX-systems we run wxgtk-config to determine the C++-compiler      # On POSIX-systems we run wxgtk-config to determine the C++-compiler
55      # flags      # flags
56      wx_config_script = "wxgtk-config"      wx_config_script = "wx-config"
57      # These lists will be filled automatically below      # These lists will be filled automatically below
58      wx_defs = []      wx_defs = []
59      wx_incdirs = []      wx_incdirs = []
# Line 142  def run_script(cmdline): Line 145  def run_script(cmdline):
145    
146    
147  def run_wx_script(command):  def run_wx_script(command):
148      # first, determine the C++ preprocessor flags      # first, determine the C++ preprocessor flags Use --cflags here
149      flags = run_script(command + ' --cxxflags ')      # because it seems that older version don't have --cxxflags and
150        # newer ones return the same result for both
151        flags = run_script(command + ' --cflags ')
152      if flags is None:      if flags is None:
153          return 0          return 0
154      for flag in split(flags):      for flag in split(flags):
# Line 195  py_modules = [] Line 200  py_modules = []
200  #  #
201    
202  extensions.append(Extension("Lib.wxproj",  extensions.append(Extension("Lib.wxproj",
203                              [ext_dir + "/thuban/wxproj.cpp",                              [ext_dir + "/thuban/wxproj.cpp"],
204                               shp_dir + "/shpopen.c"],                              include_dirs = ([shp_dir, proj4_incdir,
205                              include_dirs = [shp_dir, proj4_incdir] +wx_incdirs,                                               ext_dir + "/pyshapelib/"]
206                                                + wx_incdirs),
207                              define_macros = wx_defs,                              define_macros = wx_defs,
208                              library_dirs = [proj4_libdir] + wx_libdirs,                              library_dirs = [proj4_libdir] + wx_libdirs,
209                              libraries = [proj4_lib] + wx_libs))                              libraries = [proj4_lib] + wx_libs))
# Line 208  extensions.append(Extension("Lib.wxproj" Line 214  extensions.append(Extension("Lib.wxproj"
214    
215  extensions.append(Extension("Lib.shapelibc",  extensions.append(Extension("Lib.shapelibc",
216                              [ext_dir + "/pyshapelib/shapelib_wrap.c",                              [ext_dir + "/pyshapelib/shapelib_wrap.c",
217                               shp_dir + "/shpopen.c"],                               shp_dir + "/shpopen.c",
218                                 shp_dir + "/shptree.c"],
219                                include_dirs = [shp_dir]))
220    extensions.append(Extension("Lib.shptree",
221                                [ext_dir + "/pyshapelib/shptreemodule.c"],
222                              include_dirs = [shp_dir]))                              include_dirs = [shp_dir]))
223  extensions.append(Extension("Lib.dbflibc",  extensions.append(Extension("Lib.dbflibc",
224                              [ext_dir + "/pyshapelib/dbflib_wrap.c",                              [ext_dir + "/pyshapelib/dbflib_wrap.c",
# Line 247  data_files.append((dir, bitmaps)) Line 257  data_files.append((dir, bitmaps))
257  #  #
258  # So far distutils are only meant to distribute python extensions, not  # So far distutils are only meant to distribute python extensions, not
259  # complete applications, so we have to redefine a few commands  # complete applications, so we have to redefine a few commands
260    #
261    
262    
263    # Much of the data_dist command is directly copied from the distutils'
264    # sdist command
265    class data_dist(Command):
266    
267        description = "create a data distribution (tarball, zip file, etc.)"
268    
269        user_options = [
270            ('formats=', None,
271             "formats for source distribution (comma-separated list)"),
272            ('keep-temp', 'k',
273             "keep the distribution tree around after creating " +
274             "archive file(s)"),
275            ('dist-dir=', 'd',
276             "directory to put the source distribution archive(s) in "
277             "[default: dist]"),
278            ]
279    
280        boolean_options = ['keep-temp']
281    
282        def initialize_options (self):
283            self.formats = None
284            self.keep_temp = 0
285            self.dist_dir = None
286    
287        def finalize_options (self):
288            self.ensure_string_list('formats')
289            if self.formats is None:
290                self.formats = ["zip"]
291            bad_format = archive_util.check_archive_formats(self.formats)
292            if bad_format:
293                raise DistutilsOptionError, \
294                      "unknown archive format '%s'" % bad_format
295    
296            if self.dist_dir is None:
297                self.dist_dir = "dist"
298    
299    
300        def run(self):
301            # 'filelist' contains the list of files that will make up the
302            # manifest
303            self.filelist = FileList()
304            
305            # Do whatever it takes to get the list of files to process.
306            # File list is accumulated in 'self.filelist'.
307            self.get_file_list()
308    
309            # Otherwise, go ahead and create the source distribution tarball,
310            # or zipfile, or whatever.
311            self.make_distribution()
312    
313        def get_file_list(self):
314            """Figure out the list of files to include in the data
315            distribution, and put it in 'self.filelist'.
316            """
317            self.filelist.findall("Data")
318            self.filelist.include_pattern("*", anchor = 0)
319            self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
320            self.filelist.sort()
321            self.filelist.remove_duplicates()
322    
323        def make_release_tree(self, base_dir, files):
324            """Create the directory tree that will become the source
325            distribution archive.  All directories implied by the filenames in
326            'files' are created under 'base_dir', and then we hard link or copy
327            (if hard linking is unavailable) those files into place.
328            Essentially, this duplicates the developer's source tree, but in a
329            directory named after the distribution, containing only the files
330            to be distributed.
331            """
332            # Create all the directories under 'base_dir' necessary to
333            # put 'files' there; the 'mkpath()' is just so we don't die
334            # if the manifest happens to be empty.
335            self.mkpath(base_dir)
336            dir_util.create_tree(base_dir, files,
337                                 verbose=self.verbose, dry_run=self.dry_run)
338    
339            # And walk over the list of files, either making a hard link (if
340            # os.link exists) to each one that doesn't already exist in its
341            # corresponding location under 'base_dir', or copying each file
342            # that's out-of-date in 'base_dir'.  (Usually, all files will be
343            # out-of-date, because by default we blow away 'base_dir' when
344            # we're done making the distribution archives.)
345        
346            if hasattr(os, 'link'):        # can make hard links on this system
347                link = 'hard'
348                msg = "making hard links in %s..." % base_dir
349            else:                           # nope, have to copy
350                link = None
351                msg = "copying files to %s..." % base_dir
352    
353            if not files:
354                self.warn("no files to distribute -- empty manifest?")
355            else:
356                self.announce(msg)
357            for file in files:
358                if not os.path.isfile(file):
359                    self.warn("'%s' not a regular file -- skipping" % file)
360                else:
361                    dest = os.path.join(base_dir, file)
362                    self.copy_file(file, dest, link=link)
363    
364    
365        def make_distribution (self):
366            """Create the source distribution(s).  First, we create the release
367            tree with 'make_release_tree()'; then, we create all required
368            archive files (according to 'self.formats') from the release tree.
369            Finally, we clean up by blowing away the release tree (unless
370            'self.keep_temp' is true).  The list of archive files created is
371            stored so it can be retrieved later by 'get_archive_files()'.
372            """
373            # Don't warn about missing meta-data here -- should be (and is!)
374            # done elsewhere.
375            base_dir = "Thuban-data-" + self.distribution.get_version()
376            base_name = os.path.join(self.dist_dir, base_dir)
377    
378            self.make_release_tree(base_dir, self.filelist.files)
379            archive_files = []              # remember names of files we create
380            for fmt in self.formats:
381                file = self.make_archive(base_name, fmt, base_dir=base_dir)
382                archive_files.append(file)
383    
384            self.archive_files = archive_files
385    
386            if not self.keep_temp:
387                dir_util.remove_tree(base_dir, self.verbose, self.dry_run)
388    
389    
390    
# Line 259  class InstallLocal(Command): Line 397  class InstallLocal(Command):
397      """      """
398    
399      description =\      description =\
400          "Create some symlink so you can run thubanfrom the source directory"          "Create some symlinks so you can run thuban from the source directory"
401    
402      user_options = [      user_options = [
403          ('skip-build', None, "skip the build steps"),          ('skip-build', None, "skip the build steps"),
# Line 283  class InstallLocal(Command): Line 421  class InstallLocal(Command):
421          # now do the work. Simply link or copy the Lib dir          # now do the work. Simply link or copy the Lib dir
422          libdir = os.path.join(self.build_dir, "Lib")          libdir = os.path.join(self.build_dir, "Lib")
423          if os.name == "posix":          if os.name == "posix":
424              # on posix, just lilnk the Lib dir              # on posix, just link the Lib dir
425              self.link_dir(libdir, "Lib")              self.link_dir(libdir, "Lib")
426          else:          else:
427              self.copy_tree(libdir, "Lib")              self.copy_tree(libdir, "Lib")
# Line 413  class ThubanInstall(install): Line 551  class ThubanInstall(install):
551                             os.path.join(self.root, convert_path(dest)))                             os.path.join(self.root, convert_path(dest)))
552    
553          if os.name == "posix" and self.do_symlink:          if os.name == "posix" and self.do_symlink:
554              scriptfile = os.path.join(self.install_scripts, "thuban.py")              install_scripts = self.install_scripts
555                if self.root:
556                    install_scripts = install_scripts[len(self.root):]
557                scriptfile = os.path.join(install_scripts, "thuban.py")
558              bindir = os.path.join(self.prefix, "bin")              bindir = os.path.join(self.prefix, "bin")
559              if self.root:              if self.root:
560                  bindir = change_root(self.root, bindir)                  bindir = change_root(self.root, bindir)
561              binfile = os.path.join(bindir, "thuban")              binfile = os.path.join(bindir, "thuban")
562              self.mkpath(bindir)              self.mkpath(bindir)
563              self.copy_file(scriptfile, binfile, link="sym")              self.link_file(scriptfile, binfile)
564    
565        def link_file(self, src, dest):
566            """Create a symbolic link dest pointing to src.
567    
568            Unlike the symlink variant of the command object's copy_file
569            method, this method even performs the link if src doesn't exist.
570            This is useful when installing with an alternat root directory"""
571            if self.verbose:
572                self.announce("symlinking %s -> %s" % (src, dest))
573            if self.dry_run:
574                return
575    
576            if not os.path.exists(dest):
577                os.symlink(src, dest)
578    
579    
580      def get_outputs (self):      def get_outputs (self):
581          outputs = install.get_outputs(self)          outputs = install.get_outputs(self)
# Line 429  class ThubanInstall(install): Line 585  class ThubanInstall(install):
585              else:              else:
586                  src = dest = item                  src = dest = item
587              outputs.append(os.path.join(self.root, convert_path(dest)))              outputs.append(os.path.join(self.root, convert_path(dest)))
588            if os.name == "posix" and self.do_symlink:
589                bindir = os.path.join(self.prefix, "bin")
590                if self.root:
591                    bindir = change_root(self.root, bindir)
592                binfile = os.path.join(bindir, "thuban")
593                outputs.append(binfile)
594          return outputs          return outputs
595    
596    
597    bdist_rpm_prep_script = '''
598    %setup
599    cp extensions/pyshapelib/{README,README.pyshapelib}
600    cp extensions/pyshapelib/{COPYING,COPYING.pyshapelib}
601    cp extensions/pyprojection/{LICENSE,LICENSE.pyprojection}
602    '''
603    
604    
605        
606    class thuban_bdist_rpm(bdist_rpm):
607    
608        """Thuban specific RPM distribution command"""
609    
610        def initialize_options(self):
611            # create the prep script for the spec-file
612            open("bdist_rpm_prep", "w").write(bdist_rpm_prep_script)
613    
614            bdist_rpm.initialize_options(self)
615    
616    
617  class bdist_inno(Command):  class bdist_inno(Command):
618    
619      """Command to create a windows installer with Inno Setup"""      """Command to create a windows installer with Inno Setup"""
# Line 522  class bdist_inno(Command): Line 705  class bdist_inno(Command):
705          if os.name != 'nt':          if os.name != 'nt':
706              # Must force install to use the 'nt' scheme;              # Must force install to use the 'nt' scheme;
707              install.select_scheme('nt')              install.select_scheme('nt')
             # don't make a symlink because we're simulating windows, so  
             # that we can generate the iss-file even on Linux  
             install.do_symlink = 0  
708    
709          self.announce("installing to %s" % self.bdist_dir)          self.announce("installing to %s" % self.bdist_dir)
710          install.ensure_finalized()          install.ensure_finalized()
# Line 607  class bdist_inno(Command): Line 787  class bdist_inno(Command):
787    
788  class InnoIconItem:  class InnoIconItem:
789    
790      """Describe one item for he start menu for the Inno Setup installer"""      """Describe one item for the start menu for the Inno Setup installer"""
791    
792      def __init__(self, filename, title, install_name = None):      def __init__(self, filename, title, install_name = None):
793          self.filename = filename          self.filename = filename
# Line 617  class InnoIconItem: Line 797  class InnoIconItem:
797          else:          else:
798              self.install_name = filename              self.install_name = filename
799    
800                
801  class thuban_bdist_inno(bdist_inno):  class thuban_bdist_inno(bdist_inno):
802    
803      """Thuban specific Inno Setup stuff"""      """Thuban specific Inno Setup stuff"""
# Line 629  class thuban_bdist_inno(bdist_inno): Line 809  class thuban_bdist_inno(bdist_inno):
809              "warn_dir": 0,              "warn_dir": 0,
810              "extra_files": ["COPYING", "Lib/proj.dll"],              "extra_files": ["COPYING", "Lib/proj.dll"],
811              }              }
812            # don't make a symlink because we're simulating windows, so
813            # that we can generate the iss-file even on Linux
814            install_options["do_symlink"] = 0
815          bdist_inno.run(self, install_options)          bdist_inno.run(self, install_options)
816            
817                            
# Line 642  Thuban is a viewer for geographic data w Line 825  Thuban is a viewer for geographic data w
825  """  """
826    
827  setup(name = "Thuban",  setup(name = "Thuban",
828        version = "0.0.3",        version = "0.1.2",
829        description = "Geographic data viewer",        description = "Geographic data viewer",
830        long_description = long_description,        long_description = long_description,
831        licence = "GPL",        licence = "GPL",
# Line 682  setup(name = "Thuban", Line 865  setup(name = "Thuban",
865        cmdclass = {"build_py": thuban_build_py,        cmdclass = {"build_py": thuban_build_py,
866                    "install_local": InstallLocal,                    "install_local": InstallLocal,
867                    "install": ThubanInstall,                    "install": ThubanInstall,
868                    "bdist_inno": thuban_bdist_inno                    "bdist_rpm": thuban_bdist_rpm,
869                      "bdist_inno": thuban_bdist_inno,
870                      "data_dist": data_dist
871                    })                    })
872    
873    

Legend:
Removed from v.18  
changed lines
  Added in v.164

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26