|  | #!/usr/bin/env python | 
|  | # | 
|  | # | 
|  | # Licensed to the Apache Software Foundation (ASF) under one | 
|  | # or more contributor license agreements.  See the NOTICE file | 
|  | # distributed with this work for additional information | 
|  | # regarding copyright ownership.  The ASF licenses this file | 
|  | # to you under the Apache License, Version 2.0 (the | 
|  | # "License"); you may not use this file except in compliance | 
|  | # with the License.  You may obtain a copy of the License at | 
|  | # | 
|  | #   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, | 
|  | # software distributed under the License is distributed on an | 
|  | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | # KIND, either express or implied.  See the License for the | 
|  | # specific language governing permissions and limitations | 
|  | # under the License. | 
|  | # | 
|  | # | 
|  | # | 
|  | # gen-make.py -- generate makefiles for building Subversion | 
|  | # | 
|  |  | 
|  |  | 
|  | import os | 
|  | import sys | 
|  | import getopt | 
|  | try: | 
|  | my_getopt = getopt.gnu_getopt | 
|  | except AttributeError: | 
|  | my_getopt = getopt.getopt | 
|  | try: | 
|  | # Python >=3.0 | 
|  | import configparser | 
|  | except ImportError: | 
|  | # Python <3.0 | 
|  | import ConfigParser as configparser | 
|  |  | 
|  | # for the generator modules | 
|  | sys.path.insert(0, os.path.join('build', 'generator')) | 
|  |  | 
|  | # for getversion | 
|  | sys.path.insert(1, 'build') | 
|  |  | 
|  | gen_modules = { | 
|  | 'make' : ('gen_make', 'Makefiles for POSIX systems'), | 
|  | 'dsp' : ('gen_msvc_dsp', 'MSVC 6.x project files'), | 
|  | 'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'), | 
|  | } | 
|  |  | 
|  | def main(fname, gentype, verfname=None, | 
|  | skip_depends=0, other_options=None): | 
|  | if verfname is None: | 
|  | verfname = os.path.join('subversion', 'include', 'svn_version.h') | 
|  |  | 
|  | gen_module = __import__(gen_modules[gentype][0]) | 
|  |  | 
|  | generator = gen_module.Generator(fname, verfname, other_options) | 
|  |  | 
|  | if not skip_depends: | 
|  | generator.compute_hdr_deps() | 
|  |  | 
|  | generator.write() | 
|  | generator.write_sqlite_headers() | 
|  |  | 
|  | if ('--debug', '') in other_options: | 
|  | for dep_type, target_dict in generator.graph.deps.items(): | 
|  | sorted_targets = list(target_dict.keys()); sorted_targets.sort() | 
|  | for target in sorted_targets: | 
|  | print(dep_type + ": " + _objinfo(target)) | 
|  | for source in target_dict[target]: | 
|  | print("  " + _objinfo(source)) | 
|  | print("=" * 72) | 
|  | gen_keys = sorted(generator.__dict__.keys()) | 
|  | for name in gen_keys: | 
|  | value = generator.__dict__[name] | 
|  | if isinstance(value, list): | 
|  | print(name + ": ") | 
|  | for i in value: | 
|  | print("  " + _objinfo(i)) | 
|  | print("=" * 72) | 
|  |  | 
|  |  | 
|  | def _objinfo(o): | 
|  | if isinstance(o, str): | 
|  | return repr(o) | 
|  | else: | 
|  | t = o.__class__.__name__ | 
|  | n = getattr(o, 'name', '-') | 
|  | f = getattr(o, 'filename', '-') | 
|  | return "%s: %s %s" % (t,n,f) | 
|  |  | 
|  |  | 
|  | def _usage_exit(err=None): | 
|  | "print ERR (if any), print usage, then exit the script" | 
|  | if err: | 
|  | print("ERROR: %s\n" % (err)) | 
|  | print("USAGE:  gen-make.py [options...] [conf-file]") | 
|  | print("  -s        skip dependency generation") | 
|  | print("  --debug   print lots of stuff only developers care about") | 
|  | print("  --release release mode") | 
|  | print("  --reload  reuse all options from the previous invocation") | 
|  | print("            of the script, except -s, -t, --debug and --reload") | 
|  | print("  -t TYPE   use the TYPE generator; can be one of:") | 
|  | items = sorted(gen_modules.items()) | 
|  | for name, (module, desc) in items: | 
|  | print('            %-12s  %s' % (name, desc)) | 
|  | print("") | 
|  | print("            The default generator type is 'make'") | 
|  | print("") | 
|  | print("  Makefile-specific options:") | 
|  | print("") | 
|  | print("  --assume-shared-libs") | 
|  | print("           omit dependencies on libraries, on the assumption that") | 
|  | print("           shared libraries will be built, so that it is unnecessary") | 
|  | print("           to relink executables when the libraries that they depend") | 
|  | print("           on change.  This is an option for developers who want to") | 
|  | print("           increase the speed of frequent rebuilds.") | 
|  | print("           *** Do not use unless you understand the consequences. ***") | 
|  | print("") | 
|  | print("  UNIX-specific options:") | 
|  | print("") | 
|  | print("  --installed-libs") | 
|  | print("           Comma-separated list of Subversion libraries to find") | 
|  | print("           pre-installed instead of building (probably only") | 
|  | print("           useful for packagers)") | 
|  | print("") | 
|  | print("  Windows-specific options:") | 
|  | print("") | 
|  | print("  --with-apr=DIR") | 
|  | print("           the APR sources are in DIR") | 
|  | print("") | 
|  | print("  --with-apr-util=DIR") | 
|  | print("           the APR-Util sources are in DIR") | 
|  | print("") | 
|  | print("  --with-apr-iconv=DIR") | 
|  | print("           the APR-Iconv sources are in DIR") | 
|  | print("") | 
|  | print("  --with-berkeley-db=DIR") | 
|  | print("           look for Berkeley DB headers and libs in") | 
|  | print("           DIR") | 
|  | print("") | 
|  | print("  --with-neon=DIR") | 
|  | print("           the Neon sources are in DIR") | 
|  | print("") | 
|  | print("  --without-neon") | 
|  | print("           Don't build Neon sources (if present)") | 
|  | print("") | 
|  | print("  --with-serf=DIR") | 
|  | print("           the Serf sources are in DIR") | 
|  | print("") | 
|  | print("  --with-httpd=DIR") | 
|  | print("           the httpd sources and binaries required") | 
|  | print("           for building mod_dav_svn are in DIR;") | 
|  | print("           implies --with-apr{-util, -iconv}, but") | 
|  | print("           you can override them") | 
|  | print("") | 
|  | print("  --with-libintl=DIR") | 
|  | print("           look for GNU libintl headers and libs in DIR;") | 
|  | print("           implies --enable-nls") | 
|  | print("") | 
|  | print("  --with-openssl=DIR") | 
|  | print("           tell neon to look for OpenSSL headers") | 
|  | print("           and libs in DIR") | 
|  | print("") | 
|  | print("  --with-zlib=DIR") | 
|  | print("           tell neon to look for ZLib headers and") | 
|  | print("           libs in DIR") | 
|  | print("") | 
|  | print("  --with-jdk=DIR") | 
|  | print("           look for the java development kit here") | 
|  | print("") | 
|  | print("  --with-junit=DIR") | 
|  | print("           look for the junit jar here") | 
|  | print("           junit is for testing the java bindings") | 
|  | print("") | 
|  | print("  --with-swig=DIR") | 
|  | print("           look for the swig program in DIR") | 
|  | print("") | 
|  | print("  --with-sqlite=DIR") | 
|  | print("           look for sqlite in DIR") | 
|  | print("") | 
|  | print("  --with-sasl=DIR") | 
|  | print("           look for the sasl headers and libs in DIR") | 
|  | print("") | 
|  | print("  --enable-pool-debug") | 
|  | print("           turn on APR pool debugging") | 
|  | print("") | 
|  | print("  --enable-purify") | 
|  | print("           add support for Purify instrumentation;") | 
|  | print("           implies --enable-pool-debug") | 
|  | print("") | 
|  | print("  --enable-quantify") | 
|  | print("           add support for Quantify instrumentation") | 
|  | print("") | 
|  | print("  --enable-nls") | 
|  | print("           add support for gettext localization") | 
|  | print("") | 
|  | print("  --enable-bdb-in-apr-util") | 
|  | print("           configure APR-Util to use Berkeley DB") | 
|  | print("") | 
|  | print("  --enable-ml") | 
|  | print("           enable use of ML assembler with zlib") | 
|  | print("") | 
|  | print("  --disable-shared") | 
|  | print("           only build static libraries") | 
|  | print("") | 
|  | print("  --with-static-apr") | 
|  | print("           Use static apr and apr-util") | 
|  | print("") | 
|  | print("  --vsnet-version=VER") | 
|  | print("           generate for VS.NET version VER (2002, 2003, 2005, 2008 or 2010)") | 
|  | print("           [only valid in combination with '-t vcproj']") | 
|  | print("") | 
|  | print("  --with-apr_memcache=DIR") | 
|  | print("           the apr_memcache sources are in DIR") | 
|  | sys.exit(1) | 
|  |  | 
|  |  | 
|  | class Options: | 
|  | def __init__(self): | 
|  | self.list = [] | 
|  | self.dict = {} | 
|  |  | 
|  | def add(self, opt, val): | 
|  | if opt in self.dict: | 
|  | self.list[self.dict[opt]] = (opt, val) | 
|  | else: | 
|  | self.dict[opt] = len(self.list) | 
|  | self.list.append((opt, val)) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | try: | 
|  | opts, args = my_getopt(sys.argv[1:], 'st:', | 
|  | ['debug', | 
|  | 'release', | 
|  | 'reload', | 
|  | 'assume-shared-libs', | 
|  | 'with-apr=', | 
|  | 'with-apr-util=', | 
|  | 'with-apr-iconv=', | 
|  | 'with-berkeley-db=', | 
|  | 'with-neon=', | 
|  | 'without-neon', | 
|  | 'with-serf=', | 
|  | 'with-httpd=', | 
|  | 'with-libintl=', | 
|  | 'with-openssl=', | 
|  | 'with-zlib=', | 
|  | 'with-jdk=', | 
|  | 'with-junit=', | 
|  | 'with-swig=', | 
|  | 'with-sqlite=', | 
|  | 'with-sasl=', | 
|  | 'with-apr_memcache=', | 
|  | 'with-static-apr', | 
|  | 'enable-pool-debug', | 
|  | 'enable-purify', | 
|  | 'enable-quantify', | 
|  | 'enable-nls', | 
|  | 'enable-bdb-in-apr-util', | 
|  | 'enable-ml', | 
|  | 'disable-shared', | 
|  | 'installed-libs=', | 
|  | 'vsnet-version=', | 
|  | ]) | 
|  | if len(args) > 1: | 
|  | _usage_exit("Too many arguments") | 
|  | except getopt.GetoptError, e: | 
|  | _usage_exit(str(e)) | 
|  |  | 
|  | conf = 'build.conf' | 
|  | skip = 0 | 
|  | gentype = 'make' | 
|  | rest = Options() | 
|  |  | 
|  | if args: | 
|  | conf = args[0] | 
|  |  | 
|  | # First merge options with previously saved to gen-make.opts if --reload | 
|  | # options used | 
|  | for opt, val in opts: | 
|  | if opt == '--reload': | 
|  | prev_conf = configparser.ConfigParser() | 
|  | prev_conf.read('gen-make.opts') | 
|  | for opt, val in prev_conf.items('options'): | 
|  | if opt != '--debug': | 
|  | rest.add(opt, val) | 
|  | del prev_conf | 
|  | else: | 
|  | rest.add(opt, val) | 
|  |  | 
|  | # Parse options list | 
|  | for opt, val in rest.list: | 
|  | if opt == '-s': | 
|  | skip = 1 | 
|  | elif opt == '-t': | 
|  | gentype = val | 
|  | else: | 
|  | if opt == '--with-httpd': | 
|  | rest.add('--with-apr', os.path.join(val, 'srclib', 'apr')) | 
|  | rest.add('--with-apr-util', os.path.join(val, 'srclib', 'apr-util')) | 
|  | rest.add('--with-apr-iconv', os.path.join(val, 'srclib', 'apr-iconv')) | 
|  |  | 
|  | # Remember all options so that --reload and other scripts can use them | 
|  | opt_conf = open('gen-make.opts', 'w') | 
|  | opt_conf.write('[options]\n') | 
|  | for opt, val in rest.list: | 
|  | opt_conf.write(opt + ' = ' + val + '\n') | 
|  | opt_conf.close() | 
|  |  | 
|  | if gentype not in gen_modules.keys(): | 
|  | _usage_exit("Unknown module type '%s'" % (gentype)) | 
|  |  | 
|  | main(conf, gentype, skip_depends=skip, other_options=rest.list) | 
|  |  | 
|  |  | 
|  | ### End of file. |