/[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 15 by bh, Fri Aug 31 15:35:18 2001 UTC revision 203 by bh, Mon Jul 8 15:04:57 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.util import convert_path  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  import distutils
30    
31  from string import split  from string import split
# Line 45  if os.name == "posix": Line 48  if os.name == "posix":
48            
49      # The installation prefix (similar to autoconf's --prefix). This is      # The installation prefix (similar to autoconf's --prefix). This is
50      # only the default value, you can override it on the command line      # only the default value, you can override it on the command line
51      # with the install command's --prefix option      # 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/"      prefix = "/usr/local/"
56    
57      # On POSIX-systems we run wxgtk-config to determine the C++-compiler      # On POSIX-systems we run wxgtk-config to determine the C++-compiler
58      # flags      # flags
59      wx_config_script = "wxgtk-config"      wx_config_script = "wx-config"
60      # These lists will be filled automatically below      # These lists will be filled automatically below
61      wx_defs = []      wx_defs = []
62      wx_incdirs = []      wx_incdirs = []
# Line 142  def run_script(cmdline): Line 148  def run_script(cmdline):
148    
149    
150  def run_wx_script(command):  def run_wx_script(command):
151      # first, determine the C++ preprocessor flags      # first, determine the C++ preprocessor flags Use --cflags here
152      flags = run_script(command + ' --cxxflags ')      # 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:      if flags is None:
156          return 0          return 0
157      for flag in split(flags):      for flag in split(flags):
# Line 195  py_modules = [] Line 203  py_modules = []
203  #  #
204    
205  extensions.append(Extension("Lib.wxproj",  extensions.append(Extension("Lib.wxproj",
206                              [ext_dir + "/thuban/wxproj.cpp",                              [ext_dir + "/thuban/wxproj.cpp"],
207                               shp_dir + "/shpopen.c"],                              include_dirs = ([shp_dir, proj4_incdir,
208                              include_dirs = [shp_dir, proj4_incdir] +wx_incdirs,                                               ext_dir + "/pyshapelib/"]
209                                                + wx_incdirs),
210                              define_macros = wx_defs,                              define_macros = wx_defs,
211                              library_dirs = [proj4_libdir] + wx_libdirs,                              library_dirs = [proj4_libdir] + wx_libdirs,
212                              libraries = [proj4_lib] + wx_libs))                              libraries = [proj4_lib] + wx_libs))
# Line 208  extensions.append(Extension("Lib.wxproj" Line 217  extensions.append(Extension("Lib.wxproj"
217    
218  extensions.append(Extension("Lib.shapelibc",  extensions.append(Extension("Lib.shapelibc",
219                              [ext_dir + "/pyshapelib/shapelib_wrap.c",                              [ext_dir + "/pyshapelib/shapelib_wrap.c",
220                               shp_dir + "/shpopen.c"],                               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]))                              include_dirs = [shp_dir]))
226  extensions.append(Extension("Lib.dbflibc",  extensions.append(Extension("Lib.dbflibc",
227                              [ext_dir + "/pyshapelib/dbflib_wrap.c",                              [ext_dir + "/pyshapelib/dbflib_wrap.c",
# Line 247  data_files.append((dir, bitmaps)) Line 260  data_files.append((dir, bitmaps))
260  #  #
261  # So far distutils are only meant to distribute python extensions, not  # So far distutils are only meant to distribute python extensions, not
262  # complete applications, so we have to redefine a few commands  # 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    
# Line 259  class InstallLocal(Command): Line 400  class InstallLocal(Command):
400      """      """
401    
402      description =\      description =\
403          "Create some symlink so you can run thubanfrom the source directory"          "Create some symlinks so you can run thuban from the source directory"
404    
405      user_options = [      user_options = [
406          ('skip-build', None, "skip the build steps"),          ('skip-build', None, "skip the build steps"),
# Line 283  class InstallLocal(Command): Line 424  class InstallLocal(Command):
424          # now do the work. Simply link or copy the Lib dir          # now do the work. Simply link or copy the Lib dir
425          libdir = os.path.join(self.build_dir, "Lib")          libdir = os.path.join(self.build_dir, "Lib")
426          if os.name == "posix":          if os.name == "posix":
427              # on posix, just lilnk the Lib dir              # on posix, just link the Lib dir
428              self.link_dir(libdir, "Lib")              self.link_dir(libdir, "Lib")
429          else:          else:
430              self.copy_tree(libdir, "Lib")              self.copy_tree(libdir, "Lib")
# Line 413  class ThubanInstall(install): Line 554  class ThubanInstall(install):
554                             os.path.join(self.root, convert_path(dest)))                             os.path.join(self.root, convert_path(dest)))
555    
556          if os.name == "posix" and self.do_symlink:          if os.name == "posix" and self.do_symlink:
557              scriptfile = os.path.join(self.install_scripts, "thuban.py")              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")              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")              binfile = os.path.join(bindir, "thuban")
565              self.mkpath(bindir)              self.mkpath(bindir)
566              self.copy_file(scriptfile, binfile, link="sym")              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):      def get_outputs (self):
584          outputs = install.get_outputs(self)          outputs = install.get_outputs(self)
# Line 427  class ThubanInstall(install): Line 588  class ThubanInstall(install):
588              else:              else:
589                  src = dest = item                  src = dest = item
590              outputs.append(os.path.join(self.root, convert_path(dest)))              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          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):  class bdist_inno(Command):
649    
650      """Command to create a windows installer with Inno Setup"""      """Command to create a windows installer with Inno Setup"""
# Line 520  class bdist_inno(Command): Line 736  class bdist_inno(Command):
736          if os.name != 'nt':          if os.name != 'nt':
737              # Must force install to use the 'nt' scheme;              # Must force install to use the 'nt' scheme;
738              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  
739    
740          self.announce("installing to %s" % self.bdist_dir)          self.announce("installing to %s" % self.bdist_dir)
741          install.ensure_finalized()          install.ensure_finalized()
# Line 605  class bdist_inno(Command): Line 818  class bdist_inno(Command):
818    
819  class InnoIconItem:  class InnoIconItem:
820    
821      """Describe one item for he start menu for the Inno Setup installer"""      """Describe one item for the start menu for the Inno Setup installer"""
822    
823      def __init__(self, filename, title, install_name = None):      def __init__(self, filename, title, install_name = None):
824          self.filename = filename          self.filename = filename
# Line 615  class InnoIconItem: Line 828  class InnoIconItem:
828          else:          else:
829              self.install_name = filename              self.install_name = filename
830    
831                
832  class thuban_bdist_inno(bdist_inno):  class thuban_bdist_inno(bdist_inno):
833    
834      """Thuban specific Inno Setup stuff"""      """Thuban specific Inno Setup stuff"""
# Line 627  class thuban_bdist_inno(bdist_inno): Line 840  class thuban_bdist_inno(bdist_inno):
840              "warn_dir": 0,              "warn_dir": 0,
841              "extra_files": ["COPYING", "Lib/proj.dll"],              "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)          bdist_inno.run(self, install_options)
847            
848                            
# Line 640  Thuban is a viewer for geographic data w Line 856  Thuban is a viewer for geographic data w
856  """  """
857    
858  setup(name = "Thuban",  setup(name = "Thuban",
859        version = "0.0.3",        version = "0.1.2",
860        description = "Geographic data viewer",        description = "Geographic data viewer",
861        long_description = long_description,        long_description = long_description,
862        licence = "GPL",        licence = "GPL",
# Line 660  setup(name = "Thuban", Line 876  setup(name = "Thuban",
876                   {"prefix": prefix,                   {"prefix": prefix,
877                    # make sure both libs and scripts are installed in the                    # make sure both libs and scripts are installed in the
878                    # same directory.                    # same directory.
879                    "install_lib": "$base/thuban",                    "install_lib": "$base/lib/thuban",
880                    "install_scripts": "$base/thuban",                    "install_scripts": "$base/lib/thuban",
881                    "install_data": "$base/thuban",                    "install_data": "$base/lib/thuban",
882    
883                    # Don't print warning messages about the lib dir not                    # Don't print warning messages about the lib dir not
884                    # being on Python's path. The libraries are Thuban                    # being on Python's path. The libraries are Thuban
# Line 680  setup(name = "Thuban", Line 896  setup(name = "Thuban",
896        cmdclass = {"build_py": thuban_build_py,        cmdclass = {"build_py": thuban_build_py,
897                    "install_local": InstallLocal,                    "install_local": InstallLocal,
898                    "install": ThubanInstall,                    "install": ThubanInstall,
899                    "bdist_inno": thuban_bdist_inno                    "bdist_rpm": thuban_bdist_rpm,
900                      "bdist_inno": thuban_bdist_inno,
901                      "data_dist": data_dist
902                    })                    })
903    
904    

Legend:
Removed from v.15  
changed lines
  Added in v.203

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26