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
28251881Speterimport sys
29251881Speterimport getopt
30251881Spetertry:
31251881Speter  my_getopt = getopt.gnu_getopt
32251881Speterexcept AttributeError:
33251881Speter  my_getopt = getopt.getopt
34251881Spetertry:
35251881Speter  # Python >=3.0
36251881Speter  import configparser
37251881Speterexcept ImportError:
38251881Speter  # Python <3.0
39251881Speter  import ConfigParser as configparser
40251881Speter
41251881Speter# for the generator modules
42251881Spetersys.path.insert(0, os.path.join('build', 'generator'))
43251881Speter
44251881Speter# for getversion
45251881Spetersys.path.insert(1, 'build')
46251881Speter
47251881Spetergen_modules = {
48251881Speter  'make' : ('gen_make', 'Makefiles for POSIX systems'),
49251881Speter  'dsp' : ('gen_msvc_dsp', 'MSVC 6.x project files'),
50251881Speter  'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'),
51251881Speter  }
52251881Speter
53251881Speterdef main(fname, gentype, verfname=None,
54251881Speter         skip_depends=0, other_options=None):
55251881Speter  if verfname is None:
56251881Speter    verfname = os.path.join('subversion', 'include', 'svn_version.h')
57251881Speter
58251881Speter  gen_module = __import__(gen_modules[gentype][0])
59251881Speter
60251881Speter  generator = gen_module.Generator(fname, verfname, other_options)
61251881Speter
62251881Speter  if not skip_depends:
63251881Speter    generator.compute_hdr_deps()
64251881Speter
65251881Speter  generator.write()
66251881Speter  generator.write_sqlite_headers()
67251881Speter
68251881Speter  if ('--debug', '') in other_options:
69251881Speter    for dep_type, target_dict in generator.graph.deps.items():
70251881Speter      sorted_targets = list(target_dict.keys()); sorted_targets.sort()
71251881Speter      for target in sorted_targets:
72251881Speter        print(dep_type + ": " + _objinfo(target))
73251881Speter        for source in target_dict[target]:
74251881Speter          print("  " + _objinfo(source))
75251881Speter      print("=" * 72)
76251881Speter    gen_keys = sorted(generator.__dict__.keys())
77251881Speter    for name in gen_keys:
78251881Speter      value = generator.__dict__[name]
79251881Speter      if isinstance(value, list):
80251881Speter        print(name + ": ")
81251881Speter        for i in value:
82251881Speter          print("  " + _objinfo(i))
83251881Speter        print("=" * 72)
84251881Speter
85251881Speter
86251881Speterdef _objinfo(o):
87251881Speter  if isinstance(o, str):
88251881Speter    return repr(o)
89251881Speter  else:
90251881Speter    t = o.__class__.__name__
91251881Speter    n = getattr(o, 'name', '-')
92251881Speter    f = getattr(o, 'filename', '-')
93251881Speter    return "%s: %s %s" % (t,n,f)
94251881Speter
95251881Speter
96251881Speterdef _usage_exit(err=None):
97251881Speter  "print ERR (if any), print usage, then exit the script"
98251881Speter  if err:
99251881Speter    print("ERROR: %s\n" % (err))
100251881Speter  print("USAGE:  gen-make.py [options...] [conf-file]")
101251881Speter  print("  -s        skip dependency generation")
102251881Speter  print("  --debug   print lots of stuff only developers care about")
103251881Speter  print("  --release release mode")
104251881Speter  print("  --reload  reuse all options from the previous invocation")
105251881Speter  print("            of the script, except -s, -t, --debug and --reload")
106251881Speter  print("  -t TYPE   use the TYPE generator; can be one of:")
107251881Speter  items = sorted(gen_modules.items())
108251881Speter  for name, (module, desc) in items:
109251881Speter    print('            %-12s  %s' % (name, desc))
110251881Speter  print("")
111251881Speter  print("            The default generator type is 'make'")
112251881Speter  print("")
113251881Speter  print("  Makefile-specific options:")
114251881Speter  print("")
115251881Speter  print("  --assume-shared-libs")
116251881Speter  print("           omit dependencies on libraries, on the assumption that")
117251881Speter  print("           shared libraries will be built, so that it is unnecessary")
118251881Speter  print("           to relink executables when the libraries that they depend")
119251881Speter  print("           on change.  This is an option for developers who want to")
120251881Speter  print("           increase the speed of frequent rebuilds.")
121251881Speter  print("           *** Do not use unless you understand the consequences. ***")
122251881Speter  print("")
123251881Speter  print("  UNIX-specific options:")
124251881Speter  print("")
125251881Speter  print("  --installed-libs")
126251881Speter  print("           Comma-separated list of Subversion libraries to find")
127251881Speter  print("           pre-installed instead of building (probably only")
128251881Speter  print("           useful for packagers)")
129251881Speter  print("")
130251881Speter  print("  Windows-specific options:")
131251881Speter  print("")
132251881Speter  print("  --with-apr=DIR")
133251881Speter  print("           the APR sources are in DIR")
134251881Speter  print("")
135251881Speter  print("  --with-apr-util=DIR")
136251881Speter  print("           the APR-Util sources are in DIR")
137251881Speter  print("")
138251881Speter  print("  --with-apr-iconv=DIR")
139251881Speter  print("           the APR-Iconv sources are in DIR")
140251881Speter  print("")
141251881Speter  print("  --with-berkeley-db=DIR")
142251881Speter  print("           look for Berkeley DB headers and libs in")
143251881Speter  print("           DIR")
144251881Speter  print("")
145251881Speter  print("  --with-serf=DIR")
146251881Speter  print("           the Serf sources are in DIR")
147251881Speter  print("")
148251881Speter  print("  --with-httpd=DIR")
149251881Speter  print("           the httpd sources and binaries required")
150251881Speter  print("           for building mod_dav_svn are in DIR;")
151251881Speter  print("           implies --with-apr{-util, -iconv}, but")
152251881Speter  print("           you can override them")
153251881Speter  print("")
154251881Speter  print("  --with-libintl=DIR")
155251881Speter  print("           look for GNU libintl headers and libs in DIR;")
156251881Speter  print("           implies --enable-nls")
157251881Speter  print("")
158251881Speter  print("  --with-openssl=DIR")
159251881Speter  print("           tell serf to look for OpenSSL headers")
160251881Speter  print("           and libs in DIR")
161251881Speter  print("")
162251881Speter  print("  --with-zlib=DIR")
163251881Speter  print("           tell Subversion to look for ZLib headers and")
164251881Speter  print("           libs in DIR")
165251881Speter  print("")
166251881Speter  print("  --with-jdk=DIR")
167251881Speter  print("           look for the java development kit here")
168251881Speter  print("")
169251881Speter  print("  --with-junit=DIR")
170251881Speter  print("           look for the junit jar here")
171251881Speter  print("           junit is for testing the java bindings")
172251881Speter  print("")
173251881Speter  print("  --with-swig=DIR")
174251881Speter  print("           look for the swig program in DIR")
175251881Speter  print("")
176251881Speter  print("  --with-sqlite=DIR")
177251881Speter  print("           look for sqlite in DIR")
178251881Speter  print("")
179251881Speter  print("  --with-sasl=DIR")
180251881Speter  print("           look for the sasl headers and libs in DIR")
181251881Speter  print("")
182251881Speter  print("  --enable-pool-debug")
183251881Speter  print("           turn on APR pool debugging")
184251881Speter  print("")
185251881Speter  print("  --enable-purify")
186251881Speter  print("           add support for Purify instrumentation;")
187251881Speter  print("           implies --enable-pool-debug")
188251881Speter  print("")
189251881Speter  print("  --enable-quantify")
190251881Speter  print("           add support for Quantify instrumentation")
191251881Speter  print("")
192251881Speter  print("  --enable-nls")
193251881Speter  print("           add support for gettext localization")
194251881Speter  print("")
195251881Speter  print("  --enable-bdb-in-apr-util")
196251881Speter  print("           configure APR-Util to use Berkeley DB")
197251881Speter  print("")
198251881Speter  print("  --enable-ml")
199251881Speter  print("           enable use of ML assembler with zlib")
200251881Speter  print("")
201251881Speter  print("  --disable-shared")
202251881Speter  print("           only build static libraries")
203251881Speter  print("")
204251881Speter  print("  --with-static-apr")
205251881Speter  print("           Use static apr and apr-util")
206251881Speter  print("")
207251881Speter  print("  --with-static-openssl")
208251881Speter  print("           Use static openssl")
209251881Speter  print("")
210251881Speter  print("  --vsnet-version=VER")
211251881Speter  print("           generate for VS.NET version VER (2002, 2003, 2005, 2008, 2010 or 2012)")
212251881Speter  print("           [only valid in combination with '-t vcproj']")
213251881Speter  print("")
214251881Speter  print("  --with-apr_memcache=DIR")
215251881Speter  print("           the apr_memcache sources are in DIR")
216251881Speter  sys.exit(1)
217251881Speter
218251881Speter
219251881Speterclass Options:
220251881Speter  def __init__(self):
221251881Speter    self.list = []
222251881Speter    self.dict = {}
223251881Speter
224251881Speter  def add(self, opt, val):
225251881Speter    if opt in self.dict:
226251881Speter      self.list[self.dict[opt]] = (opt, val)
227251881Speter    else:
228251881Speter      self.dict[opt] = len(self.list)
229251881Speter      self.list.append((opt, val))
230251881Speter
231251881Speterif __name__ == '__main__':
232251881Speter  try:
233251881Speter    opts, args = my_getopt(sys.argv[1:], 'st:',
234251881Speter                           ['debug',
235251881Speter                            'release',
236251881Speter                            'reload',
237251881Speter                            'assume-shared-libs',
238251881Speter                            'with-apr=',
239251881Speter                            'with-apr-util=',
240251881Speter                            'with-apr-iconv=',
241251881Speter                            'with-berkeley-db=',
242251881Speter                            'with-serf=',
243251881Speter                            'with-httpd=',
244251881Speter                            'with-libintl=',
245251881Speter                            'with-openssl=',
246251881Speter                            'with-zlib=',
247251881Speter                            'with-jdk=',
248251881Speter                            'with-junit=',
249251881Speter                            'with-swig=',
250251881Speter                            'with-sqlite=',
251251881Speter                            'with-sasl=',
252251881Speter                            'with-apr_memcache=',
253251881Speter                            'with-static-apr',
254251881Speter                            'with-static-openssl',
255251881Speter                            'enable-pool-debug',
256251881Speter                            'enable-purify',
257251881Speter                            'enable-quantify',
258251881Speter                            'enable-nls',
259251881Speter                            'enable-bdb-in-apr-util',
260251881Speter                            'enable-ml',
261251881Speter                            'disable-shared',
262251881Speter                            'installed-libs=',
263251881Speter                            'vsnet-version=',
264251881Speter
265251881Speter                            # Keep distributions that help by adding a path
266251881Speter                            # working. On unix this would be filtered by
267251881Speter                            # configure, but on Windows gen-make.py is used
268251881Speter                            # directly.
269251881Speter                            'with-neon=',
270251881Speter                            'without-neon',
271251881Speter                            ])
272251881Speter    if len(args) > 1:
273251881Speter      _usage_exit("Too many arguments")
274251881Speter  except getopt.GetoptError, e:
275251881Speter    _usage_exit(str(e))
276251881Speter
277251881Speter  conf = 'build.conf'
278251881Speter  skip = 0
279251881Speter  gentype = 'make'
280251881Speter  rest = Options()
281251881Speter
282251881Speter  if args:
283251881Speter    conf = args[0]
284251881Speter
285251881Speter  # First merge options with previously saved to gen-make.opts if --reload
286251881Speter  # options used
287251881Speter  for opt, val in opts:
288251881Speter    if opt == '--reload':
289251881Speter      prev_conf = configparser.ConfigParser()
290251881Speter      prev_conf.read('gen-make.opts')
291251881Speter      for opt, val in prev_conf.items('options'):
292251881Speter        if opt != '--debug':
293251881Speter          rest.add(opt, val)
294251881Speter      del prev_conf
295251881Speter    elif opt == '--with-neon' or opt == '--without-neon':
296251881Speter      # Provide a warning that we ignored these arguments
297251881Speter      print("Ignoring no longer supported argument '%s'" % opt)
298251881Speter    else:
299251881Speter      rest.add(opt, val)
300251881Speter
301251881Speter  # Parse options list
302251881Speter  for opt, val in rest.list:
303251881Speter    if opt == '-s':
304251881Speter      skip = 1
305251881Speter    elif opt == '-t':
306251881Speter      gentype = val
307251881Speter    else:
308251881Speter      if opt == '--with-httpd':
309251881Speter        rest.add('--with-apr', os.path.join(val, 'srclib', 'apr'))
310251881Speter        rest.add('--with-apr-util', os.path.join(val, 'srclib', 'apr-util'))
311251881Speter        rest.add('--with-apr-iconv', os.path.join(val, 'srclib', 'apr-iconv'))
312251881Speter
313251881Speter  # Remember all options so that --reload and other scripts can use them
314251881Speter  opt_conf = open('gen-make.opts', 'w')
315251881Speter  opt_conf.write('[options]\n')
316251881Speter  for opt, val in rest.list:
317251881Speter    opt_conf.write(opt + ' = ' + val + '\n')
318251881Speter  opt_conf.close()
319251881Speter
320251881Speter  if gentype not in gen_modules.keys():
321251881Speter    _usage_exit("Unknown module type '%s'" % (gentype))
322251881Speter
323251881Speter  main(conf, gentype, skip_depends=skip, other_options=rest.list)
324251881Speter
325251881Speter
326251881Speter### End of file.
327