Kludges for Windows
[jelmer/subvertpy.git] / setup.py
1 #!/usr/bin/env python
2 # Setup file for bzr-svn
3 # Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
4
5 from distutils.core import setup
6 from distutils.extension import Extension
7 import os
8
9
10 class BuildData:
11     _libs = ['svn_subr-1', 'svn_client-1', 
12             'svn_ra-1', 'svn_ra_dav-1', 'svn_ra_local-1', 'svn_ra_svn-1',
13             'svn_repos-1', 'svn_wc-1', 'svn_delta-1', 'svn_diff-1', 'svn_fs-1', 
14             'svn_repos-1', 'svn_fs_fs-1', 'svn_fs_base-1']
15     
16     def apr_build_data(self):
17         return (self._apr_include_dirs(), self._apr_lib_dirs(), '')
18
19     def svn_build_data(self):
20         return (self._svn_include_dirs(), self._svn_lib_dirs())
21
22 class PosixBuildData(BuildData):
23     class CommandException(Exception):
24         """Encapsulate exit status of apr-config execution"""
25         def __init__(self, msg, cmd, arg, status, val):
26             self.message = msg % (cmd, val)
27             super(CommandException, self).__init__(self.message)
28             self.cmd = cmd
29             self.arg = arg
30             self.status = status
31         def not_found(self):
32             return os.WIFEXITED(self.status) and os.WEXITSTATUS(self.status) == 127
33
34     def run_cmd(cmd, arg):
35         """Run specified command with given arguments, handling status"""
36         f = os.popen("'%s' %s" % (cmd, arg))
37         dir = f.read().rstrip("\n")
38         status = f.close()
39         if status is None:
40                 return dir
41         if os.WIFEXITED(status):
42             code = os.WEXITSTATUS(status)
43             if code == 0:
44                 return dir
45             raise CommandException("%s exited with status %d",
46                                    cmd, arg, status, code)
47         if os.WIFSIGNALED(status):
48             signal = os.WTERMSIG(status)
49             raise CommandException("%s killed by signal %d",
50                                    cmd, arg, status, signal)
51         raise CommandException("%s terminated abnormally (%d)",
52                                cmd, arg, status, status)
53
54     def apr_config(arg):
55         apr_config_cmd = os.getenv("APR_CONFIG")
56         if apr_config_cmd is None:
57             cmds = ["apr-config", "apr-1-config", "/usr/local/apr/bin/apr-config",
58                     "/usr/local/bin/apr-config"]
59             for cmd in cmds:
60                 try:
61                     res = run_cmd(cmd, arg)
62                     apr_config_cmd = cmd
63                     break
64                 except CommandException, e:
65                     if not e.not_found():
66                         raise
67             else:
68                 raise Exception("apr-config not found."
69                                 " Please set APR_CONFIG environment variable")
70         else:
71             res = run_cmd(apr_config_cmd, arg)
72         return res
73
74     def apr_build_data():
75         """Determine the APR header file location."""
76         includedir = apr_config("--includedir")
77         if not os.path.isdir(includedir):
78             raise Exception("APR development headers not found")
79         ldflags = filter(lambda x: x != "", apr_config("--link-ld").split(" "))
80         return (includedir, ldflags)
81
82     def svn_build_data():
83         """Determine the Subversion header file location."""
84         basedirs = ["/usr/local", "/usr"]
85         for basedir in basedirs:
86             includedir = os.path.join(basedir, "include/subversion-1")
87             if os.path.isdir(includedir):
88                 return (includedir, [os.path.join(basedir, "lib")])
89         raise Exception("Subversion development files not found")
90
91     def libify(self, libname):
92         return libname
93
94 class WindowsBuildData(BuildData):
95
96     def __init__(self):
97         for i, v in enumerate(self._libs):
98             self._libs[i] = 'lib' + v
99         self._libs = self._libs + ['libapr', 'libapriconv', 'libaprutil', 'intl3_svn', 'advapi32', 'shell32', 
100                 'libneon', 'xml',
101                 'libdb44',
102                 'ws2_32', 'zlibstat'
103                 ]
104
105     def _apr_include_dirs(self):
106         return [r"C:\src\svn-win32-1.4.6\include\apr",
107                 r"C:\src\svn-win32-1.4.6\include\apr-utils",
108                 r"c:\src\svn-win32-1.4.6\include\apr-iconv"]
109     def _apr_lib_dirs(self):
110         stub = r"C:\src\svn-win32-1.4.6\lib"
111         return [stub + r'\apr',
112                 stub + r'\apr-iconv',
113                 stub + r'\apr-util',
114                 stub + r'\neon']
115     def _svn_include_dirs(self):
116         return [r"C:\src\svn-win32-1.4.6\include", 
117                 r"c:\src\svn-win32-libintl"]
118     def _svn_lib_dirs(self):
119         return [r"c:\src\svn-win32-1.4.6\lib",
120                 r"c:\src\svn-win32-libintl\lib",
121                 r"C:\src\db4-win32-4.4.20\lib",
122                 r"C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib"]
123
124     def lib_list(self):
125         return self._libs;
126
127     def libify(self, libname):
128         return ('lib' + libname )
129
130 SVN_SUBR = 0
131 SVN_CLIENT = 1
132 SVN_RA = 2
133 SVN_RA_DAV = 3
134 SVN_RA_LOCAL = 4
135 SVN_RA_SVN = 5
136 SVN_REPOS = 6
137 SVN_WC = 7
138 SVN_DELTA = 8
139 SVN_DIFF = 9
140 SVN_FS = 10
141 SVN_REPO = 11
142 SVN_FS_FS = 12
143 SVN_FS_BASE = 13
144 APR = 14
145 APR_ICONV = 15
146 APR_UTIL = 16
147 LIB_INTL = 17
148 ADVAPI = 18
149 SHELL = 19
150 NEON = 20
151 XML = 21
152 BDB = 22
153 WINSOCK = 23
154 ZLIB = 24
155
156 if os.name == 'nt':
157     deps = WindowsBuildData()
158 else:
159     deps = PosixBuildData()
160
161 (apr_includedir, apr_libdir, apr_ldflags) = deps.apr_build_data()
162 (svn_includedir, svn_libdir) = deps.svn_build_data()
163
164 def SvnExtension(name, *args, **kwargs):
165     kwargs["include_dirs"] = apr_includedir + svn_includedir
166     kwargs["library_dirs"] = svn_libdir + apr_libdir
167     kwargs["extra_link_args"] = apr_ldflags
168     return Extension("bzrlib.plugins.svn.%s" % name, *args, **kwargs)
169
170
171 setup(name='bzr-svn',
172       description='Support for Subversion branches in Bazaar',
173       keywords='plugin bzr svn',
174       version='0.4.11',
175       url='http://bazaar-vcs.org/BzrForeignBranches/Subversion',
176       download_url='http://bazaar-vcs.org/BzrSvn',
177       license='GPL',
178       author='Jelmer Vernooij',
179       author_email='jelmer@samba.org',
180       long_description="""
181       This plugin adds support for branching off and 
182       committing to Subversion repositories from 
183       Bazaar.
184       """,
185       package_dir={'bzrlib.plugins.svn':'.', 
186                    'bzrlib.plugins.svn.tests':'tests'},
187       packages=['bzrlib.plugins.svn', 
188                 'bzrlib.plugins.svn.mapping3', 
189                 'bzrlib.plugins.svn.tests'],
190       ext_modules=[
191           SvnExtension("client", ["client.c", "editor.c", "util.c", "ra.c", "wc.c"], libraries=[deps.lib_list()[x] for x in 
192               [SVN_CLIENT, SVN_SUBR, APR, SVN_WC, SVN_RA, LIB_INTL, SVN_DELTA, APR_UTIL, SHELL, ADVAPI, SVN_DIFF, SVN_RA_LOCAL, SVN_RA_DAV, SVN_RA_SVN,
193                   SVN_FS, SVN_REPO, NEON, SVN_FS_FS, SVN_FS_BASE, WINSOCK, XML, BDB]]), 
194           SvnExtension("ra", ["ra.c", "util.c", "editor.c"], libraries=[deps.lib_list()[x] for x in [SVN_RA, SVN_DELTA, SVN_SUBR,
195               APR, SVN_RA_LOCAL, SVN_RA_DAV, SVN_RA_SVN, LIB_INTL, APR_UTIL, XML, SHELL, ADVAPI, SVN_FS, SVN_REPO, NEON, WINSOCK, SVN_FS_FS, SVN_FS_BASE, BDB]]),
196           SvnExtension("repos", ["repos.c", "util.c"], libraries=[deps.lib_list()[x] for x in [SVN_REPO, SVN_SUBR,
197               APR, LIB_INTL, SVN_FS, SVN_DELTA, APR_UTIL, SHELL, ADVAPI, SVN_FS_FS, SVN_FS_BASE, ZLIB, BDB, XML]]),
198           SvnExtension("wc", ["wc.c", "util.c", "editor.c"], libraries=[deps.lib_list()[x] for x in [SVN_WC, SVN_SUBR,
199               APR, LIB_INTL, SVN_DELTA, SVN_DIFF, APR_UTIL, XML, SHELL, ADVAPI]]),
200           ]
201       )