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