1251881Speter#!/usr/bin/env python
2251881Speter#
3251881Speter#
4251881Speter# Licensed to the Apache Software Foundation (ASF) under one
5251881Speter# or more contributor license agreements.  See the NOTICE file
6251881Speter# distributed with this work for additional information
7251881Speter# regarding copyright ownership.  The ASF licenses this file
8251881Speter# to you under the Apache License, Version 2.0 (the
9251881Speter# "License"); you may not use this file except in compliance
10251881Speter# with the License.  You may obtain a copy of the License at
11251881Speter#
12251881Speter#   http://www.apache.org/licenses/LICENSE-2.0
13251881Speter#
14251881Speter# Unless required by applicable law or agreed to in writing,
15251881Speter# software distributed under the License is distributed on an
16251881Speter# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17251881Speter# KIND, either express or implied.  See the License for the
18251881Speter# specific language governing permissions and limitations
19251881Speter# under the License.
20251881Speter#
21251881Speter#
22251881Speter#
23251881Speter# gen-make.py -- generate makefiles for building Subversion
24251881Speter#
25251881Speter
26251881Speter
27251881Speterimport os
28289180Speterimport traceback
29251881Speterimport sys
30289180Speter
31251881Speterimport getopt
32251881Spetertry:
33251881Speter  my_getopt = getopt.gnu_getopt
34251881Speterexcept AttributeError:
35251881Speter  my_getopt = getopt.getopt
36251881Spetertry:
37251881Speter  # Python >=3.0
38251881Speter  import configparser
39251881Speterexcept ImportError:
40251881Speter  # Python <3.0
41251881Speter  import ConfigParser as configparser
42251881Speter
43251881Speter# for the generator modules
44251881Spetersys.path.insert(0, os.path.join('build', 'generator'))
45251881Speter
46251881Speter# for getversion
47251881Spetersys.path.insert(1, 'build')
48251881Speter
49251881Spetergen_modules = {
50251881Speter  'make' : ('gen_make', 'Makefiles for POSIX systems'),
51251881Speter  'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'),
52251881Speter  }
53251881Speter
54251881Speterdef main(fname, gentype, verfname=None,
55251881Speter         skip_depends=0, other_options=None):
56251881Speter  if verfname is None:
57251881Speter    verfname = os.path.join('subversion', 'include', 'svn_version.h')
58251881Speter
59251881Speter  gen_module = __import__(gen_modules[gentype][0])
60251881Speter
61251881Speter  generator = gen_module.Generator(fname, verfname, other_options)
62251881Speter
63251881Speter  if not skip_depends:
64251881Speter    generator.compute_hdr_deps()
65251881Speter
66251881Speter  generator.write()
67251881Speter  generator.write_sqlite_headers()
68289180Speter  generator.write_errno_table()
69289180Speter  generator.write_config_keys()
70251881Speter
71251881Speter  if ('--debug', '') in other_options:
72251881Speter    for dep_type, target_dict in generator.graph.deps.items():
73369302Sdim      sorted_targets = sorted(target_dict.keys(), key=str)
74251881Speter      for target in sorted_targets:
75251881Speter        print(dep_type + ": " + _objinfo(target))
76251881Speter        for source in target_dict[target]:
77251881Speter          print("  " + _objinfo(source))
78251881Speter      print("=" * 72)
79251881Speter    gen_keys = sorted(generator.__dict__.keys())
80251881Speter    for name in gen_keys:
81251881Speter      value = generator.__dict__[name]
82251881Speter      if isinstance(value, list):
83251881Speter        print(name + ": ")
84251881Speter        for i in value:
85251881Speter          print("  " + _objinfo(i))
86251881Speter        print("=" * 72)
87251881Speter
88251881Speter
89251881Speterdef _objinfo(o):
90251881Speter  if isinstance(o, str):
91251881Speter    return repr(o)
92251881Speter  else:
93251881Speter    t = o.__class__.__name__
94251881Speter    n = getattr(o, 'name', '-')
95251881Speter    f = getattr(o, 'filename', '-')
96251881Speter    return "%s: %s %s" % (t,n,f)
97251881Speter
98251881Speter
99251881Speterdef _usage_exit(err=None):
100251881Speter  "print ERR (if any), print usage, then exit the script"
101251881Speter  if err:
102251881Speter    print("ERROR: %s\n" % (err))
103251881Speter  print("USAGE:  gen-make.py [options...] [conf-file]")
104251881Speter  print("  -s        skip dependency generation")
105251881Speter  print("  --debug   print lots of stuff only developers care about")
106251881Speter  print("  --release release mode")
107251881Speter  print("  --reload  reuse all options from the previous invocation")
108251881Speter  print("            of the script, except -s, -t, --debug and --reload")
109251881Speter  print("  -t TYPE   use the TYPE generator; can be one of:")
110251881Speter  items = sorted(gen_modules.items())
111251881Speter  for name, (module, desc) in items:
112251881Speter    print('            %-12s  %s' % (name, desc))
113251881Speter  print("")
114251881Speter  print("            The default generator type is 'make'")
115251881Speter  print("")
116251881Speter  print("  Makefile-specific options:")
117251881Speter  print("")
118251881Speter  print("  --assume-shared-libs")
119251881Speter  print("           omit dependencies on libraries, on the assumption that")
120251881Speter  print("           shared libraries will be built, so that it is unnecessary")
121251881Speter  print("           to relink executables when the libraries that they depend")
122251881Speter  print("           on change.  This is an option for developers who want to")
123251881Speter  print("           increase the speed of frequent rebuilds.")
124251881Speter  print("           *** Do not use unless you understand the consequences. ***")
125251881Speter  print("")
126251881Speter  print("  UNIX-specific options:")
127251881Speter  print("")
128251881Speter  print("  --installed-libs")
129251881Speter  print("           Comma-separated list of Subversion libraries to find")
130251881Speter  print("           pre-installed instead of building (probably only")
131251881Speter  print("           useful for packagers)")
132251881Speter  print("")
133251881Speter  print("  Windows-specific options:")
134251881Speter  print("")
135251881Speter  print("  --with-apr=DIR")
136251881Speter  print("           the APR sources are in DIR")
137251881Speter  print("")
138251881Speter  print("  --with-apr-util=DIR")
139251881Speter  print("           the APR-Util sources are in DIR")
140251881Speter  print("")
141251881Speter  print("  --with-apr-iconv=DIR")
142251881Speter  print("           the APR-Iconv sources are in DIR")
143251881Speter  print("")
144251881Speter  print("  --with-berkeley-db=DIR")
145251881Speter  print("           look for Berkeley DB headers and libs in")
146251881Speter  print("           DIR")
147251881Speter  print("")
148251881Speter  print("  --with-serf=DIR")
149251881Speter  print("           the Serf sources are in DIR")
150251881Speter  print("")
151251881Speter  print("  --with-httpd=DIR")
152251881Speter  print("           the httpd sources and binaries required")
153251881Speter  print("           for building mod_dav_svn are in DIR;")
154251881Speter  print("           implies --with-apr{-util, -iconv}, but")
155251881Speter  print("           you can override them")
156251881Speter  print("")
157251881Speter  print("  --with-libintl=DIR")
158251881Speter  print("           look for GNU libintl headers and libs in DIR;")
159251881Speter  print("           implies --enable-nls")
160251881Speter  print("")
161251881Speter  print("  --with-openssl=DIR")
162251881Speter  print("           tell serf to look for OpenSSL headers")
163251881Speter  print("           and libs in DIR")
164251881Speter  print("")
165251881Speter  print("  --with-zlib=DIR")
166251881Speter  print("           tell Subversion to look for ZLib headers and")
167251881Speter  print("           libs in DIR")
168251881Speter  print("")
169251881Speter  print("  --with-jdk=DIR")
170251881Speter  print("           look for the java development kit here")
171251881Speter  print("")
172251881Speter  print("  --with-junit=DIR")
173251881Speter  print("           look for the junit jar here")
174251881Speter  print("           junit is for testing the java bindings")
175251881Speter  print("")
176251881Speter  print("  --with-swig=DIR")
177251881Speter  print("           look for the swig program in DIR")
178362181Sdim  print("  --with-py3c=DIR")
179362181Sdim  print("           look for the py3c library in DIR")
180251881Speter  print("")
181251881Speter  print("  --with-sqlite=DIR")
182251881Speter  print("           look for sqlite in DIR")
183251881Speter  print("")
184251881Speter  print("  --with-sasl=DIR")
185251881Speter  print("           look for the sasl headers and libs in DIR")
186251881Speter  print("")
187251881Speter  print("  --enable-pool-debug")
188251881Speter  print("           turn on APR pool debugging")
189251881Speter  print("")
190251881Speter  print("  --enable-purify")
191251881Speter  print("           add support for Purify instrumentation;")
192251881Speter  print("           implies --enable-pool-debug")
193251881Speter  print("")
194251881Speter  print("  --enable-quantify")
195251881Speter  print("           add support for Quantify instrumentation")
196251881Speter  print("")
197251881Speter  print("  --enable-nls")
198251881Speter  print("           add support for gettext localization")
199251881Speter  print("")
200251881Speter  print("  --disable-shared")
201251881Speter  print("           only build static libraries")
202251881Speter  print("")
203251881Speter  print("  --with-static-apr")
204251881Speter  print("           Use static apr and apr-util")
205251881Speter  print("")
206251881Speter  print("  --with-static-openssl")
207251881Speter  print("           Use static openssl")
208251881Speter  print("")
209251881Speter  print("  --vsnet-version=VER")
210362181Sdim  print("           generate for VS.NET version VER (2005-2017 or 9.0-15.0)")
211362181Sdim  print("           [implies '-t vcproj']")
212251881Speter  print("")
213289180Speter  print(" -D NAME[=value]")
214289180Speter  print("           define NAME macro during compilation")
215289180Speter  print("           [only valid in combination with '-t vcproj']")
216289180Speter  print("")
217251881Speter  print("  --with-apr_memcache=DIR")
218251881Speter  print("           the apr_memcache sources are in DIR")
219251881Speter  sys.exit(1)
220251881Speter
221251881Speter
222251881Speterclass Options:
223251881Speter  def __init__(self):
224251881Speter    self.list = []
225251881Speter    self.dict = {}
226251881Speter
227289180Speter  def add(self, opt, val, overwrite=True):
228251881Speter    if opt in self.dict:
229289180Speter      if overwrite:
230289180Speter        self.list[self.dict[opt]] = (opt, val)
231251881Speter    else:
232251881Speter      self.dict[opt] = len(self.list)
233251881Speter      self.list.append((opt, val))
234251881Speter
235251881Speterif __name__ == '__main__':
236251881Speter  try:
237289180Speter    opts, args = my_getopt(sys.argv[1:], 'st:D:',
238251881Speter                           ['debug',
239251881Speter                            'release',
240251881Speter                            'reload',
241251881Speter                            'assume-shared-libs',
242251881Speter                            'with-apr=',
243251881Speter                            'with-apr-util=',
244251881Speter                            'with-apr-iconv=',
245251881Speter                            'with-berkeley-db=',
246251881Speter                            'with-serf=',
247251881Speter                            'with-httpd=',
248251881Speter                            'with-libintl=',
249251881Speter                            'with-openssl=',
250251881Speter                            'with-zlib=',
251251881Speter                            'with-jdk=',
252251881Speter                            'with-junit=',
253251881Speter                            'with-swig=',
254362181Sdim                            'with-py3c=',
255251881Speter                            'with-sqlite=',
256251881Speter                            'with-sasl=',
257251881Speter                            'with-apr_memcache=',
258251881Speter                            'with-static-apr',
259251881Speter                            'with-static-openssl',
260251881Speter                            'enable-pool-debug',
261251881Speter                            'enable-purify',
262251881Speter                            'enable-quantify',
263251881Speter                            'enable-nls',
264251881Speter                            'disable-shared',
265251881Speter                            'installed-libs=',
266251881Speter                            'vsnet-version=',
267251881Speter                            ])
268251881Speter    if len(args) > 1:
269251881Speter      _usage_exit("Too many arguments")
270289180Speter  except getopt.GetoptError:
271289180Speter    typ, val, tb = sys.exc_info()
272289180Speter    msg = ''.join(traceback.format_exception_only(typ, val))
273289180Speter    _usage_exit(msg)
274251881Speter
275251881Speter  conf = 'build.conf'
276251881Speter  skip = 0
277251881Speter  gentype = 'make'
278251881Speter  rest = Options()
279251881Speter
280251881Speter  if args:
281251881Speter    conf = args[0]
282251881Speter
283251881Speter  # First merge options with previously saved to gen-make.opts if --reload
284251881Speter  # options used
285251881Speter  for opt, val in opts:
286251881Speter    if opt == '--reload':
287251881Speter      prev_conf = configparser.ConfigParser()
288251881Speter      prev_conf.read('gen-make.opts')
289251881Speter      for opt, val in prev_conf.items('options'):
290251881Speter        if opt != '--debug':
291251881Speter          rest.add(opt, val)
292251881Speter      del prev_conf
293251881Speter    elif opt == '--with-neon' or opt == '--without-neon':
294251881Speter      # Provide a warning that we ignored these arguments
295251881Speter      print("Ignoring no longer supported argument '%s'" % opt)
296251881Speter    else:
297251881Speter      rest.add(opt, val)
298251881Speter
299251881Speter  # Parse options list
300251881Speter  for opt, val in rest.list:
301251881Speter    if opt == '-s':
302251881Speter      skip = 1
303251881Speter    elif opt == '-t':
304251881Speter      gentype = val
305362181Sdim    elif opt == '--vsnet-version':
306362181Sdim      gentype = 'vcproj'
307251881Speter    else:
308251881Speter      if opt == '--with-httpd':
309289180Speter        rest.add('--with-apr', os.path.join(val, 'srclib', 'apr'),
310289180Speter                 overwrite=False)
311289180Speter        rest.add('--with-apr-util', os.path.join(val, 'srclib', 'apr-util'),
312289180Speter                 overwrite=False)
313289180Speter        rest.add('--with-apr-iconv', os.path.join(val, 'srclib', 'apr-iconv'),
314289180Speter                 overwrite=False)
315251881Speter
316251881Speter  # Remember all options so that --reload and other scripts can use them
317251881Speter  opt_conf = open('gen-make.opts', 'w')
318251881Speter  opt_conf.write('[options]\n')
319251881Speter  for opt, val in rest.list:
320251881Speter    opt_conf.write(opt + ' = ' + val + '\n')
321251881Speter  opt_conf.close()
322251881Speter
323251881Speter  if gentype not in gen_modules.keys():
324251881Speter    _usage_exit("Unknown module type '%s'" % (gentype))
325251881Speter
326251881Speter  main(conf, gentype, skip_depends=skip, other_options=rest.list)
327251881Speter
328251881Speter
329251881Speter### End of file.
330