]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/subversion/gen-make.py
Remove spurious newline
[FreeBSD/FreeBSD.git] / contrib / subversion / gen-make.py
1 #!/usr/bin/env python
2 #
3 #
4 # Licensed to the Apache Software Foundation (ASF) under one
5 # or more contributor license agreements.  See the NOTICE file
6 # distributed with this work for additional information
7 # regarding copyright ownership.  The ASF licenses this file
8 # to you under the Apache License, Version 2.0 (the
9 # "License"); you may not use this file except in compliance
10 # with the License.  You may obtain a copy of the License at
11 #
12 #   http://www.apache.org/licenses/LICENSE-2.0
13 #
14 # Unless required by applicable law or agreed to in writing,
15 # software distributed under the License is distributed on an
16 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 # KIND, either express or implied.  See the License for the
18 # specific language governing permissions and limitations
19 # under the License.
20 #
21 #
22 #
23 # gen-make.py -- generate makefiles for building Subversion
24 #
25
26
27 import os
28 import traceback
29 import sys
30
31 import getopt
32 try:
33   my_getopt = getopt.gnu_getopt
34 except AttributeError:
35   my_getopt = getopt.getopt
36 try:
37   # Python >=3.0
38   import configparser
39 except ImportError:
40   # Python <3.0
41   import ConfigParser as configparser
42
43 # for the generator modules
44 sys.path.insert(0, os.path.join('build', 'generator'))
45
46 # for getversion
47 sys.path.insert(1, 'build')
48
49 gen_modules = {
50   'make' : ('gen_make', 'Makefiles for POSIX systems'),
51   'dsp' : ('gen_msvc_dsp', 'MSVC 6.x project files'),
52   'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'),
53   }
54
55 def main(fname, gentype, verfname=None,
56          skip_depends=0, other_options=None):
57   if verfname is None:
58     verfname = os.path.join('subversion', 'include', 'svn_version.h')
59
60   gen_module = __import__(gen_modules[gentype][0])
61
62   generator = gen_module.Generator(fname, verfname, other_options)
63
64   if not skip_depends:
65     generator.compute_hdr_deps()
66
67   generator.write()
68   generator.write_sqlite_headers()
69   generator.write_errno_table()
70   generator.write_config_keys()
71
72   if ('--debug', '') in other_options:
73     for dep_type, target_dict in generator.graph.deps.items():
74       sorted_targets = list(target_dict.keys()); sorted_targets.sort()
75       for target in sorted_targets:
76         print(dep_type + ": " + _objinfo(target))
77         for source in target_dict[target]:
78           print("  " + _objinfo(source))
79       print("=" * 72)
80     gen_keys = sorted(generator.__dict__.keys())
81     for name in gen_keys:
82       value = generator.__dict__[name]
83       if isinstance(value, list):
84         print(name + ": ")
85         for i in value:
86           print("  " + _objinfo(i))
87         print("=" * 72)
88
89
90 def _objinfo(o):
91   if isinstance(o, str):
92     return repr(o)
93   else:
94     t = o.__class__.__name__
95     n = getattr(o, 'name', '-')
96     f = getattr(o, 'filename', '-')
97     return "%s: %s %s" % (t,n,f)
98
99
100 def _usage_exit(err=None):
101   "print ERR (if any), print usage, then exit the script"
102   if err:
103     print("ERROR: %s\n" % (err))
104   print("USAGE:  gen-make.py [options...] [conf-file]")
105   print("  -s        skip dependency generation")
106   print("  --debug   print lots of stuff only developers care about")
107   print("  --release release mode")
108   print("  --reload  reuse all options from the previous invocation")
109   print("            of the script, except -s, -t, --debug and --reload")
110   print("  -t TYPE   use the TYPE generator; can be one of:")
111   items = sorted(gen_modules.items())
112   for name, (module, desc) in items:
113     print('            %-12s  %s' % (name, desc))
114   print("")
115   print("            The default generator type is 'make'")
116   print("")
117   print("  Makefile-specific options:")
118   print("")
119   print("  --assume-shared-libs")
120   print("           omit dependencies on libraries, on the assumption that")
121   print("           shared libraries will be built, so that it is unnecessary")
122   print("           to relink executables when the libraries that they depend")
123   print("           on change.  This is an option for developers who want to")
124   print("           increase the speed of frequent rebuilds.")
125   print("           *** Do not use unless you understand the consequences. ***")
126   print("")
127   print("  UNIX-specific options:")
128   print("")
129   print("  --installed-libs")
130   print("           Comma-separated list of Subversion libraries to find")
131   print("           pre-installed instead of building (probably only")
132   print("           useful for packagers)")
133   print("")
134   print("  Windows-specific options:")
135   print("")
136   print("  --with-apr=DIR")
137   print("           the APR sources are in DIR")
138   print("")
139   print("  --with-apr-util=DIR")
140   print("           the APR-Util sources are in DIR")
141   print("")
142   print("  --with-apr-iconv=DIR")
143   print("           the APR-Iconv sources are in DIR")
144   print("")
145   print("  --with-berkeley-db=DIR")
146   print("           look for Berkeley DB headers and libs in")
147   print("           DIR")
148   print("")
149   print("  --with-serf=DIR")
150   print("           the Serf sources are in DIR")
151   print("")
152   print("  --with-httpd=DIR")
153   print("           the httpd sources and binaries required")
154   print("           for building mod_dav_svn are in DIR;")
155   print("           implies --with-apr{-util, -iconv}, but")
156   print("           you can override them")
157   print("")
158   print("  --with-libintl=DIR")
159   print("           look for GNU libintl headers and libs in DIR;")
160   print("           implies --enable-nls")
161   print("")
162   print("  --with-openssl=DIR")
163   print("           tell serf to look for OpenSSL headers")
164   print("           and libs in DIR")
165   print("")
166   print("  --with-zlib=DIR")
167   print("           tell Subversion to look for ZLib headers and")
168   print("           libs in DIR")
169   print("")
170   print("  --with-jdk=DIR")
171   print("           look for the java development kit here")
172   print("")
173   print("  --with-junit=DIR")
174   print("           look for the junit jar here")
175   print("           junit is for testing the java bindings")
176   print("")
177   print("  --with-swig=DIR")
178   print("           look for the swig program in DIR")
179   print("")
180   print("  --with-sqlite=DIR")
181   print("           look for sqlite in DIR")
182   print("")
183   print("  --with-sasl=DIR")
184   print("           look for the sasl headers and libs in DIR")
185   print("")
186   print("  --enable-pool-debug")
187   print("           turn on APR pool debugging")
188   print("")
189   print("  --enable-purify")
190   print("           add support for Purify instrumentation;")
191   print("           implies --enable-pool-debug")
192   print("")
193   print("  --enable-quantify")
194   print("           add support for Quantify instrumentation")
195   print("")
196   print("  --enable-nls")
197   print("           add support for gettext localization")
198   print("")
199   print("  --disable-shared")
200   print("           only build static libraries")
201   print("")
202   print("  --with-static-apr")
203   print("           Use static apr and apr-util")
204   print("")
205   print("  --with-static-openssl")
206   print("           Use static openssl")
207   print("")
208   print("  --vsnet-version=VER")
209   print("           generate for VS.NET version VER (2005-2017 or 9.0-15.0)")
210   print("           [implies '-t vcproj']")
211   print("")
212   print(" -D NAME[=value]")
213   print("           define NAME macro during compilation")
214   print("           [only valid in combination with '-t vcproj']")
215   print("")
216   print("  --with-apr_memcache=DIR")
217   print("           the apr_memcache sources are in DIR")
218   print("  --disable-gmock")
219   print("           do not use Googlemock")
220   sys.exit(1)
221
222
223 class Options:
224   def __init__(self):
225     self.list = []
226     self.dict = {}
227
228   def add(self, opt, val, overwrite=True):
229     if opt in self.dict:
230       if overwrite:
231         self.list[self.dict[opt]] = (opt, val)
232     else:
233       self.dict[opt] = len(self.list)
234       self.list.append((opt, val))
235
236 if __name__ == '__main__':
237   try:
238     opts, args = my_getopt(sys.argv[1:], 'st:D:',
239                            ['debug',
240                             'release',
241                             'reload',
242                             'assume-shared-libs',
243                             'with-apr=',
244                             'with-apr-util=',
245                             'with-apr-iconv=',
246                             'with-berkeley-db=',
247                             'with-serf=',
248                             'with-httpd=',
249                             'with-libintl=',
250                             'with-openssl=',
251                             'with-zlib=',
252                             'with-jdk=',
253                             'with-junit=',
254                             'with-swig=',
255                             'with-sqlite=',
256                             'with-sasl=',
257                             'with-apr_memcache=',
258                             'with-static-apr',
259                             'with-static-openssl',
260                             'enable-pool-debug',
261                             'enable-purify',
262                             'enable-quantify',
263                             'enable-nls',
264                             'disable-shared',
265                             'installed-libs=',
266                             'vsnet-version=',
267                             'disable-gmock',
268                             ])
269     if len(args) > 1:
270       _usage_exit("Too many arguments")
271   except getopt.GetoptError:
272     typ, val, tb = sys.exc_info()
273     msg = ''.join(traceback.format_exception_only(typ, val))
274     _usage_exit(msg)
275
276   conf = 'build.conf'
277   skip = 0
278   gentype = 'make'
279   rest = Options()
280
281   if args:
282     conf = args[0]
283
284   # First merge options with previously saved to gen-make.opts if --reload
285   # options used
286   for opt, val in opts:
287     if opt == '--reload':
288       prev_conf = configparser.ConfigParser()
289       prev_conf.read('gen-make.opts')
290       for opt, val in prev_conf.items('options'):
291         if opt != '--debug':
292           rest.add(opt, val)
293       del prev_conf
294     elif opt == '--with-neon' or opt == '--without-neon':
295       # Provide a warning that we ignored these arguments
296       print("Ignoring no longer supported argument '%s'" % opt)
297     else:
298       rest.add(opt, val)
299
300   # Parse options list
301   for opt, val in rest.list:
302     if opt == '-s':
303       skip = 1
304     elif opt == '-t':
305       gentype = val
306     elif opt == '--vsnet-version':
307       gentype = 'vcproj'
308     else:
309       if opt == '--with-httpd':
310         rest.add('--with-apr', os.path.join(val, 'srclib', 'apr'),
311                  overwrite=False)
312         rest.add('--with-apr-util', os.path.join(val, 'srclib', 'apr-util'),
313                  overwrite=False)
314         rest.add('--with-apr-iconv', os.path.join(val, 'srclib', 'apr-iconv'),
315                  overwrite=False)
316
317   # Remember all options so that --reload and other scripts can use them
318   opt_conf = open('gen-make.opts', 'w')
319   opt_conf.write('[options]\n')
320   for opt, val in rest.list:
321     opt_conf.write(opt + ' = ' + val + '\n')
322   opt_conf.close()
323
324   if gentype not in gen_modules.keys():
325     _usage_exit("Unknown module type '%s'" % (gentype))
326
327   main(conf, gentype, skip_depends=skip, other_options=rest.list)
328
329
330 ### End of file.