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
12 # http://www.apache.org/licenses/LICENSE-2.0
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
23 # gen-make.py -- generate makefiles for building Subversion
33 my_getopt = getopt.gnu_getopt
34 except AttributeError:
35 my_getopt = getopt.getopt
41 import ConfigParser as configparser
43 # for the generator modules
44 sys.path.insert(0, os.path.join('build', 'generator'))
47 sys.path.insert(1, 'build')
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'),
55 def main(fname, gentype, verfname=None,
56 skip_depends=0, other_options=None):
58 verfname = os.path.join('subversion', 'include', 'svn_version.h')
60 gen_module = __import__(gen_modules[gentype][0])
62 generator = gen_module.Generator(fname, verfname, other_options)
65 generator.compute_hdr_deps()
68 generator.write_sqlite_headers()
69 generator.write_errno_table()
70 generator.write_config_keys()
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))
80 gen_keys = sorted(generator.__dict__.keys())
82 value = generator.__dict__[name]
83 if isinstance(value, list):
86 print(" " + _objinfo(i))
91 if isinstance(o, str):
94 t = o.__class__.__name__
95 n = getattr(o, 'name', '-')
96 f = getattr(o, 'filename', '-')
97 return "%s: %s %s" % (t,n,f)
100 def _usage_exit(err=None):
101 "print ERR (if any), print usage, then exit the script"
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))
115 print(" The default generator type is 'make'")
117 print(" Makefile-specific options:")
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. ***")
127 print(" UNIX-specific options:")
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)")
134 print(" Windows-specific options:")
136 print(" --with-apr=DIR")
137 print(" the APR sources are in DIR")
139 print(" --with-apr-util=DIR")
140 print(" the APR-Util sources are in DIR")
142 print(" --with-apr-iconv=DIR")
143 print(" the APR-Iconv sources are in DIR")
145 print(" --with-berkeley-db=DIR")
146 print(" look for Berkeley DB headers and libs in")
149 print(" --with-serf=DIR")
150 print(" the Serf sources are in DIR")
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")
158 print(" --with-libintl=DIR")
159 print(" look for GNU libintl headers and libs in DIR;")
160 print(" implies --enable-nls")
162 print(" --with-openssl=DIR")
163 print(" tell serf to look for OpenSSL headers")
164 print(" and libs in DIR")
166 print(" --with-zlib=DIR")
167 print(" tell Subversion to look for ZLib headers and")
168 print(" libs in DIR")
170 print(" --with-jdk=DIR")
171 print(" look for the java development kit here")
173 print(" --with-junit=DIR")
174 print(" look for the junit jar here")
175 print(" junit is for testing the java bindings")
177 print(" --with-swig=DIR")
178 print(" look for the swig program in DIR")
180 print(" --with-sqlite=DIR")
181 print(" look for sqlite in DIR")
183 print(" --with-sasl=DIR")
184 print(" look for the sasl headers and libs in DIR")
186 print(" --enable-pool-debug")
187 print(" turn on APR pool debugging")
189 print(" --enable-purify")
190 print(" add support for Purify instrumentation;")
191 print(" implies --enable-pool-debug")
193 print(" --enable-quantify")
194 print(" add support for Quantify instrumentation")
196 print(" --enable-nls")
197 print(" add support for gettext localization")
199 print(" --disable-shared")
200 print(" only build static libraries")
202 print(" --with-static-apr")
203 print(" Use static apr and apr-util")
205 print(" --with-static-openssl")
206 print(" Use static openssl")
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']")
212 print(" -D NAME[=value]")
213 print(" define NAME macro during compilation")
214 print(" [only valid in combination with '-t vcproj']")
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")
228 def add(self, opt, val, overwrite=True):
231 self.list[self.dict[opt]] = (opt, val)
233 self.dict[opt] = len(self.list)
234 self.list.append((opt, val))
236 if __name__ == '__main__':
238 opts, args = my_getopt(sys.argv[1:], 'st:D:',
242 'assume-shared-libs',
257 'with-apr_memcache=',
259 'with-static-openssl',
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))
284 # First merge options with previously saved to gen-make.opts if --reload
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'):
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)
301 for opt, val in rest.list:
306 elif opt == '--vsnet-version':
309 if opt == '--with-httpd':
310 rest.add('--with-apr', os.path.join(val, 'srclib', 'apr'),
312 rest.add('--with-apr-util', os.path.join(val, 'srclib', 'apr-util'),
314 rest.add('--with-apr-iconv', os.path.join(val, 'srclib', 'apr-iconv'),
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')
324 if gentype not in gen_modules.keys():
325 _usage_exit("Unknown module type '%s'" % (gentype))
327 main(conf, gentype, skip_depends=skip, other_options=rest.list)