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 'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'),
54 def main(fname
, gentype
, verfname
=None,
55 skip_depends
=0, other_options
=None):
57 verfname
= os
.path
.join('subversion', 'include', 'svn_version.h')
59 gen_module
= __import__(gen_modules
[gentype
][0])
61 generator
= gen_module
.Generator(fname
, verfname
, other_options
)
64 generator
.compute_hdr_deps()
67 generator
.write_sqlite_headers()
68 generator
.write_errno_table()
69 generator
.write_config_keys()
71 if ('--debug', '') in other_options
:
72 for dep_type
, target_dict
in generator
.graph
.deps
.items():
73 sorted_targets
= list(target_dict
.keys()); sorted_targets
.sort()
74 for target
in sorted_targets
:
75 print(dep_type
+ ": " + _objinfo(target
))
76 for source
in target_dict
[target
]:
77 print(" " + _objinfo(source
))
79 gen_keys
= sorted(generator
.__dict
__.keys())
81 value
= generator
.__dict
__[name
]
82 if isinstance(value
, list):
85 print(" " + _objinfo(i
))
90 if isinstance(o
, str):
93 t
= o
.__class
__.__name
__
94 n
= getattr(o
, 'name', '-')
95 f
= getattr(o
, 'filename', '-')
96 return "%s: %s %s" % (t
,n
,f
)
99 def _usage_exit(err
=None):
100 "print ERR (if any), print usage, then exit the script"
102 print("ERROR: %s\n" % (err
))
103 print("USAGE: gen-make.py [options...] [conf-file]")
104 print(" -s skip dependency generation")
105 print(" --debug print lots of stuff only developers care about")
106 print(" --release release mode")
107 print(" --reload reuse all options from the previous invocation")
108 print(" of the script, except -s, -t, --debug and --reload")
109 print(" -t TYPE use the TYPE generator; can be one of:")
110 items
= sorted(gen_modules
.items())
111 for name
, (module
, desc
) in items
:
112 print(' %-12s %s' % (name
, desc
))
114 print(" The default generator type is 'make'")
116 print(" Makefile-specific options:")
118 print(" --assume-shared-libs")
119 print(" omit dependencies on libraries, on the assumption that")
120 print(" shared libraries will be built, so that it is unnecessary")
121 print(" to relink executables when the libraries that they depend")
122 print(" on change. This is an option for developers who want to")
123 print(" increase the speed of frequent rebuilds.")
124 print(" *** Do not use unless you understand the consequences. ***")
126 print(" UNIX-specific options:")
128 print(" --installed-libs")
129 print(" Comma-separated list of Subversion libraries to find")
130 print(" pre-installed instead of building (probably only")
131 print(" useful for packagers)")
133 print(" Windows-specific options:")
135 print(" --with-apr=DIR")
136 print(" the APR sources are in DIR")
138 print(" --with-apr-util=DIR")
139 print(" the APR-Util sources are in DIR")
141 print(" --with-apr-iconv=DIR")
142 print(" the APR-Iconv sources are in DIR")
144 print(" --with-berkeley-db=DIR")
145 print(" look for Berkeley DB headers and libs in")
148 print(" --with-serf=DIR")
149 print(" the Serf sources are in DIR")
151 print(" --with-httpd=DIR")
152 print(" the httpd sources and binaries required")
153 print(" for building mod_dav_svn are in DIR;")
154 print(" implies --with-apr{-util, -iconv}, but")
155 print(" you can override them")
157 print(" --with-libintl=DIR")
158 print(" look for GNU libintl headers and libs in DIR;")
159 print(" implies --enable-nls")
161 print(" --with-openssl=DIR")
162 print(" tell serf to look for OpenSSL headers")
163 print(" and libs in DIR")
165 print(" --with-zlib=DIR")
166 print(" tell Subversion to look for ZLib headers and")
167 print(" libs in DIR")
169 print(" --with-jdk=DIR")
170 print(" look for the java development kit here")
172 print(" --with-junit=DIR")
173 print(" look for the junit jar here")
174 print(" junit is for testing the java bindings")
176 print(" --with-swig=DIR")
177 print(" look for the swig program in DIR")
179 print(" --with-sqlite=DIR")
180 print(" look for sqlite in DIR")
182 print(" --with-sasl=DIR")
183 print(" look for the sasl headers and libs in DIR")
185 print(" --enable-pool-debug")
186 print(" turn on APR pool debugging")
188 print(" --enable-purify")
189 print(" add support for Purify instrumentation;")
190 print(" implies --enable-pool-debug")
192 print(" --enable-quantify")
193 print(" add support for Quantify instrumentation")
195 print(" --enable-nls")
196 print(" add support for gettext localization")
198 print(" --disable-shared")
199 print(" only build static libraries")
201 print(" --with-static-apr")
202 print(" Use static apr and apr-util")
204 print(" --with-static-openssl")
205 print(" Use static openssl")
207 print(" --vsnet-version=VER")
208 print(" generate for VS.NET version VER (2005-2017 or 9.0-15.0)")
209 print(" [implies '-t vcproj']")
211 print(" -D NAME[=value]")
212 print(" define NAME macro during compilation")
213 print(" [only valid in combination with '-t vcproj']")
215 print(" --with-apr_memcache=DIR")
216 print(" the apr_memcache sources are in DIR")
225 def add(self
, opt
, val
, overwrite
=True):
228 self
.list[self
.dict[opt
]] = (opt
, val
)
230 self
.dict[opt
] = len(self
.list)
231 self
.list.append((opt
, val
))
233 if __name__
== '__main__':
235 opts
, args
= my_getopt(sys
.argv
[1:], 'st:D:',
239 'assume-shared-libs',
254 'with-apr_memcache=',
256 'with-static-openssl',
266 _usage_exit("Too many arguments")
267 except getopt
.GetoptError
:
268 typ
, val
, tb
= sys
.exc_info()
269 msg
= ''.join(traceback
.format_exception_only(typ
, val
))
280 # First merge options with previously saved to gen-make.opts if --reload
282 for opt
, val
in opts
:
283 if opt
== '--reload':
284 prev_conf
= configparser
.ConfigParser()
285 prev_conf
.read('gen-make.opts')
286 for opt
, val
in prev_conf
.items('options'):
290 elif opt
== '--with-neon' or opt
== '--without-neon':
291 # Provide a warning that we ignored these arguments
292 print("Ignoring no longer supported argument '%s'" % opt
)
297 for opt
, val
in rest
.list:
302 elif opt
== '--vsnet-version':
305 if opt
== '--with-httpd':
306 rest
.add('--with-apr', os
.path
.join(val
, 'srclib', 'apr'),
308 rest
.add('--with-apr-util', os
.path
.join(val
, 'srclib', 'apr-util'),
310 rest
.add('--with-apr-iconv', os
.path
.join(val
, 'srclib', 'apr-iconv'),
313 # Remember all options so that --reload and other scripts can use them
314 opt_conf
= open('gen-make.opts', 'w')
315 opt_conf
.write('[options]\n')
316 for opt
, val
in rest
.list:
317 opt_conf
.write(opt
+ ' = ' + val
+ '\n')
320 if gentype
not in gen_modules
.keys():
321 _usage_exit("Unknown module type '%s'" % (gentype
))
323 main(conf
, gentype
, skip_depends
=skip
, other_options
=rest
.list)