/[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 67 by bh, Thu Oct 18 14:50:21 2001 UTC revision 2212 by bh, Mon May 17 15:47:57 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003, 2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 17  __version__ = "$Revision$" Line 17  __version__ = "$Revision$"
17    
18  import os  import os
19  from types import TupleType  from types import TupleType
20    import glob
21  from distutils.core import setup, Extension, Command  from distutils.core import setup, Extension, Command
22  from distutils.command.install import install  from distutils.command.install import install, INSTALL_SCHEMES, subst_vars
23  from distutils.command.build_py import build_py  from distutils.command.build_py import build_py
24  from distutils.command.bdist_rpm import bdist_rpm  from distutils.command.bdist_rpm import bdist_rpm
25    from distutils.command.build_ext import build_ext
26  from distutils.file_util import write_file  from distutils.file_util import write_file
27  from distutils.filelist import FileList  from distutils.filelist import FileList
28  from distutils.util import convert_path, change_root  from distutils.util import convert_path, change_root
# Line 31  import distutils Line 33  import distutils
33  from string import split  from string import split
34  import string  import string
35    
36    # config script parameter list indices
37    CS_DEFS, CS_INCDIRS, CS_LIBDIRS, CS_LIBS, CS_NUM_PARAMS = range(5)
38    
39    # support for gdal is on by default, but under posix we try to
40    # detect it anyway. Set this to False to disable GDAL.
41    include_gdal = True
42    
43  if os.name == "posix":  if os.name == "posix":
44      ###################################################################      ###################################################################
45      # Posix configuration. Adapt this if you're running some kind of      # Posix configuration. Adapt this if you're running some kind of
# Line 43  if os.name == "posix": Line 52  if os.name == "posix":
52      proj4_lib = "proj"      proj4_lib = "proj"
53    
54    
55      # You shpuldn't have to modify anything below here      # You shouldn't have to modify anything below here
56      ###################################################################      ###################################################################
57            
58      # The installation prefix (similar to autoconf's --prefix). This is      # The installation prefix (similar to autoconf's --prefix). This is
59      # only the default value, you can override it on the command line      # only the default value, you can override it on the command line
60      # with the install command's --prefix option      # with the install command's --prefix option.
61        #
62        # Note that there's a separate prefix option for the bdist_rpm
63        # command completely independent of this one.
64      prefix = "/usr/local/"      prefix = "/usr/local/"
65    
66        # Whether to create the thubaninit module. You can override this
67        # value on the commandline with the --create-init-module to the
68        # install command.
69        create_init_module = 1
70    
71      # On POSIX-systems we run wxgtk-config to determine the C++-compiler      # On POSIX-systems we run wxgtk-config to determine the C++-compiler
72      # flags      # flags
73      wx_config_script = "wx-config"      wx_config_script = "wx-config"
74      # These lists will be filled automatically below      # These lists will be filled automatically below
75      wx_defs = []      wx_cs_params = [[] for i in range(CS_NUM_PARAMS)]
76      wx_incdirs = []  
77      wx_libdirs = []      gdal_config_script = "gdal-config"
78      wx_libs = []      gdal_cs_params = [[] for i in range(CS_NUM_PARAMS)]
79    
80  elif os.name == "nt":  elif os.name == "nt":
81      #################################################################      #################################################################
# Line 66  elif os.name == "nt": Line 83  elif os.name == "nt":
83      #      #
84            
85      # Directories where Proj4 is installed      # Directories where Proj4 is installed
86      proj4_prefix = r"D:\cygwin\home\user\proj-4.4.3\src"      proj4_prefix = r"D:\cygwin\home\user\projects\thuban\proj-4.4.7\src"
87      proj4_incdir =  proj4_prefix      proj4_incdir =  proj4_prefix
88      proj4_libdir =  proj4_prefix      proj4_libdir =  proj4_prefix
89      proj4_lib = "proj_i"      proj4_lib = "proj_i"
90    
91      # Define include and lib directories for wxWindows and      # Define include and lib directories for wxWindows and
92      wx_prefix = r"D:\wx230"      wx_prefix = r"d:\cygwin\home\user\projects\thuban\wxPython-2.4.0.7"
93      wx_inc =  os.path.join(wx_prefix, "include")      wx_inc = [os.path.join(wx_prefix, 'lib', 'mswdllh'),
94      wx_lib =  os.path.join(wx_prefix, "lib")                os.path.join(wx_prefix, "include")]
95        wx_lib = [os.path.join(wx_prefix, "lib")]
96    
97        # Define include and lib directories for GDAL
98        gdal_prefix = r"D:\cygwin\home\user\projects\thuban\gdal-1.1.8"
99        gdal_inc = [os.path.join(gdal_prefix, 'alg'),
100                    os.path.join(gdal_prefix, 'ogr'),
101                    os.path.join(gdal_prefix, 'port'),
102                    os.path.join(gdal_prefix, 'core')]
103        gdal_lib = [gdal_prefix]
104    
105      #      #
106      # Unless you use a wxPython version other than 2.3.1, you probably      # Unless you use a wxPython version other than 2.4.0, you probably
107      # shouldn't have to modify anything below here      # shouldn't have to modify anything below here
108      ##################################################################      ##################################################################
109            
# Line 86  elif os.name == "nt": Line 112  elif os.name == "nt":
112      # the command line with the install command's --prefix option      # the command line with the install command's --prefix option
113      prefix = r"install"      prefix = r"install"
114    
115        # Whether to create the thubaninit module. You can override this
116        # value on the commandline with the --create-init-module to the
117        # install command. By default we don't create it under NT because we
118        # most often run install only as part of bdist_inno where we can't
119        # really create because it needs information only known at install
120        # time.
121        create_init_module = 0
122    
123      # There doesn't seem to be an easy way to get at the wx compiler      # There doesn't seem to be an easy way to get at the wx compiler
124      # flags, so we define them here. These flags work for us with      # flags, so we define them here. These flags work for us with
125      # wxPython 2.3.1. They may have to be modified for other versions.      # wxPython 2.3.1. They may have to be modified for other versions.
# Line 93  elif os.name == "nt": Line 127  elif os.name == "nt":
127      # there's no config script.      # there's no config script.
128      wx_config_script = ""      wx_config_script = ""
129            
130        wx_cs_params = [[] for i in range(CS_NUM_PARAMS)]
131    
132      # the values of wx_defs and wx_libs. copied from the wxPython      # the values of wx_defs and wx_libs. copied from the wxPython
133      # setup.py      # setup.py
134      wx_defs = [ ('WIN32', None),        # Some of these are no longer      wx_cs_params[CS_DEFS] = \
135                  [ ('WIN32', None),        # Some of these are no longer
136                  ('__WIN32__', None),    # necessary.  Anybody know which?                  ('__WIN32__', None),    # necessary.  Anybody know which?
137                  ('_WINDOWS', None),                  ('_WINDOWS', None),
138                  ('__WINDOWS__', None),                  ('__WINDOWS__', None),
# Line 111  elif os.name == "nt": Line 148  elif os.name == "nt":
148                  ('WXP_USE_THREAD', '1'),                  ('WXP_USE_THREAD', '1'),
149                  ]                  ]
150            
151      wx_incdirs = [wx_inc]      wx_cs_params[CS_INCDIRS] = wx_inc
152      wx_libdirs = [wx_lib]      wx_cs_params[CS_LIBDIRS] = wx_lib
153      wx_libs = ["wx23_1h"]      wx_cs_params[CS_LIBS] = ["wxmsw24h"] \
154      wx_libs = wx_libs + ['kernel32', 'user32', 'gdi32', 'comdlg32',                        + ['kernel32', 'user32', 'gdi32', 'comdlg32',
155                           'winspool', 'winmm', 'shell32', 'oldnames',                           'winspool', 'winmm', 'shell32', 'oldnames',
156                           'comctl32', 'ctl3d32', 'odbc32', 'ole32', 'oleaut32',                           'comctl32', 'ctl3d32', 'odbc32', 'ole32', 'oleaut32',
157                           'uuid', 'rpcrt4', 'advapi32', 'wsock32']                           'uuid', 'rpcrt4', 'advapi32', 'wsock32']
158    
159        gdal_config_script = ""
160        gdal_cs_params = [[] for i in range(CS_NUM_PARAMS)]
161    
162        gdal_cs_params[CS_INCDIRS] = gdal_inc
163        gdal_cs_params[CS_LIBDIRS] = gdal_lib
164        gdal_cs_params[CS_LIBS] = ["gdal_i"]
165    
166  else:  else:
167      raise RuntimeError("Unsupported platform " + os.name)      raise RuntimeError("Unsupported platform " + os.name)
168    
# Line 144  def run_script(cmdline): Line 189  def run_script(cmdline):
189      return result      return result
190    
191    
192  def run_wx_script(command):  def run_cs_script(command, store):
193      # first, determine the C++ preprocessor flags Use --cflags here      # first, determine the C++ preprocessor flags Use --cflags here
194      # because it seems that older version don't have --cxxflags and      # because it seems that older version don't have --cxxflags and
195      # newer ones return the same result for both      # newer ones return the same result for both
196      flags = run_script(command + ' --cflags ')      flags = run_script(command + ' --cflags ')
197      if flags is None:      if flags is None:
198          return 0          return False
199      for flag in split(flags):      for flag in split(flags):
200          start = flag[:2]          start = flag[:2]
201          value = flag[2:]          value = flag[2:]
202          if start == "-I":          if start == "-I":
203              wx_incdirs.append(value)              store[CS_INCDIRS].append(value)
204          elif start == "-D":          elif start == "-D":
205              wx_defs.append((value, None))              store[CS_DEFS].append((value, None))
206    
207      # determine the library flags      # determine the library flags
208      flags = run_script(command + ' --libs')      flags = run_script(command + ' --libs')
209      if flags is None:      if flags is None:
210          return 0          return False
211      for flag in split(flags):      for flag in split(flags):
212          start = flag[:2]          start = flag[:2]
213          value = flag[2:]          value = flag[2:]
214          if start == "-L":          if start == "-L":
215              wx_libdirs.append(value)              store[CS_LIBDIRS].append(value)
216          elif start == "-l":          elif start == "-l":
217              wx_libs.append(value)              store[CS_LIBS].append(value)
218    
219        return True
220    
221  if wx_config_script:  if wx_config_script:
222      # if there's a wx config script, run it to determine the configuration      # if there's a wx config script, run it to determine the configuration
223      run_wx_script(wx_config_script)      run_cs_script(wx_config_script, wx_cs_params)
       
224    
225    if gdal_config_script:
226        # if there's a gdal config script, run it to determine the configuration
227        include_gdal = include_gdal \
228                       and run_cs_script(gdal_config_script, gdal_cs_params)
229    
230  #  #
231  # Define some extension and python modules  # Define some extension and python modules
232  #  #
233  # The C-extension names are prefixed woth "Lib." so they get put into  # The C-extension names are prefixed with "Lib." so they get put into
234  # the Lib/ subdirectory. Lib/ is not really a package but distutils  # the Lib/ subdirectory. Lib/ is not really a package but distutils
235  # doesn't care  # doesn't care
236    
237  # subdirectory containing the extensions  # subdirectory containing the distutil extensions
238  ext_dir = "extensions"  ext_dir = "libraries"
239    
240  # subdirectory with some shapelib files  # subdirectory with some shapelib files
241  shp_dir = ext_dir + "/shapelib"  shp_dir = ext_dir + "/shapelib"
# Line 200  py_modules = [] Line 250  py_modules = []
250  #  #
251    
252  extensions.append(Extension("Lib.wxproj",  extensions.append(Extension("Lib.wxproj",
253                              [ext_dir + "/thuban/wxproj.cpp",                              [ext_dir + "/thuban/wxproj.cpp"],
254                               shp_dir + "/shpopen.c"],                              include_dirs = ([shp_dir, proj4_incdir,
255                              include_dirs = [shp_dir, proj4_incdir] +wx_incdirs,                                               ext_dir + "/pyshapelib/"]
256                              define_macros = wx_defs,                                              + wx_cs_params[CS_INCDIRS]),
257                              library_dirs = [proj4_libdir] + wx_libdirs,                              define_macros = wx_cs_params[CS_DEFS],
258                              libraries = [proj4_lib] + wx_libs))                              library_dirs = [proj4_libdir] +
259                                               wx_cs_params[CS_LIBDIRS],
260                                libraries = [proj4_lib] + wx_cs_params[CS_LIBS]))
261    
262    
263  #  #
264  # shapelib wrappers are also distributed with thuban  # shapelib wrappers are also distributed with thuban
# Line 213  extensions.append(Extension("Lib.wxproj" Line 266  extensions.append(Extension("Lib.wxproj"
266    
267  extensions.append(Extension("Lib.shapelibc",  extensions.append(Extension("Lib.shapelibc",
268                              [ext_dir + "/pyshapelib/shapelib_wrap.c",                              [ext_dir + "/pyshapelib/shapelib_wrap.c",
269                               shp_dir + "/shpopen.c"],                               shp_dir + "/shpopen.c",
270                                 shp_dir + "/shptree.c"],
271                                include_dirs = [shp_dir]))
272    extensions.append(Extension("Lib.shptree",
273                                [ext_dir + "/pyshapelib/shptreemodule.c"],
274                              include_dirs = [shp_dir]))                              include_dirs = [shp_dir]))
275  extensions.append(Extension("Lib.dbflibc",  extensions.append(Extension("Lib.dbflibc",
276                              [ext_dir + "/pyshapelib/dbflib_wrap.c",                              [ext_dir + "/pyshapelib/dbflib_wrap.c",
277                               shp_dir + "/dbfopen.c"],                               shp_dir + "/dbfopen.c"],
278                              include_dirs = [shp_dir]))                              include_dirs = [shp_dir],
279                                define_macros = [("HAVE_UPDATE_HEADER", "1")]))
280  for name in ("shapelib", "dbflib"):  for name in ("shapelib", "dbflib"):
281      py_modules.append(ext_dir + "/pyshapelib/" + name)      py_modules.append(ext_dir + "/pyshapelib/" + name)
282    
# Line 239  py_modules.append(ext_dir + "/pyprojecti Line 297  py_modules.append(ext_dir + "/pyprojecti
297    
298  data_files = []  data_files = []
299    
300  # bitmaps  # Resources
301  dir = "Resources/Bitmaps"  for d, patterns in [("Resources/Bitmaps",
302  bitmaps = []                      ("Resources/Bitmaps/*.xpm",)),
303  for file in os.listdir(os.path.join("Resources", "Bitmaps")):                     ("Resources/Projections",
304      if string.lower(file[-4:]) == ".xpm":                      ("Resources/Projections/*.proj",)),
305          bitmaps.append(dir + '/' +  file)                     ("Resources/XML",
306  data_files.append((dir, bitmaps))                      ("Resources/XML/*.dtd",)),
307                       ("Extensions/importAPR/samples",
308                        ("Extensions/importAPR/samples/README",
309                         "Extensions/importAPR/samples/*.apr")),
310                       ]:
311        for pattern in patterns:
312            data_files.append((d, glob.glob(pattern)))
313    if os.path.isdir("Resources/Locale"):
314        for d in os.listdir("Resources/Locale"):
315            data_files.append(("Resources/Locale/" + d +"/LC_MESSAGES",
316                               ["Resources/Locale/"+ d +"/LC_MESSAGES/thuban.mo"]))
317    
318  #  #
319  #       Command definitions  #       Command definitions
# Line 392  class InstallLocal(Command): Line 460  class InstallLocal(Command):
460      """      """
461    
462      description =\      description =\
463          "Create some symlink so you can run thubanfrom the source directory"          "Create some symlinks so you can run thuban from the source directory"
464    
465      user_options = [      user_options = [
466          ('skip-build', None, "skip the build steps"),          ('skip-build', None, "skip the build steps"),
467            ('create-init-module', None,
468             "Create the thubaninit.py module to ease use of Thuban as a library"),
469            ('dont-create-init-module', None,
470             "Do not create the thubaninit.py module"),
471          ]          ]
472    
473        boolean_options = ["create-init-module"]
474        negative_opt = {'dont-create-init-module' : 'create-init-module'}
475    
476    
477      def initialize_options (self):      def initialize_options (self):
478          self.extensions = None          self.extensions = None
479          self.build_dir = None          self.build_dir = None
480          self.skip_build = None          self.skip_build = None
481            self.create_init_module = None
482    
483      def finalize_options (self):      def finalize_options (self):
484          self.set_undefined_options("install",          self.set_undefined_options("install",
485                                     ("build_lib", "build_dir"),                                     ("build_lib", "build_dir"),
486                                     ('skip_build', 'skip_build'))                                     ('skip_build', 'skip_build'))
487          self.extensions = self.distribution.ext_modules          self.extensions = self.distribution.ext_modules
488            if self.create_init_module is None:
489                # by default we create the init module
490                self.create_init_module = 1
491    
492      def run(self):      def run(self):
493          # Make sure we have built everything we need first          # Make sure we have built everything we need first
# Line 416  class InstallLocal(Command): Line 496  class InstallLocal(Command):
496          # now do the work. Simply link or copy the Lib dir          # now do the work. Simply link or copy the Lib dir
497          libdir = os.path.join(self.build_dir, "Lib")          libdir = os.path.join(self.build_dir, "Lib")
498          if os.name == "posix":          if os.name == "posix":
499              # on posix, just lilnk the Lib dir              # on posix, just link the Lib dir
500              self.link_dir(libdir, "Lib")              self.link_dir(libdir, "Lib")
501          else:          else:
502              self.copy_tree(libdir, "Lib")              self.copy_tree(libdir, "Lib")
503    
504            # create the init module if desired
505            if self.create_init_module:
506                # create the init module
507                initfilename = "thubaninit.py"
508                contents = thubaninit_contents("")
509                self.execute(write_file, (initfilename, contents),
510                             "Create %s" % initfilename)
511    
512      def link_dir(self, src, dest):      def link_dir(self, src, dest):
513          """Create a symbolic link dest pointing to src"""          """Create a symbolic link dest pointing to src"""
514          if self.verbose:          if self.verbose:
# Line 447  class thuban_build_py(build_py): Line 535  class thuban_build_py(build_py):
535      distribution.      distribution.
536      """      """
537    
538        # FIXME: When Thuban can rely on Python 2.3 as the oldest supported
539        # Python release we don't need to override the run and
540        # find_all_modules methods anymore. distutils will allow both python
541        # modules and packages starting with 2.3.
542    
543      def run(self):      def run(self):
544          """The same the as the original in build_py revision 1.33 except          """The same the as the original in build_py revision 1.33 except
545          that this allows both packages and modules to be in one          that this allows both packages and modules to be in one
# Line 498  class thuban_build_py(build_py): Line 591  class thuban_build_py(build_py):
591          return modules          return modules
592    
593    
594    thubaninit_contents_start = """
595    # This module was automatically generated by Thuban's install script
596    '''Import this module once per program (best place is probably the file
597    that ends up as your __main__ module) to be able to import Thuban
598    afterwards.
599    
600    Usage:
601    
602    import thubaninit
603    import Thuban
604    '''
605    import sys, os
606    """
607    
608    thubaninit_contents_thubaninitdir = """
609    sys.path.insert(0, %(thubandir)s)
610    """
611    thubaninit_contents_otherdirs = """
612    # Put the Lib dir into the path. The Lib dir contains some extra Python
613    # modules
614    import Thuban
615    thubandir = os.path.join(Thuban.__path__[0], '..')
616    dir = os.path.join(thubandir, "Lib")
617    if os.path.isdir(dir):
618        sys.path.insert(0, dir)
619    """
620    
621    def thubaninit_contents(thubandir):
622        """Return the contents of the the thubaninit file as a list of lines.
623    
624        The parameter thubandir is the parent directory where the Thuban/
625        package or the empty string if the thubaninit file itself will be
626        located in that direcory as well.
627        """
628        contents = thubaninit_contents_start
629        if thubandir:
630            thubandir = repr(thubandir)
631            contents += thubaninit_contents_thubaninitdir % locals()
632        contents += thubaninit_contents_otherdirs
633        return contents.split("\n")
634    
635    
636  class ThubanInstall(install):  class ThubanInstall(install):
637    
# Line 514  class ThubanInstall(install): Line 648  class ThubanInstall(install):
648                          "(default on posix systems and only relevant there)"),                          "(default on posix systems and only relevant there)"),
649    
650                           ("extra-files", None,                           ("extra-files", None,
651                            "List of filenames or (src, dest) pairs describing "                            "List of filenames or (src, dest) pairs describing"
652                            " extra files to install "                            " extra files to install "
653                            "(can only be set from witin setup.py"),                            "(can only be set from within setup.py"),
654    
655                             ("create-init-module=", None,
656                              "If true, create a module in the site-packages"
657                              " directory that tweaks sys.path to let you easily"
658                              " import thuban modules from outside of thuban."),
659                             ("init-module-dir=", None,
660                              "Directory in which to create the init module."
661                              " Defaults to Python's site-packages directory."),
662                           ])                           ])
663    
664      boolean_options = install.boolean_options[:]      boolean_options = install.boolean_options[:]
665      boolean_options.append("do-symlink")      boolean_options.append("do-symlink")
666        boolean_options.append("create-init-module")
667    
668      def initialize_options(self):      def initialize_options(self):
669          self.do_symlink = None          self.do_symlink = None
670          self.extra_files = []          self.extra_files = []
671    
672            # initialize the create_init_module flag from the global
673            # determined at runtime
674            self.create_init_module = create_init_module
675            self.init_module_dir = None
676          install.initialize_options(self)          install.initialize_options(self)
677    
678      def finalize_options(self):      def finalize_options(self):
# Line 534  class ThubanInstall(install): Line 682  class ThubanInstall(install):
682              else:              else:
683                  self.do_symlink = 0                  self.do_symlink = 0
684          install.finalize_options(self)          install.finalize_options(self)
685            self.expand_with_pure_python_dirs(["init_module_dir"])
686    
687        def expand_with_pure_python_dirs(self, attrs):
688            """Expand the attributes with default values of base and platbase"""
689            # it seems that the values for "prefix" and "exec_prefix" in
690            # self.config_vars are the corresponding values used by the
691            # python interpreter, so we just assign these to "base" and
692            # "platbase".
693            config_vars = self.config_vars.copy()
694            config_vars["base"] = self.config_vars["prefix"]
695            config_vars["platbase"] = self.config_vars["exec_prefix"]
696            for attr in attrs:
697                val = getattr(self, attr)
698                if val is not None:
699                    if os.name == 'posix':
700                        val = os.path.expanduser(val)
701                    val = subst_vars(val, config_vars)
702                    setattr(self, attr, val)
703    
704        def select_scheme(self, scheme):
705            """Extend the inherited method to set init_module_dir"""
706            install.select_scheme(self, scheme)
707            # only set init_module_dir if it wasn't set by the user
708            if self.init_module_dir is None:
709                self.init_module_dir = INSTALL_SCHEMES[scheme]['purelib']
710    
711        def convert_paths(self, *args):
712            """Extend the inherited method so that we can remember some filename
713            """
714            # remember the installation directory before its root gets
715            # changed
716            self.install_lib_orig = self.install_lib
717            apply(install.convert_paths, (self,) + args)
718    
719      def run(self):      def run(self):
720          install.run(self)          install.run(self)
# Line 542  class ThubanInstall(install): Line 723  class ThubanInstall(install):
723                  src, dest = item                  src, dest = item
724              else:              else:
725                  src = dest = item                  src = dest = item
726              self.copy_file(convert_path(src),              self.copy_file(convert_path(src),
727                             os.path.join(self.root, convert_path(dest)))                             os.path.join(self.root, convert_path(dest)))
728    
729          if os.name == "posix" and self.do_symlink:          if os.name == "posix" and self.do_symlink:
# Line 557  class ThubanInstall(install): Line 738  class ThubanInstall(install):
738              self.mkpath(bindir)              self.mkpath(bindir)
739              self.link_file(scriptfile, binfile)              self.link_file(scriptfile, binfile)
740    
741            if self.create_init_module:
742                # create the init module
743                initfilename = self.thuban_init_filename()
744                if self.root:
745                    initfilename = change_root(self.root, initfilename)
746                contents = thubaninit_contents(self.install_lib_orig)
747                self.mkpath(os.path.dirname(initfilename))
748                self.execute(write_file, (initfilename, contents),
749                             "Create %s" % initfilename)
750    
751      def link_file(self, src, dest):      def link_file(self, src, dest):
752          """Create a symbolic link dest pointing to src.          """Create a symbolic link dest pointing to src.
753    
# Line 571  class ThubanInstall(install): Line 762  class ThubanInstall(install):
762          if not os.path.exists(dest):          if not os.path.exists(dest):
763              os.symlink(src, dest)              os.symlink(src, dest)
764    
765        def thuban_init_filename(self):
766            """Return the filename for the init-module"""
767            # Since we override the normal install dirs to point to our own
768            # prefix we have to reach into installed
769            return self.init_module_dir + "/thubaninit.py"
770    
771      def get_outputs (self):      def get_outputs (self):
772          outputs = install.get_outputs(self)          outputs = install.get_outputs(self)
# Line 586  class ThubanInstall(install): Line 782  class ThubanInstall(install):
782                  bindir = change_root(self.root, bindir)                  bindir = change_root(self.root, bindir)
783              binfile = os.path.join(bindir, "thuban")              binfile = os.path.join(bindir, "thuban")
784              outputs.append(binfile)              outputs.append(binfile)
785            if self.create_init_module:
786                initfilename = self.thuban_init_filename()
787                if self.root:
788                    initfilename = change_root(self.root, initfilename)
789                outputs.append(initfilename)
790          return outputs          return outputs
791    
792    
793    # scripts to override some of the commands put into the spec-file by the
794    # bdist_rpm command.
795    
796  bdist_rpm_prep_script = '''  bdist_rpm_prep_script = '''
797  %setup  %setup
798  cp extensions/pyshapelib/{README,README.pyshapelib}  cp libraries/pyshapelib/{README,README.pyshapelib}
799  cp extensions/pyshapelib/{COPYING,COPYING.pyshapelib}  cp libraries/pyshapelib/{COPYING,COPYING.pyshapelib}
800  cp extensions/pyprojection/{LICENSE,LICENSE.pyprojection}  cp libraries/pyprojection/{LICENSE,LICENSE.pyprojection}
801    '''
802    
803    bdist_rpm_build_script = '''
804    env PATH="$PATH:%(prefix)s/lib/wxPython/bin:/usr/lib/wxPython/bin" CFLAGS="$RPM_OPT_FLAGS" %(python)s setup.py build
805    '''
806    
807    bdist_rpm_install_script = '''
808    %(python)s setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES \
809       --prefix=%(prefix)s
810  '''  '''
811    
812    
       
813  class thuban_bdist_rpm(bdist_rpm):  class thuban_bdist_rpm(bdist_rpm):
814    
815      """Thuban specific RPM distribution command"""      """Thuban specific RPM distribution command"""
816    
817      def run(self):      user_options = bdist_rpm.user_options[:]
818          # create the prep script for the spec-file      user_options.extend([("prefix=", None, "Install prefix for the RPM"),
819                             ])
820    
821        def initialize_options(self):
822            # per default, RPMs are installed in /usr
823            self.prefix = "/usr/"
824    
825            # create the scripts we want to override. We actually fill them
826            # with contents later because some values we put into those
827            # scripts such as the python interpreter to use are only known
828            # then.
829            open("bdist_rpm_prep", "w").close()
830            open("bdist_rpm_build", "w").close()
831            open("bdist_rpm_install", "w").close()
832            bdist_rpm.initialize_options(self)
833    
834        def _make_spec_file(self):
835            # create the scripts for the spec-file. Now we know the python
836            # interpreter to use.
837          open("bdist_rpm_prep", "w").write(bdist_rpm_prep_script)          open("bdist_rpm_prep", "w").write(bdist_rpm_prep_script)
838    
839          bdist_rpm.run(self)          build = bdist_rpm_build_script % {"python": self.python,
840                                              "prefix": self.prefix}
841            open("bdist_rpm_build", "w").write(build)
842    
843            install = bdist_rpm_install_script % {"python": self.python,
844                                                  "prefix": self.prefix}
845            open("bdist_rpm_install", "w").write(install)
846    
847            #
848            return bdist_rpm._make_spec_file(self)
849    
850    
851  class bdist_inno(Command):  class bdist_inno(Command):
# Line 688  class bdist_inno(Command): Line 927  class bdist_inno(Command):
927          """Execute the command. install_options if given, should be a          """Execute the command. install_options if given, should be a
928          directory of additional options to set in the install step"""          directory of additional options to set in the install step"""
929          # Obviously have to build before we can install          # Obviously have to build before we can install
930    
931          if not self.skip_build:          if not self.skip_build:
932              self.run_command('build')              self.run_command('build')
933    
# Line 710  class bdist_inno(Command): Line 950  class bdist_inno(Command):
950          self.execute(write_file, (iss_file, self.generate_iss()),          self.execute(write_file, (iss_file, self.generate_iss()),
951                       "Create Inno Setup script file %s" % iss_file)                       "Create Inno Setup script file %s" % iss_file)
952    
953          # and invoke          # and invoke
954          if self.run_inno:          if self.run_inno:
955              self.spawn(["iscc", iss_file])              self.spawn(["iscc", iss_file])
956    
# Line 776  class bdist_inno(Command): Line 1016  class bdist_inno(Command):
1016              line = 'Name: "{group}\\%s"; Filename: "%s";' \              line = 'Name: "{group}\\%s"; Filename: "%s";' \
1017                     % (icon.title, icon.install_name)                     % (icon.title, icon.install_name)
1018              iss.append(line)              iss.append(line)
1019                
1020          return iss          return iss
1021    
1022    
# Line 792  class InnoIconItem: Line 1032  class InnoIconItem:
1032          else:          else:
1033              self.install_name = filename              self.install_name = filename
1034    
1035                
1036  class thuban_bdist_inno(bdist_inno):  class thuban_bdist_inno(bdist_inno):
1037    
1038      """Thuban specific Inno Setup stuff"""      """Thuban specific Inno Setup stuff"""
# Line 800  class thuban_bdist_inno(bdist_inno): Line 1040  class thuban_bdist_inno(bdist_inno):
1040      def run(self):      def run(self):
1041          install_options = {          install_options = {
1042              "prefix": ".",              "prefix": ".",
1043                "install_lib": "$base",
1044                "install_data": "$base",
1045              "install_scripts": "$base",              "install_scripts": "$base",
1046              "warn_dir": 0,              "warn_dir": 0,
1047              "extra_files": ["COPYING", "Lib/proj.dll"],              "extra_files": ["COPYING", "Lib/proj.dll"],
# Line 807  class thuban_bdist_inno(bdist_inno): Line 1049  class thuban_bdist_inno(bdist_inno):
1049          # don't make a symlink because we're simulating windows, so          # don't make a symlink because we're simulating windows, so
1050          # that we can generate the iss-file even on Linux          # that we can generate the iss-file even on Linux
1051          install_options["do_symlink"] = 0          install_options["do_symlink"] = 0
1052    
1053          bdist_inno.run(self, install_options)          bdist_inno.run(self, install_options)
1054        
1055                class thuban_build_docs(Command):
1056    
1057        """Command to generate documentation from source code."""
1058    
1059        description = "Generate documentation."
1060    
1061        user_options = []
1062    
1063        def initialize_options(self): pass
1064    
1065        def finalize_options(self): pass
1066    
1067        def run(self, install_options = None):
1068            self.spawn(["happydoc", "-d./Doc", "./Thuban"])
1069    
1070    class thuban_build_ext(build_ext):
1071    
1072        """Extend the build_ext command to optionally include the
1073        GDAL extension.
1074        """
1075    
1076        user_options = build_ext.user_options[:]
1077        user_options.extend([("with-gdal", None, "Include GDAL support."),
1078                             ("without-gdal", None, "Don't include GDAL support.")])
1079    
1080        boolean_options = ["with-gdal"]
1081        negative_opt = {'without-gdal' : 'with-gdal'}
1082    
1083        def initialize_options(self):
1084            self.with_gdal = True
1085            build_ext.initialize_options(self)
1086    
1087        def finalize_options(self):
1088            build_ext.finalize_options(self)
1089            if self.with_gdal and include_gdal:
1090                self.extensions.append(Extension("Lib.gdalwarp",
1091                                    [ext_dir + "/thuban/gdalwarp.cpp",
1092                                    ext_dir + "/thuban/cpl_mfile.cpp",
1093                                    ext_dir + "/thuban/bmpdataset.cpp"],
1094                                    include_dirs = gdal_cs_params[CS_INCDIRS] +
1095                                                   [ext_dir + "/thuban/"],
1096                                    define_macros = gdal_cs_params[CS_DEFS],
1097                                    library_dirs = gdal_cs_params[CS_LIBDIRS],
1098                                    libraries = gdal_cs_params[CS_LIBS]))
1099    
1100        def run(self, install_options = None):
1101            build_ext.run(self)
1102    
1103  #  #
1104  #   Run the script  #   Run the script
1105  #  #
1106    
   
1107  long_description = """\  long_description = """\
1108  Thuban is a viewer for geographic data written in Python  Thuban is a viewer for geographic data written in Python
1109  """  """
1110    
1111  setup(name = "Thuban",  setup(name = "Thuban",
1112        version = "0.1",        version = "1.0.0",
1113        description = "Geographic data viewer",        description = "Geographic data viewer",
1114        long_description = long_description,        long_description = long_description,
1115        licence = "GPL",        license = "GPL",
1116        author = "Intevation GmbH",        author = "Intevation GmbH",
1117        author_email = "[email protected]",        author_email = "[email protected]",
1118        url = "ftp:intevation.de/",        url = "http://thuban.intevation.de/",
1119    
1120        scripts = ["thuban.py"],        scripts = ["thuban.py"],
1121        packages = ["Thuban", "Thuban.Lib", "Thuban.Model", "Thuban.UI"],        packages = ["Thuban", "Thuban.Lib", "Thuban.Model", "Thuban.UI",
1122                      "Extensions", "Extensions.gns2shp", "Extensions.wms",
1123                      "Extensions.importAPR", "Extensions.profiling"],
1124        ext_modules = extensions,        ext_modules = extensions,
1125        py_modules = py_modules,        py_modules = py_modules,
1126        data_files = data_files,        data_files = data_files,
# Line 840  setup(name = "Thuban", Line 1131  setup(name = "Thuban",
1131                   {"prefix": prefix,                   {"prefix": prefix,
1132                    # make sure both libs and scripts are installed in the                    # make sure both libs and scripts are installed in the
1133                    # same directory.                    # same directory.
1134                    "install_lib": "$base/thuban",                    "install_lib": "$base/lib/thuban",
1135                    "install_scripts": "$base/thuban",                    "install_scripts": "$base/lib/thuban",
1136                    "install_data": "$base/thuban",                    "install_data": "$base/lib/thuban",
1137    
1138                    # Don't print warning messages about the lib dir not                    # Don't print warning messages about the lib dir not
1139                    # being on Python's path. The libraries are Thuban                    # being on Python's path. The libraries are Thuban
# Line 862  setup(name = "Thuban", Line 1153  setup(name = "Thuban",
1153                    "install": ThubanInstall,                    "install": ThubanInstall,
1154                    "bdist_rpm": thuban_bdist_rpm,                    "bdist_rpm": thuban_bdist_rpm,
1155                    "bdist_inno": thuban_bdist_inno,                    "bdist_inno": thuban_bdist_inno,
1156                    "data_dist": data_dist                    "data_dist": data_dist,
1157                      "build_docs": thuban_build_docs,
1158                      "build_ext": thuban_build_ext
1159                    })                    })
1160    
1161    

Legend:
Removed from v.67  
changed lines
  Added in v.2212

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26