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