diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
commit | cf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch) | |
tree | da27775a2161723ef342e91af41a8b51fedef405 /build/generator | |
parent | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff) | |
download | subversion-tarball-master.tar.gz |
subversion-1.9.7HEADsubversion-1.9.7master
Diffstat (limited to 'build/generator')
22 files changed, 2154 insertions, 1701 deletions
diff --git a/build/generator/extractor.py b/build/generator/extractor.py index a182911..63921f3 100755 --- a/build/generator/extractor.py +++ b/build/generator/extractor.py @@ -57,13 +57,6 @@ _filter_names = [ 'svn_auth_kwallet_version', 'svn_auth_get_gpg_agent_simple_provider', 'svn_auth_gpg_agent_version', - # -DSVN_FS_INFO: - 'svn_repos_capabilities', - 'svn_repos_info_format', - 'svn_fs_info_format', - 'svn_fs_info_config_files', - 'svn_fs_info', - 'svn_fs_info_dup', ] if __name__ == '__main__': diff --git a/build/generator/gen_base.py b/build/generator/gen_base.py index 19b0dc3..02c8ed2 100644 --- a/build/generator/gen_base.py +++ b/build/generator/gen_base.py @@ -22,6 +22,7 @@ # gen_base.py -- infrastructure for generating makefiles, dependencies, etc. # +import collections import os import sys import glob @@ -75,7 +76,7 @@ class GeneratorBase: # Now read and parse build.conf parser = configparser.ConfigParser() - parser.read(fname) + parser.readfp(open(fname)) self.conf = build_path(os.path.abspath(fname)) @@ -239,6 +240,178 @@ class GeneratorBase: except: pass os.rename(new_hdrfile, hdrfile) + def write_file_if_changed(self, fname, new_contents): + """Rewrite the file if NEW_CONTENTS are different than its current content. + + If you have your windows projects open and generate the projects + it's not a small thing for windows to re-read all projects so + only update those that have changed. + + Under Python >=3, NEW_CONTENTS must be a 'str', not a 'bytes'. + """ + if sys.version_info[0] >= 3: + new_contents = new_contents.encode() + + try: + old_contents = open(fname, 'rb').read() + except IOError: + old_contents = None + if old_contents != new_contents: + open(fname, 'wb').write(new_contents) + print("Wrote: %s" % fname) + + + def write_errno_table(self): + # ### We generate errorcode.inc at autogen.sh time (here!). + # ### + # ### Currently it's only used by maintainer-mode builds. If this + # ### functionality ever moves to release builds, it will have to move + # ### to configure-time (but remember that Python cannot be assumed to + # ### be available from 'configure'). + import errno + + lines = [ + '/* This file was generated by build/generator/gen_base.py */', + '' + ] + + def write_struct(name, codes): + lines.extend([ + 'static struct {', + ' int errcode;', + ' const char *errname;', + '} %s[] = {' % (name,), + ]) + + for num, val in sorted(codes): + lines.extend([ + ' { %d, "%s" },' % (num, val), + ]) + + # Remove ',' for c89 compatibility + lines[-1] = lines[-1][0:-1] + + lines.extend([ + '};', + '', + ]) + + write_struct('svn__errno', errno.errorcode.items()) + + # Fetch and write apr_errno.h codes. + aprerr = [] + for line in open(os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), + 'tools', 'dev', 'aprerr.txt')): + # aprerr.txt parsing duplicated in which-error.py + if line.startswith('#'): + continue + key, _, val = line.split() + aprerr += [(int(val), key)] + write_struct('svn__apr_errno', aprerr) + aprdict = dict(aprerr) + del aprerr + + ## sanity check + intersection = set(errno.errorcode.keys()) & set(aprdict.keys()) + intersection = filter(lambda x: errno.errorcode[x] != aprdict[x], + intersection) + if self.errno_filter(intersection): + print("WARNING: errno intersects APR error codes; " + "runtime computation of symbolic error names for the following numeric codes might be wrong: " + "%r" % (intersection,)) + + self.write_file_if_changed('subversion/libsvn_subr/errorcode.inc', + '\n'.join(lines)) + + def errno_filter(self, codes): + return codes + + class FileSectionOptionEnum(object): + # These are accessed via getattr() later on + file = object() + section = object() + option = object() + + def _client_configuration_defines(self): + """Return an iterator over SVN_CONFIG_* #define's in the "Client + configuration files strings" section of svn_config.h.""" + + pattern = re.compile( + r'^\s*#\s*define\s+' + r'(?P<macro>SVN_CONFIG_(?P<kind>CATEGORY|SECTION|OPTION)_[A-Z0-9a-z_]+)' + ) + kind = { + 'CATEGORY': self.FileSectionOptionEnum.file, + 'SECTION': self.FileSectionOptionEnum.section, + 'OPTION': self.FileSectionOptionEnum.option, + } + + fname = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), + 'subversion', 'include', 'svn_config.h') + lines = iter(open(fname)) + for line in lines: + if "@name Client configuration files strings" in line: + break + else: + raise Exception("Unable to parse svn_config.h") + + for line in lines: + if "@{" in line: + break + else: + raise Exception("Unable to parse svn_config.h") + + for line in lines: + if "@}" in line: + break + match = pattern.match(line) + if match: + yield ( + match.group('macro'), + kind[match.group('kind')], + ) + else: + raise Exception("Unable to parse svn_config.h") + + def write_config_keys(self): + groupby = collections.defaultdict(list) + empty_sections = [] + previous = (None, None) + for macro, kind in self._client_configuration_defines(): + if kind is previous[1] is self.FileSectionOptionEnum.section: + empty_sections.append(previous[0]) + groupby[kind].append(macro) + previous = (macro, kind) + else: + # If the last (macro, kind) is a section, then it's an empty section. + if kind is self.FileSectionOptionEnum.section: + empty_sections.append(macro) + + lines = [] + lines.append('/* Automatically generated by %s:write_config_keys() */' + % (__file__,)) + lines.append('') + + for kind in ('file', 'section', 'option'): + macros = groupby[getattr(self.FileSectionOptionEnum, kind)] + lines.append('static const char *svn__valid_config_%ss[] = {' % (kind,)) + for macro in macros: + lines.append(' %s,' % (macro,)) + # Remove ',' for c89 compatibility + lines[-1] = lines[-1][0:-1] + lines.append('};') + lines.append('') + + lines.append('static const char *svn__empty_config_sections[] = {'); + for section in empty_sections: + lines.append(' %s,' % (section,)) + # Remove ',' for c89 compatibility + lines[-1] = lines[-1][0:-1] + lines.append('};') + lines.append('') + + self.write_file_if_changed('subversion/libsvn_subr/config_keys.inc', + '\n'.join(lines)) class DependencyGraph: """Record dependencies between build items. @@ -259,6 +432,10 @@ class DependencyGraph: else: self.deps[type][target] = [ source ] + def remove(self, type, target, source): + if target in self.deps[type] and source in self.deps[type][target]: + self.deps[type][target].remove(source) + def bulk_add(self, type, target, sources): if target in self.deps[type]: self.deps[type][target].extend(sources) @@ -429,13 +606,14 @@ class TargetLinked(Target): # the specified install area depends upon this target self.gen_obj.graph.add(DT_INSTALL, self.install, self) - sources = sorted(_collect_paths(self.sources or '*.c' or '*.cpp', self.path)) + sources = sorted(_collect_paths(self.sources, self.path)) - for srcs, reldir in sources: - for src in srcs.split(" "): + for src, reldir in sources: if glob.glob(src): if src[-2:] == '.c': objname = src[:-2] + self.objext + elif src[-3:] == '.cc': + objname = src[:-3] + self.objext elif src[-4:] == '.cpp': objname = src[:-4] + self.objext else: @@ -470,6 +648,8 @@ class TargetExe(TargetLinked): self.manpages = options.get('manpages', '') self.testing = options.get('testing') + self.msvc_force_static = options.get('msvc-force-static') == 'yes' + def add_dependencies(self): TargetLinked.add_dependencies(self) @@ -519,6 +699,11 @@ class TargetLib(TargetLinked): self.msvc_fake = options.get('msvc-fake') == 'yes' # has fake target self.msvc_export = options.get('msvc-export', '').split() + def disable_shared(self): + "tries to disable building as a shared library," + + self.msvc_static = True + class TargetApacheMod(TargetLib): def __init__(self, name, options, gen_obj): @@ -580,7 +765,6 @@ class TargetSWIG(TargetLib): TargetLib.__init__(self, name, options, gen_obj) self.lang = lang self.desc = self.desc + ' for ' + lang_full_name[lang] - self.include_runtime = options.get('include-runtime') == 'yes' ### hmm. this is Makefile-specific self.link_cmd = '$(LINK_%s_WRAPPER)' % lang_abbrev[lang].upper() @@ -604,13 +788,16 @@ class TargetSWIG(TargetLib): module_name = iname[:4] != 'svn_' and iname[:-2] or iname[4:-2] lib_extension = self.gen_obj._extension_map['lib', 'target'] - if self.lang == "ruby": + if self.lang == "python": + lib_extension = self.gen_obj._extension_map['pyd', 'target'] + lib_filename = '_' + module_name + lib_extension + elif self.lang == "ruby": + lib_extension = self.gen_obj._extension_map['so', 'target'] lib_filename = module_name + lib_extension elif self.lang == "perl": lib_filename = '_' + module_name.capitalize() + lib_extension else: - lib_extension = self.gen_obj._extension_map['pyd', 'target'] - lib_filename = '_' + module_name + lib_extension + lib_filename = module_name + lib_extension self.name = self.lang + '_' + module_name self.path = build_path_join(self.path, self.lang) @@ -662,6 +849,12 @@ class TargetSWIGLib(TargetLib): return [ self.target ] return [ ] + def disable_shared(self): + "disables building shared libraries" + + return # Explicit NO-OP + + class TargetProject(Target): def __init__(self, name, options, gen_obj): Target.__init__(self, name, options, gen_obj) @@ -914,10 +1107,13 @@ def _collect_paths(pats, path=None): path (string), if specified, is a path that will be prepended to each glob pattern before it is evaluated - If path is none the return value is a list of filenames, otherwise + If path is None the return value is a list of filenames, otherwise the return value is a list of 2-tuples. The first element in each tuple is a matching filename and the second element is the portion of the glob pattern which matched the file before its last forward slash (/) + + If no files are found matching a pattern, then include the pattern itself + as a filename in the results. """ result = [ ] for base_pat in pats.split(): @@ -1107,7 +1303,13 @@ class IncludeDependencyInfo: direct_possibility_fname = os.path.normpath(os.path.join( os.path.dirname(fname), include_param)) domain_fnames = self._domain.get(os.path.basename(include_param), []) - if direct_possibility_fname in domain_fnames: + if os.sep.join(['libsvn_subr', 'error.c']) in fname \ + and 'errorcode.inc' == include_param: + continue # generated by GeneratorBase.write_errno_table + if os.sep.join(['libsvn_subr', 'cmdline.c']) in fname \ + and 'config_keys.inc' == include_param: + continue # generated by GeneratorBase.write_config_keys + elif direct_possibility_fname in domain_fnames: self._upd_dep_hash(hdrs, direct_possibility_fname, type_code) elif (len(domain_fnames) == 1 and (include_param.find(os.sep) == -1 diff --git a/build/generator/gen_make.py b/build/generator/gen_make.py index 5c2db16..b2a7787 100644 --- a/build/generator/gen_make.py +++ b/build/generator/gen_make.py @@ -53,6 +53,12 @@ from gen_base import build_path_join, build_path_strip, build_path_splitfile, \ build_path_basename, build_path_dirname, build_path_retreat, unique +def _normstr(x): + if os.sep == '/': + return os.path.normpath(str(x)) + else: + return os.path.normpath(str(x).replace('/', os.sep)).replace(os.sep, '/') + class Generator(gen_base.GeneratorBase): _extension_map = { @@ -62,6 +68,8 @@ class Generator(gen_base.GeneratorBase): ('lib', 'object'): '.lo', ('pyd', 'target'): '.la', ('pyd', 'object'): '.lo', + ('so', 'target'): '.la', + ('so', 'object'): '.lo', } def __init__(self, fname, verfname, options=None): @@ -230,12 +238,14 @@ class Generator(gen_base.GeneratorBase): # get the source items (.o and .la) for the link unit objects = [ ] + objdeps = [ ] object_srcs = [ ] headers = [ ] header_classes = [ ] header_class_filenames = [ ] deps = [ ] libs = [ ] + add_deps = target_ob.add_deps.split() for link_dep in self.graph.get_sources(gen_base.DT_LINK, target_ob.name): if isinstance(link_dep, gen_base.TargetJava): @@ -260,6 +270,7 @@ class Generator(gen_base.GeneratorBase): elif isinstance(link_dep, gen_base.ObjectFile): # link in the object file objects.append(link_dep.filename) + objdeps.append(_normstr(link_dep.filename)) for dep in self.graph.get_sources(gen_base.DT_OBJECT, link_dep, gen_base.SourceFile): object_srcs.append( build_path_join('$(abs_srcdir)', dep.filename)) @@ -286,8 +297,9 @@ class Generator(gen_base.GeneratorBase): varname=targ_varname, path=path, install=None, - add_deps=target_ob.add_deps, + add_deps=add_deps, objects=objects, + objdeps=objdeps, deps=deps, when=target_ob.when, ) @@ -379,7 +391,10 @@ class Generator(gen_base.GeneratorBase): dirname, fname = build_path_splitfile(file.filename) return _eztdata(mode=None, dirname=dirname, fullname=file.filename, - filename=fname, when=file.when) + filename=fname, when=file.when, + pc_fullname=None, + pc_installdir=None, + pc_install_fname=None,) def apache_file_to_eztdata(file): # cd to dirname before install to work around libtool 1.4.2 bug. @@ -412,6 +427,15 @@ class Generator(gen_base.GeneratorBase): else: ezt_file.install_fname = build_path_join('$(%sdir)' % area_var, ezt_file.filename) + + # Install pkg-config files + if (isinstance(file.target, gen_base.TargetLib) and + ezt_file.fullname.startswith('subversion/libsvn_')): + ezt_file.pc_fullname = ezt_file.fullname.replace('-1.la', '.pc') + ezt_file.pc_installdir = '$(pkgconfig_dir)' + pc_install_fname = ezt_file.filename.replace('-1.la', '.pc') + ezt_file.pc_install_fname = build_path_join(ezt_file.pc_installdir, + pc_install_fname) ezt_area.files.append(ezt_file) # certain areas require hooks for extra install rules defined @@ -452,11 +476,11 @@ class Generator(gen_base.GeneratorBase): key=lambda t: t[0].filename) for objname, sources in obj_deps: - dep = _eztdata(name=str(objname), + dep = _eztdata(name=_normstr(objname), when=objname.when, - deps=list(map(str, sources)), + deps=list(map(_normstr, sources)), cmd=objname.compile_cmd, - source=str(sources[0])) + source=_normstr(sources[0])) data.deps.append(dep) dep.generated = ezt.boolean(getattr(objname, 'source_generated', 0)) @@ -469,6 +493,8 @@ class Generator(gen_base.GeneratorBase): self.write_transform_libtool_scripts(install_sources) + self.write_pkg_config_dot_in_files(install_sources) + def write_standalone(self): """Write autogen-standalone.mk""" @@ -580,6 +606,62 @@ DIR=`pwd` libdep_cache[target_name] = sorted(libs) return libdep_cache[target_name] + def write_pkg_config_dot_in_files(self, install_sources): + """Write pkg-config .pc.in files for Subversion libraries.""" + for target_ob in install_sources: + if not (isinstance(target_ob, gen_base.TargetLib) and + target_ob.path.startswith('subversion/libsvn_')): + continue + + lib_name = target_ob.name + lib_path = self.sections[lib_name].options.get('path') + lib_deps = self.sections[lib_name].options.get('libs') + lib_desc = self.sections[lib_name].options.get('description') + output_path = build_path_join(lib_path, lib_name + '.pc.in') + template = ezt.Template(os.path.join('build', 'generator', 'templates', + 'pkg-config.in.ezt'), + compress_whitespace=False) + class _eztdata(object): + def __init__(self, **kw): + vars(self).update(kw) + + data = _eztdata( + lib_name=lib_name, + lib_desc=lib_desc, + lib_deps=[], + lib_required=[], + lib_required_private=[], + ) + # libsvn_foo -> -lsvn_foo + data.lib_deps.append('-l%s' % lib_name.replace('lib', '', 1)) + for lib_dep in lib_deps.split(): + if lib_dep == 'apriconv': + # apriconv is part of apr-util, skip it + continue + external_lib = self.sections[lib_dep].options.get('external-lib') + if external_lib: + ### Some of Subversion's internal libraries can appear as external + ### libs to handle conditional compilation. Skip these for now. + if external_lib in ['$(SVN_RA_LIB_LINK)', '$(SVN_FS_LIB_LINK)']: + continue + # If the external library is known to support pkg-config, + # add it to the Required: or Required.private: section. + # Otherwise, add the external library to linker flags. + pkg_config = self.sections[lib_dep].options.get('pkg-config') + if pkg_config: + private = self.sections[lib_dep].options.get('pkg-config-private') + if private: + data.lib_required_private.append(pkg_config) + else: + data.lib_required.append(pkg_config) + else: + # $(EXTERNAL_LIB) -> @EXTERNAL_LIB@ + data.lib_deps.append('@%s@' % external_lib[2:-1]) + else: + data.lib_required_private.append(lib_dep) + + template.generate(open(output_path, 'w'), data) + class UnknownDependency(Exception): "We don't know how to deal with the dependent to link it in." pass diff --git a/build/generator/gen_msvc_dsp.py b/build/generator/gen_msvc_dsp.py index 854b8fa..e2bd40d 100644 --- a/build/generator/gen_msvc_dsp.py +++ b/build/generator/gen_msvc_dsp.py @@ -82,7 +82,6 @@ class Generator(gen_win.WinGeneratorBase): 'rootpath' : self.rootpath, 'platforms' : self.platforms, 'configs' : configs, - 'includes' : self.get_win_includes(target), 'sources' : sources, 'default_platform' : self.platforms[0], 'default_config' : configs[0].name, @@ -128,8 +127,6 @@ class Generator(gen_win.WinGeneratorBase): ( ('project_guid', self.makeguid('svn_locale')), )) - self.write_zlib_project_file('zlib.dsp') - self.write_serf_project_file('serf.dsp') install_targets = self.get_install_targets() targets = [ ] @@ -151,9 +148,9 @@ class Generator(gen_win.WinGeneratorBase): depends = [ ] if not isinstance(target, gen_base.TargetI18N): depends = self.adjust_win_depends(target, name) - #print name - #for dep in depends: - # print " ",dep.name + #print name + #for dep in depends: + # print " ",dep.name dep_names = [ ] for dep in depends: diff --git a/build/generator/gen_vcnet_vcproj.py b/build/generator/gen_vcnet_vcproj.py index d951bb9..0ab4604 100644 --- a/build/generator/gen_vcnet_vcproj.py +++ b/build/generator/gen_vcnet_vcproj.py @@ -38,6 +38,23 @@ class Generator(gen_win.WinGeneratorBase): def quote(self, str): return '"%s"' % str + def gen_proj_names(self, install_targets): + "Generate project file names for the targets" + + if float(self.vcproj_version) < 11.0: + gen_win.WinGeneratorBase.gen_proj_names(self, install_targets) + return + + # With VS2012 we can assume that even the light versions + # support proper project nesting in the UI + + for target in install_targets: + if target.msvc_name: + target.proj_name = target.msvc_name + continue + + target.proj_name = target.name + def get_external_project(self, target, proj_ext): "Link project files: prefer vcproj's, but if don't exist, try dsp's." vcproj = gen_win.WinGeneratorBase.get_external_project(self, target, @@ -100,7 +117,6 @@ class Generator(gen_win.WinGeneratorBase): 'platforms' : self.platforms, 'config_type' : config_type, 'configs' : configs, - 'includes' : self.get_win_includes(target), 'sources' : sources, 'default_platform' : self.platforms[0], 'default_config' : configs[0].name, @@ -155,8 +171,6 @@ class Generator(gen_win.WinGeneratorBase): ( ('project_guid', self.makeguid('svn_locale')), )) - self.write_zlib_project_file('zlib' + self.vcproj_extension) - self.write_serf_project_file('serf' + self.vcproj_extension) install_targets = self.get_install_targets() diff --git a/build/generator/gen_win.py b/build/generator/gen_win.py index 5fdf77a..de693de 100644 --- a/build/generator/gen_win.py +++ b/build/generator/gen_win.py @@ -38,6 +38,7 @@ import string import generator.swig.header_wrappers import generator.swig.checkout_swig_header import generator.swig.external_runtime +import gen_win_dependencies if sys.version_info[0] >= 3: # Python >=3.0 @@ -52,186 +53,7 @@ else: import gen_base import ezt - -class GeneratorBase(gen_base.GeneratorBase): - """This intermediate base class exists to be instantiated by win-tests.py, - in order to obtain information from build.conf and library paths without - actually doing any generation.""" - _extension_map = { - ('exe', 'target'): '.exe', - ('exe', 'object'): '.obj', - ('lib', 'target'): '.dll', - ('lib', 'object'): '.obj', - ('pyd', 'target'): '.pyd', - ('pyd', 'object'): '.obj', - } - - def parse_options(self, options): - self.apr_path = 'apr' - self.apr_util_path = 'apr-util' - self.apr_iconv_path = 'apr-iconv' - self.serf_path = None - self.serf_lib = None - self.bdb_path = 'db4-win32' - self.httpd_path = None - self.libintl_path = None - self.zlib_path = 'zlib' - self.openssl_path = None - self.jdk_path = None - self.junit_path = None - self.swig_path = None - self.vs_version = '2002' - self.sln_version = '7.00' - self.vcproj_version = '7.00' - self.vcproj_extension = '.vcproj' - self.sqlite_path = 'sqlite-amalgamation' - self.skip_sections = { 'mod_dav_svn': None, - 'mod_authz_svn': None, - 'mod_dontdothat' : None, - 'libsvn_auth_kwallet': None, - 'libsvn_auth_gnome_keyring': None } - - # Instrumentation options - self.disable_shared = None - self.static_apr = None - self.static_openssl = None - self.instrument_apr_pools = None - self.instrument_purify_quantify = None - self.configure_apr_util = None - self.sasl_path = None - - # NLS options - self.enable_nls = None - - # ML (assembler) is disabled by default; use --enable-ml to detect - self.enable_ml = None - - for opt, val in options: - if opt == '--with-berkeley-db': - self.bdb_path = val - elif opt == '--with-apr': - self.apr_path = val - elif opt == '--with-apr-util': - self.apr_util_path = val - elif opt == '--with-apr-iconv': - self.apr_iconv_path = val - elif opt == '--with-serf': - self.serf_path = val - elif opt == '--with-httpd': - self.httpd_path = val - del self.skip_sections['mod_dav_svn'] - del self.skip_sections['mod_authz_svn'] - del self.skip_sections['mod_dontdothat'] - elif opt == '--with-libintl': - self.libintl_path = val - self.enable_nls = 1 - elif opt == '--with-jdk': - self.jdk_path = val - elif opt == '--with-junit': - self.junit_path = val - elif opt == '--with-zlib': - self.zlib_path = val - elif opt == '--with-swig': - self.swig_path = val - elif opt == '--with-sqlite': - self.sqlite_path = val - elif opt == '--with-sasl': - self.sasl_path = val - elif opt == '--with-openssl': - self.openssl_path = val - elif opt == '--enable-purify': - self.instrument_purify_quantify = 1 - self.instrument_apr_pools = 1 - elif opt == '--enable-quantify': - self.instrument_purify_quantify = 1 - elif opt == '--enable-pool-debug': - self.instrument_apr_pools = 1 - elif opt == '--enable-nls': - self.enable_nls = 1 - elif opt == '--enable-bdb-in-apr-util': - self.configure_apr_util = 1 - elif opt == '--enable-ml': - self.enable_ml = 1 - elif opt == '--disable-shared': - self.disable_shared = 1 - elif opt == '--with-static-apr': - self.static_apr = 1 - elif opt == '--with-static-openssl': - self.static_openssl = 1 - elif opt == '--vsnet-version': - if val == '2002' or re.match('7(\.\d+)?$', val): - self.vs_version = '2002' - self.sln_version = '7.00' - self.vcproj_version = '7.00' - self.vcproj_extension = '.vcproj' - elif val == '2003' or re.match('8(\.\d+)?$', val): - self.vs_version = '2003' - self.sln_version = '8.00' - self.vcproj_version = '7.10' - self.vcproj_extension = '.vcproj' - elif val == '2005' or re.match('9(\.\d+)?$', val): - self.vs_version = '2005' - self.sln_version = '9.00' - self.vcproj_version = '8.00' - self.vcproj_extension = '.vcproj' - elif val == '2008' or re.match('10(\.\d+)?$', val): - self.vs_version = '2008' - self.sln_version = '10.00' - self.vcproj_version = '9.00' - self.vcproj_extension = '.vcproj' - elif val == '2010': - self.vs_version = '2010' - self.sln_version = '11.00' - self.vcproj_version = '10.0' - self.vcproj_extension = '.vcxproj' - elif val == '2012' or val == '11': - self.vs_version = '2012' - self.sln_version = '12.00' - self.vcproj_version = '11.0' - self.vcproj_extension = '.vcxproj' - elif val == '2013' or val == '12': - self.vs_version = '2013' - self.sln_version = '12.00' - self.vcproj_version = '12.0' - self.vcproj_extension = '.vcxproj' - elif re.match('^1\d+$', val): - self.vs_version = val - self.sln_version = '12.00' - self.vcproj_version = val + '.0' - self.vcproj_extension = '.vcxproj' - else: - print('WARNING: Unknown VS.NET version "%s",' - ' assuming "%s"\n' % (val, '7.00')) - - - def __init__(self, fname, verfname, options): - - # parse (and save) the options that were passed to us - self.parse_options(options) - - # Initialize parent - gen_base.GeneratorBase.__init__(self, fname, verfname, options) - - # Find Berkeley DB - self._find_bdb() - - def _find_bdb(self): - "Find the Berkeley DB library and version" - # Before adding "60" to this list, see build/ac-macros/berkeley-db.m4. - for ver in ("53", "52", "51", "50", "48", "47", "46", - "45", "44", "43", "42", "41", "40"): - lib = "libdb" + ver - path = os.path.join(self.bdb_path, "lib") - if os.path.exists(os.path.join(path, lib + ".lib")): - self.bdb_lib = lib - break - elif os.path.exists(os.path.join(path, lib + "d.lib")): - self.bdb_lib = lib - break - else: - self.bdb_lib = None - -class WinGeneratorBase(GeneratorBase): +class WinGeneratorBase(gen_win_dependencies.GenDependenciesBase): "Base class for all Windows project files generators" def __init__(self, fname, verfname, options, subdir): @@ -243,48 +65,30 @@ class WinGeneratorBase(GeneratorBase): """ # Initialize parent - GeneratorBase.__init__(self, fname, verfname, options) + gen_win_dependencies.GenDependenciesBase.__init__(self, fname, verfname, + options, find_libs=False) - if self.bdb_lib is not None: - print("Found %s.lib or %sd.lib in %s\n" % (self.bdb_lib, self.bdb_lib, - self.bdb_path)) - else: - print("BDB not found, BDB fs will not be built\n") + # On Windows we create svn_private_config.h in the output directory since + # r1370526. + # + # Without this replacement all projects include a not-existing file, + # which makes the MSBuild calculation to see whether a project is changed + # far more expensive than necessary. + self.private_built_includes.append('$(Configuration)/svn_private_config.h') + self.private_built_includes.remove('subversion/svn_private_config.h') if subdir == 'vcnet-vcproj': print('Generating for Visual Studio %s\n' % self.vs_version) - # Find the right Ruby include and libraries dirs and - # library name to link SWIG bindings with - self._find_ruby() + self.find_libraries(True) - # Find the right Perl library name to link SWIG bindings with - self._find_perl() - - # Find the right Python include and libraries dirs for SWIG bindings - self._find_python() - - # Find the installed SWIG version to adjust swig options - self._find_swig() - - # Find the installed Java Development Kit - self._find_jdk() - - # Find APR and APR-util version - self._find_apr() - self._find_apr_util() - - # Find Sqlite - self._find_sqlite() - - # Look for ZLib and ML - if self.zlib_path: - self._find_zlib() - self._find_ml() - - # Find serf and its dependencies - if self.serf_path: - self._find_serf() + # Print list of identified libraries + printed = [] + for lib in sorted(self._libraries.values(), key = lambda s: s.name): + if lib.name in printed: + continue + printed.append(lib.name) + print('Found %s %s' % (lib.name, lib.version)) #Make some files for the installer so that we don't need to #require sed or some other command to do it @@ -307,25 +111,17 @@ class WinGeneratorBase(GeneratorBase): if not os.path.exists(self.projfilesdir): os.makedirs(self.projfilesdir) - # Generate the build_zlib.bat file - if self.zlib_path: - data = {'zlib_path': os.path.relpath(self.zlib_path, self.projfilesdir), - 'zlib_version': self.zlib_version, - 'use_ml': self.have_ml and 1 or None} - bat = os.path.join(self.projfilesdir, 'build_zlib.bat') - self.write_with_template(bat, 'templates/build_zlib.ezt', data) - # Generate the build_locale.bat file - pofiles = [] if self.enable_nls: + pofiles = [] for po in os.listdir(os.path.join('subversion', 'po')): if fnmatch.fnmatch(po, '*.po'): pofiles.append(POFile(po[:-3])) - data = {'pofiles': pofiles} - self.write_with_template(os.path.join(self.projfilesdir, - 'build_locale.bat'), - 'templates/build_locale.ezt', data) + data = {'pofiles': pofiles} + self.write_with_template(os.path.join(self.projfilesdir, + 'build_locale.bat'), + 'templates/build_locale.ezt', data) #Here we can add additional platforms to compile for self.platforms = ['Win32'] @@ -338,7 +134,7 @@ class WinGeneratorBase(GeneratorBase): #Here we can add additional modes to compile for self.configs = ['Debug','Release'] - if self.swig_libdir: + if 'swig' in self._libraries: # Generate SWIG header wrappers and external runtime for swig in (generator.swig.header_wrappers, generator.swig.checkout_swig_header, @@ -347,6 +143,11 @@ class WinGeneratorBase(GeneratorBase): else: print("%s not found; skipping SWIG file generation..." % self.swig_exe) + def errno_filter(self, codes): + "Callback for gen_base.write_errno_table()." + # Filter out python's SOC* codes, which alias the windows API names. + return set(filter(lambda code: not (10000 <= code <= 10100), codes)) + def find_rootpath(self): "Gets the root path as understand by the project system" return os.path.relpath('.', self.projfilesdir) + "\\" @@ -386,36 +187,35 @@ class WinGeneratorBase(GeneratorBase): install_targets = self.graph.get_all_sources(gen_base.DT_INSTALL) \ + self.projects + install_targets = [x for x in install_targets if not x.when or + x.when in self._windows_when] + # Don't create projects for scripts install_targets = [x for x in install_targets if not isinstance(x, gen_base.TargetScript)] + if not self.enable_nls: + install_targets = [x for x in install_targets if x.name != 'locale'] + # Drop the libsvn_fs_base target and tests if we don't have BDB - if not self.bdb_lib: + if 'db' not in self._libraries: install_targets = [x for x in install_targets if x.name != 'libsvn_fs_base'] install_targets = [x for x in install_targets if not (isinstance(x, gen_base.TargetExe) and x.install == 'bdb-test')] - # Don't build serf when we don't have it or for 1.3+ - if not self.serf_lib or (self.serf_ver_maj, self.serf_ver_min) >= (1, 3): - install_targets = [x for x in install_targets if x.name != 'serf'] - - # Drop the serf target if we don't have both serf and openssl - if not self.serf_lib: + # Drop the ra_serf target if we don't have serf + if 'serf' not in self._libraries: install_targets = [x for x in install_targets if x.name != 'libsvn_ra_serf'] - # Don't build zlib if we have an already compiled serf - if self.serf_lib and (self.serf_ver_maj, self.serf_ver_min) >= (1, 3): - install_targets = [x for x in install_targets if x.name != 'zlib'] - - # Drop the swig targets if we don't have swig - if not self.swig_path and not self.swig_libdir: - install_targets = [x for x in install_targets - if not (isinstance(x, gen_base.TargetSWIG) - or isinstance(x, gen_base.TargetSWIGLib) - or isinstance(x, gen_base.TargetSWIGProject))] + # Drop the swig targets if we don't have swig or language support + install_targets = [x for x in install_targets + if (not (isinstance(x, gen_base.TargetSWIG) + or isinstance(x, gen_base.TargetSWIGLib) + or isinstance(x, gen_base.TargetSWIGProject)) + or (x.lang in self._libraries + and 'swig' in self._libraries))] # Drop the Java targets if we don't have a JDK - if not self.jdk_path: + if 'java_sdk' not in self._libraries: install_targets = [x for x in install_targets if not (isinstance(x, gen_base.TargetJava) or isinstance(x, gen_base.TargetJavaHeaders) @@ -423,6 +223,7 @@ class WinGeneratorBase(GeneratorBase): or x.name == '__JAVAHL_TESTS__' or x.name == 'libsvnjavahl')] + # Create DLL targets for libraries dll_targets = [] for target in install_targets: if isinstance(target, gen_base.TargetLib): @@ -430,11 +231,26 @@ class WinGeneratorBase(GeneratorBase): install_targets.append(self.create_fake_target(target)) if target.msvc_export: if self.disable_shared: - target.msvc_static = True + target.disable_shared() else: dll_targets.append(self.create_dll_target(target)) install_targets.extend(dll_targets) + # Fix up targets that can't be linked to libraries + if not self.disable_shared: + for target in install_targets: + if isinstance(target, gen_base.TargetExe) and target.msvc_force_static: + + # Make direct dependencies of all the indirect dependencies + linked_deps = {} + self.get_linked_win_depends(target, linked_deps) + + for lk in linked_deps.keys(): + if not isinstance(lk, gen_base.TargetLib) or not lk.msvc_export: + self.graph.add(gen_base.DT_LINK, target.name, lk) + else: + self.graph.remove(gen_base.DT_LINK, target.name, lk) + for target in install_targets: target.project_guid = self.makeguid(target.name) @@ -485,9 +301,7 @@ class WinGeneratorBase(GeneratorBase): # against the static libraries because they sometimes access internal # library functions. - # ### The magic behavior for 'test' in a name and 'entries-dump' should - # ### move to another option in build.conf - if dep in deps[key] and key.find("test") == -1 and key != 'entries-dump': + if dep in deps[key]: deps[key].remove(dep) deps[key].append(target) @@ -506,6 +320,9 @@ class WinGeneratorBase(GeneratorBase): defines=self.get_win_defines(target, cfg), libdirs=self.get_win_lib_dirs(target, cfg), libs=self.get_win_libs(target, cfg), + includes=self.get_win_includes(target, cfg), + forced_include_files + =self.get_win_forced_includes(target, cfg), )) return configs @@ -526,6 +343,7 @@ class WinGeneratorBase(GeneratorBase): cbuild = None ctarget = None cdesc = None + cignore = None if isinstance(target, gen_base.TargetJavaHeaders): classes = self.path(target.classes) if self.junit_path is not None: @@ -548,11 +366,21 @@ class WinGeneratorBase(GeneratorBase): sourcepath = self.path(source.sourcepath) - cbuild = "%s -g -target 1.5 -source 1.5 -classpath %s -d %s " \ - "-sourcepath %s $(InputPath)" \ + per_project_flags = "" + + if target.name.find("-compat-"): + per_project_flags += "-Xlint:-deprecation -Xlint:-dep-ann" \ + " -Xlint:-rawtypes" + + cbuild = ("%s -g -Xlint -Xlint:-options " + + per_project_flags + + " -target 1.5 -source 1.5 -classpath " + " %s -d %s " + " -sourcepath %s $(InputPath)") \ % tuple(map(self.quote, (javac_exe, classes, targetdir, sourcepath))) + ctarget = self.path(object.filename) cdesc = "Compiling %s" % (source) @@ -560,9 +388,18 @@ class WinGeneratorBase(GeneratorBase): if quote_path and '-' in rsrc: rsrc = '"%s"' % rsrc + if (not isinstance(source, gen_base.SourceFile) + and cbuild is None and ctarget is None and cdesc is None + and source in self._excluded_from_build): + # Make sure include dependencies are excluded from the build. + # This is an 'orrible 'ack that relies on the source being a + # string if it's an include dependency, or a SourceFile object + # otherwise. + cignore = 'yes' + sources.append(ProjectItem(path=rsrc, reldir=reldir, user_deps=[], custom_build=cbuild, custom_target=ctarget, - custom_desc=cdesc, + custom_desc=cdesc, ignored = cignore, extension=os.path.splitext(rsrc)[1])) if isinstance(target, gen_base.TargetJavaClasses) and target.jar: @@ -683,8 +520,7 @@ class WinGeneratorBase(GeneratorBase): return self.get_output_dir(target) def get_def_file(self, target): - if isinstance(target, gen_base.TargetLib) and target.msvc_export \ - and not self.disable_shared: + if isinstance(target, gen_base.TargetLib) and target.msvc_export: return target.name + ".def" return None @@ -714,7 +550,7 @@ class WinGeneratorBase(GeneratorBase): and target.external_project): return None - if target.external_project[:5] == 'serf/' and self.serf_lib: + if target.external_project[:5] == 'serf/' and 'serf' in self._libraries: path = self.serf_path + target.external_project[4:] elif target.external_project.find('/') != -1: path = target.external_project @@ -737,10 +573,6 @@ class WinGeneratorBase(GeneratorBase): if self.enable_nls and name == '__ALL__': depends.extend(self.sections['locale'].get_targets()) - # Build ZLib as a dependency of Serf if we have it - if self.zlib_path and name == 'serf': - depends.extend(self.sections['zlib'].get_targets()) - # To set the correct build order of the JavaHL targets, the javahl-javah # and libsvnjavahl targets are defined with extra dependencies in build.conf # like this: @@ -760,7 +592,9 @@ class WinGeneratorBase(GeneratorBase): dep_dict = {} - if isinstance(target, gen_base.TargetLib) and target.msvc_static: + if mode == FILTER_EXTERNALLIBS: + self.get_externallib_depends(target, dep_dict) + elif isinstance(target, gen_base.TargetLib) and target.msvc_static: self.get_static_win_depends(target, dep_dict) else: self.get_linked_win_depends(target, dep_dict) @@ -771,10 +605,13 @@ class WinGeneratorBase(GeneratorBase): for dep, (is_proj, is_lib, is_static) in dep_dict.items(): if is_proj: deps.append(dep) - elif mode == FILTER_LIBS: + elif mode == FILTER_LIBS or mode == FILTER_EXTERNALLIBS: for dep, (is_proj, is_lib, is_static) in dep_dict.items(): if is_static or (is_lib and not is_proj): - deps.append(dep) + # Filter explicit msvc libraries of optional dependencies + if (dep.name in self._libraries + or dep.name not in self._optional_libraries): + deps.append(dep) else: raise NotImplementedError @@ -840,7 +677,7 @@ class WinGeneratorBase(GeneratorBase): # every dll dependency we first check to see if its corresponding # static library is already in the list of dependencies. If it is, # we don't add the dll to the list. - if is_lib and dep.msvc_export and not self.disable_shared: + if is_lib and dep.msvc_export: static_dep = self.graph.get_sources(gen_base.DT_LINK, dep.name)[0] if static_dep in deps: continue @@ -858,6 +695,21 @@ class WinGeneratorBase(GeneratorBase): elif is_static: self.get_linked_win_depends(dep, deps, 1) + # and recurse over the external library dependencies for swig libraries, + # to include the language runtime + elif isinstance(dep, gen_base.TargetSWIGLib): + self.get_externallib_depends(dep, deps) + + def get_externallib_depends(self, target, deps): + """Find externallib dependencies for a project""" + + direct_deps = self.get_direct_depends(target) + for dep, dep_kind in direct_deps: + self.get_externallib_depends(dep, deps) + + if isinstance(target, gen_base.TargetLinked) and dep.external_lib: + deps[dep] = dep_kind + def get_win_defines(self, target, cfg): "Return the list of defines for target" @@ -866,206 +718,142 @@ class WinGeneratorBase(GeneratorBase): "_CRT_NONSTDC_NO_DEPRECATE=", "_CRT_SECURE_NO_WARNINGS="] - if self.sqlite_inline: - fakedefines.append("SVN_SQLITE_INLINE") + if cfg == 'Debug': + fakedefines.extend(["_DEBUG","SVN_DEBUG"]) + elif cfg == 'Release': + fakedefines.append("NDEBUG") if isinstance(target, gen_base.TargetApacheMod): if target.name == 'mod_dav_svn': fakedefines.extend(["AP_DECLARE_EXPORT"]) - if target.name.find('ruby') == -1: - fakedefines.append("snprintf=_snprintf") + if self.cpp_defines: + fakedefines.extend(self.cpp_defines) if isinstance(target, gen_base.TargetSWIG): fakedefines.append("SWIG_GLOBAL") - # Expect rb_errinfo() to be avilable in Ruby 1.9+, - # rather than ruby_errinfo. - if (self.ruby_major_version > 1 or self.ruby_minor_version > 8): - fakedefines.extend(["HAVE_RB_ERRINFO"]) + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: + for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() - if cfg == 'Debug': - fakedefines.extend(["_DEBUG","SVN_DEBUG"]) - elif cfg == 'Release': - fakedefines.append("NDEBUG") + if external_lib in self._libraries: + lib = self._libraries[external_lib] - if self.static_apr: - fakedefines.extend(["APR_DECLARE_STATIC", "APU_DECLARE_STATIC"]) - - # XXX: Check if db is present, and if so, let apr-util know - # XXX: This is a hack until the apr build system is improved to - # XXX: know these things for itself. - if self.bdb_lib: - fakedefines.append("APU_HAVE_DB=1") - fakedefines.append("SVN_LIBSVN_FS_LINKS_FS_BASE=1") + if lib.defines: + fakedefines.extend(lib.defines) # check if they wanted nls if self.enable_nls: fakedefines.append("ENABLE_NLS") - if self.serf_lib: - fakedefines.append("SVN_HAVE_SERF") - fakedefines.append("SVN_LIBSVN_CLIENT_LINKS_RA_SERF") - - # check we have sasl - if self.sasl_path: - fakedefines.append("SVN_HAVE_SASL") - if target.name.endswith('svn_subr'): fakedefines.append("SVN_USE_WIN32_CRASHHANDLER") - # use static linking to Expat - fakedefines.append("XML_STATIC") - return fakedefines - def get_win_includes(self, target): + def get_win_includes(self, target, cfg='Release'): "Return the list of include directories for target" - fakeincludes = [ self.path("subversion/include"), - self.path("subversion"), - self.apath(self.apr_path, "include"), - self.apath(self.apr_util_path, "include") ] + fakeincludes = [ "subversion/include" ] - if target.name == 'mod_authz_svn': - fakeincludes.extend([ self.apath(self.httpd_path, "modules/aaa") ]) + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: + for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() - if isinstance(target, gen_base.TargetApacheMod): - fakeincludes.extend([ self.apath(self.apr_util_path, "xml/expat/lib"), - self.apath(self.httpd_path, "include"), - self.apath(self.bdb_path, "include") ]) - elif isinstance(target, gen_base.TargetSWIG): + if external_lib in self._libraries: + lib = self._libraries[external_lib] + + fakeincludes.extend(lib.include_dirs) + + if (isinstance(target, gen_base.TargetSWIG) + or isinstance(target, gen_base.TargetSWIGLib)): util_includes = "subversion/bindings/swig/%s/libsvn_swig_%s" \ % (target.lang, gen_base.lang_utillib_suffix[target.lang]) - fakeincludes.extend([ self.path("subversion/bindings/swig"), - self.path("subversion/bindings/swig/proxy"), - self.path("subversion/bindings/swig/include"), - self.path(util_includes) ]) - else: - fakeincludes.extend([ self.apath(self.apr_util_path, "xml/expat/lib"), - self.path("subversion/bindings/swig/proxy"), - self.apath(self.bdb_path, "include") ]) - - if self.libintl_path: - fakeincludes.append(self.apath(self.libintl_path, 'inc')) - - if self.serf_lib: - fakeincludes.append(self.apath(self.serf_path)) - - if self.openssl_path and self.openssl_inc_dir: - fakeincludes.append(self.apath(self.openssl_inc_dir)) - - if self.swig_libdir \ - and (isinstance(target, gen_base.TargetSWIG) - or isinstance(target, gen_base.TargetSWIGLib)): - if self.swig_vernum >= 103028: - fakeincludes.append(self.apath(self.swig_libdir, target.lang)) - if target.lang == 'perl': - # At least swigwin 1.3.38+ uses perl5 as directory name. Just add it - # to the list to make sure we don't break old versions - fakeincludes.append(self.apath(self.swig_libdir, 'perl5')) - else: - fakeincludes.append(self.swig_libdir) - if target.lang == "perl": - fakeincludes.extend(self.perl_includes) - if target.lang == "python": - fakeincludes.extend(self.python_includes) - if target.lang == "ruby": - fakeincludes.extend(self.ruby_includes) - - fakeincludes.append(self.apath(self.zlib_path)) - - if self.sqlite_inline: - fakeincludes.append(self.apath(self.sqlite_path)) - else: - fakeincludes.append(self.apath(self.sqlite_path, 'inc')) + fakeincludes.append(util_includes) - if self.sasl_path: - fakeincludes.append(self.apath(self.sasl_path, 'include')) + if (isinstance(target, gen_base.TargetSWIG) + or isinstance(target, gen_base.TargetSWIGLib)): - if target.name == "libsvnjavahl" and self.jdk_path: - fakeincludes.append(os.path.join(self.jdk_path, 'include')) - fakeincludes.append(os.path.join(self.jdk_path, 'include', 'win32')) + # Projects aren't generated unless we have swig + assert self.swig_libdir + + if target.lang == "perl" and self.swig_version >= (1, 3, 28): + # At least swigwin 1.3.38+ uses perl5 as directory name. + lang_subdir = 'perl5' + else: + lang_subdir = target.lang - if target.name.find('cxxhl') != -1: - fakeincludes.append(self.path("subversion/bindings/cxxhl/include")) + # After the language specific includes include the generic libdir, + # to allow overriding a generic with a per language include + fakeincludes.append(os.path.join(self.swig_libdir, lang_subdir)) + fakeincludes.append(self.swig_libdir) - return fakeincludes + if 'cxxhl' in target.name: + fakeincludes.append("subversion/bindings/cxxhl/include") + + return gen_base.unique(map(self.apath, fakeincludes)) def get_win_lib_dirs(self, target, cfg): "Return the list of library directories for target" - expatlibcfg = cfg.replace("Debug", "LibD").replace("Release", "LibR") - if self.static_apr: - libcfg = expatlibcfg - else: - libcfg = cfg - - fakelibdirs = [ self.apath(self.bdb_path, "lib"), - self.apath(self.zlib_path), - ] - - if not self.sqlite_inline: - fakelibdirs.append(self.apath(self.sqlite_path, "lib")) - - if self.sasl_path: - fakelibdirs.append(self.apath(self.sasl_path, "lib")) - if self.serf_lib: - if (self.serf_ver_maj, self.serf_ver_min) >= (1, 3): - fakelibdirs.append(self.apath(self.serf_path)) - - if self.openssl_path and self.openssl_lib_dir: - fakelibdirs.append(self.apath(self.openssl_lib_dir)) + debug = (cfg == 'Debug') + + if not isinstance(target, gen_base.TargetLinked): + return [] + + if isinstance(target, gen_base.TargetLib) and target.msvc_static: + return [] + + fakelibdirs = [] + + # When nls is enabled, all our projects use it directly via the _() macro, + # even though only libsvn_subr references it in build.conf + if self.enable_nls: + lib = self._libraries['intl'] + if debug and lib.debug_lib_dir: + fakelibdirs.append(lib.debug_lib_dir) else: - fakelibdirs.append(self.apath(msvc_path_join(self.serf_path, cfg))) + fakelibdirs.append(lib.lib_dir) - fakelibdirs.append(self.apath(self.apr_path, libcfg)) - fakelibdirs.append(self.apath(self.apr_util_path, libcfg)) - fakelibdirs.append(self.apath(self.apr_util_path, 'xml', 'expat', - 'lib', expatlibcfg)) + if (isinstance(target, gen_base.TargetSWIG) + or isinstance(target, gen_base.TargetSWIGLib)): + if target.lang in self._libraries: + lib = self._libraries[target.lang] - if isinstance(target, gen_base.TargetApacheMod): - fakelibdirs.append(self.apath(self.httpd_path, cfg)) - if target.name == 'mod_dav_svn': - fakelibdirs.append(self.apath(self.httpd_path, "modules/dav/main", - cfg)) - if self.swig_libdir \ - and (isinstance(target, gen_base.TargetSWIG) - or isinstance(target, gen_base.TargetSWIGLib)): - if target.lang == "perl" and self.perl_libdir: - fakelibdirs.append(self.perl_libdir) - if target.lang == "python" and self.python_libdir: - fakelibdirs.append(self.python_libdir) - if target.lang == "ruby" and self.ruby_libdir: - fakelibdirs.append(self.ruby_libdir) - - return fakelibdirs + if debug and lib.debug_lib_dir: + fakelibdirs.append(lib.debug_lib_dir) + elif lib.lib_dir: + fakelibdirs.append(lib.lib_dir) - def get_win_libs(self, target, cfg): - "Return the list of external libraries needed for target" + for dep in self.get_win_depends(target, FILTER_LIBS): + if dep.external_lib: + for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() - dblib = None - if self.bdb_lib: - dblib = self.bdb_lib+(cfg == 'Debug' and 'd.lib' or '.lib') + if external_lib not in self._libraries: + continue - if self.serf_lib: - if self.serf_ver_maj != 0: - serflib = 'serf-%d.lib' % self.serf_ver_maj - else: - serflib = 'serf.lib' + lib = self._libraries[external_lib] - if self.serf_lib and (self.serf_ver_maj, self.serf_ver_min) >= (1, 3): - # We don't build zlib ourselves, so use the standard name - # (zdll.lib would link to zlib.dll) - zlib = 'zlib.lib' - else: - # We compile zlib ourselves to these explicit (non-standard) names - zlib = (cfg == 'Debug' and 'zlibstatD.lib' or 'zlibstat.lib') - - sasllib = None - if self.sasl_path: - sasllib = 'libsasl.lib' + if debug and lib.debug_lib_dir: + lib_dir = self.apath(lib.debug_lib_dir) + elif lib.lib_dir: + lib_dir = self.apath(lib.lib_dir) + else: + continue # Dependency without library (E.g. JDK) + + fakelibdirs.append(lib_dir) + + return gen_base.unique(fakelibdirs) + + def get_win_libs(self, target, cfg): + "Return the list of external libraries needed for target" + + debug = (cfg == 'Debug') if not isinstance(target, gen_base.TargetLinked): return [] @@ -1074,53 +862,45 @@ class WinGeneratorBase(GeneratorBase): return [] nondeplibs = target.msvc_libs[:] - nondeplibs.append(zlib) + + # When nls is enabled, all our projects use it directly via the _() macro, + # even though only libsvn_subr references it in build.conf if self.enable_nls: - if self.libintl_path: - nondeplibs.append(self.apath(self.libintl_path, - 'lib', 'intl3_svn.lib')) + lib = self._libraries['intl'] + if debug and lib.debug_lib_name: + nondeplibs.append(lib.debug_lib_name) else: - nondeplibs.append('intl3_svn.lib') - - if isinstance(target, gen_base.TargetExe): - nondeplibs.append('setargv.obj') + nondeplibs.append(lib.lib_name) - if ((isinstance(target, gen_base.TargetSWIG) - or isinstance(target, gen_base.TargetSWIGLib)) - and target.lang == 'perl'): - nondeplibs.append(self.perl_lib) - - if ((isinstance(target, gen_base.TargetSWIG) - or isinstance(target, gen_base.TargetSWIGLib)) - and target.lang == 'ruby'): - nondeplibs.append(self.ruby_lib) + if (isinstance(target, gen_base.TargetSWIG) + or isinstance(target, gen_base.TargetSWIGLib)): + if target.lang in self._libraries: + lib = self._libraries[target.lang] + if debug and lib.debug_lib_name: + nondeplibs.append(lib.debug_lib_name) + elif lib.lib_name: + nondeplibs.append(lib.lib_name) for dep in self.get_win_depends(target, FILTER_LIBS): nondeplibs.extend(dep.msvc_libs) - if dep.external_lib == '$(SVN_DB_LIBS)': - nondeplibs.append(dblib) - - if dep.external_lib == '$(SVN_SQLITE_LIBS)' and not self.sqlite_inline: - nondeplibs.append('sqlite3.lib') + if dep.external_lib: + for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): - if self.serf_lib and dep.external_lib == '$(SVN_SERF_LIBS)': - nondeplibs.append(serflib) - if (self.serf_ver_maj, self.serf_ver_min) >= (1, 3): - nondeplibs.append('ssleay32.lib') - nondeplibs.append('libeay32.lib') + external_lib = elib.lower() - if dep.external_lib == '$(SVN_SASL_LIBS)': - nondeplibs.append(sasllib) - - if dep.external_lib == '$(SVN_APR_LIBS)': - nondeplibs.append(self.apr_lib) + if external_lib not in self._libraries: + if external_lib not in self._optional_libraries: + print('Warning: Using undeclared dependency \'$(SVN_%s_LIBS)\'.' + % (elib,)) + continue - if dep.external_lib == '$(SVN_APRUTIL_LIBS)': - nondeplibs.append(self.aprutil_lib) + lib = self._libraries[external_lib] - if dep.external_lib == '$(SVN_XML_LIBS)': - nondeplibs.append('xml.lib') + if debug: + nondeplibs.append(lib.debug_lib_name) + else: + nondeplibs.append(lib.lib_name) return gen_base.unique(nondeplibs) @@ -1148,21 +928,23 @@ class WinGeneratorBase(GeneratorBase): return list(sources.values()) - def write_file_if_changed(self, fname, new_contents): - """Rewrite the file if new_contents are different than its current content. + def get_win_forced_includes(self, target, cfg): + """Return a list of include files that need to be included before any + other header in every c/c++ file""" - If you have your windows projects open and generate the projects - it's not a small thing for windows to re-read all projects so - only update those that have changed. - """ + fakeincludes = [] + + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: + for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() - try: - old_contents = open(fname, 'rb').read() - except IOError: - old_contents = None - if old_contents != new_contents: - open(fname, 'wb').write(new_contents) - print("Wrote: %s" % fname) + if external_lib in self._libraries: + lib = self._libraries[external_lib] + + fakeincludes.extend(lib.forced_includes) + + return gen_base.unique(fakeincludes) def write_with_template(self, fname, tname, data): fout = StringIO() @@ -1172,67 +954,6 @@ class WinGeneratorBase(GeneratorBase): template.generate(fout, data) self.write_file_if_changed(fname, fout.getvalue()) - def write_zlib_project_file(self, name): - if not self.zlib_path: - return - zlib_path = os.path.abspath(self.zlib_path) - zlib_sources = map(lambda x : os.path.relpath(x, self.projfilesdir), - glob.glob(os.path.join(zlib_path, '*.c')) + - glob.glob(os.path.join(zlib_path, - 'contrib/masmx86/*.c')) + - glob.glob(os.path.join(zlib_path, - 'contrib/masmx86/*.asm'))) - zlib_headers = map(lambda x : os.path.relpath(x, self.projfilesdir), - glob.glob(os.path.join(zlib_path, '*.h'))) - - self.move_proj_file(self.projfilesdir, name, - (('zlib_path', os.path.relpath(zlib_path, - self.projfilesdir)), - ('zlib_sources', zlib_sources), - ('zlib_headers', zlib_headers), - ('zlib_version', self.zlib_version), - ('project_guid', self.makeguid('zlib')), - ('use_ml', self.have_ml and 1 or None), - )) - - def write_serf_project_file(self, name): - if not self.serf_lib: - return - - serf_path = os.path.abspath(self.serf_path) - serf_sources = map(lambda x : os.path.relpath(x, self.serf_path), - glob.glob(os.path.join(serf_path, '*.c')) - + glob.glob(os.path.join(serf_path, 'auth', '*.c')) - + glob.glob(os.path.join(serf_path, 'buckets', - '*.c'))) - serf_headers = map(lambda x : os.path.relpath(x, self.serf_path), - glob.glob(os.path.join(serf_path, '*.h')) - + glob.glob(os.path.join(serf_path, 'auth', '*.h')) - + glob.glob(os.path.join(serf_path, 'buckets', '*.h'))) - if self.serf_ver_maj != 0: - serflib = 'serf-%d.lib' % self.serf_ver_maj - else: - serflib = 'serf.lib' - - apr_static = self.static_apr and 'APR_STATIC=1' or '' - openssl_static = self.static_openssl and 'OPENSSL_STATIC=1' or '' - self.move_proj_file(self.serf_path, name, - (('serf_sources', serf_sources), - ('serf_headers', serf_headers), - ('zlib_path', os.path.relpath(self.zlib_path, - self.serf_path)), - ('openssl_path', os.path.relpath(self.openssl_path, - self.serf_path)), - ('apr_path', os.path.relpath(self.apr_path, - self.serf_path)), - ('apr_util_path', os.path.relpath(self.apr_util_path, - self.serf_path)), - ('project_guid', self.makeguid('serf')), - ('apr_static', apr_static), - ('openssl_static', openssl_static), - ('serf_lib', serflib), - )) - def move_proj_file(self, path, name, params=()): ### Move our slightly templatized pre-built project files into place -- ### these projects include zlib, serf, locale, config, etc. @@ -1254,471 +975,17 @@ class WinGeneratorBase(GeneratorBase): raise NotImplementedError - def _find_perl(self): - "Find the right perl library name to link swig bindings with" - self.perl_includes = [] - self.perl_libdir = None - fp = os.popen('perl -MConfig -e ' + escape_shell_arg( - 'print "$Config{PERL_REVISION}$Config{PERL_VERSION}"'), 'r') - try: - line = fp.readline() - if line: - msg = 'Found installed perl version number.' - self.perl_lib = 'perl' + line.rstrip() + '.lib' - else: - msg = 'Could not detect perl version.' - self.perl_lib = 'perl56.lib' - print('%s\n Perl bindings will be linked with %s\n' - % (msg, self.perl_lib)) - finally: - fp.close() - - fp = os.popen('perl -MConfig -e ' + escape_shell_arg( - 'print $Config{archlib}'), 'r') - try: - line = fp.readline() - if line: - self.perl_libdir = os.path.join(line, 'CORE') - self.perl_includes = [os.path.join(line, 'CORE')] - finally: - fp.close() - - def _find_ruby(self): - "Find the right Ruby library name to link swig bindings with" - self.ruby_includes = [] - self.ruby_libdir = None - self.ruby_version = None - self.ruby_major_version = None - self.ruby_minor_version = None - # Pass -W0 to stifle the "-e:1: Use RbConfig instead of obsolete - # and deprecated Config." warning if we are using Ruby 1.9. - proc = os.popen('ruby -rrbconfig -W0 -e ' + escape_shell_arg( - "puts Config::CONFIG['ruby_version'];" - "puts Config::CONFIG['LIBRUBY'];" - "puts Config::CONFIG['archdir'];" - "puts Config::CONFIG['libdir'];"), 'r') - try: - rubyver = proc.readline()[:-1] - if rubyver: - self.ruby_version = rubyver - self.ruby_major_version = string.atoi(self.ruby_version[0]) - self.ruby_minor_version = string.atoi(self.ruby_version[2]) - libruby = proc.readline()[:-1] - if libruby: - msg = 'Found installed ruby %s' % rubyver - self.ruby_lib = libruby - self.ruby_includes.append(proc.readline()[:-1]) - self.ruby_libdir = proc.readline()[:-1] - else: - msg = 'Could not detect Ruby version, assuming 1.8.' - self.ruby_version = "1.8" - self.ruby_major_version = 1 - self.ruby_minor_version = 8 - self.ruby_lib = 'msvcrt-ruby18.lib' - print('%s\n Ruby bindings will be linked with %s\n' - % (msg, self.ruby_lib)) - finally: - proc.close() - - def _find_python(self): - "Find the appropriate options for creating SWIG-based Python modules" - self.python_includes = [] - self.python_libdir = "" - try: - from distutils import sysconfig - inc = sysconfig.get_python_inc() - plat = sysconfig.get_python_inc(plat_specific=1) - self.python_includes.append(inc) - if inc != plat: - self.python_includes.append(plat) - self.python_libdir = self.apath(sysconfig.PREFIX, "libs") - except ImportError: - pass - - def _find_jdk(self): - if not self.jdk_path: - jdk_ver = None - try: - try: - # Python >=3.0 - import winreg - except ImportError: - # Python <3.0 - import _winreg as winreg - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, - r"SOFTWARE\JavaSoft\Java Development Kit") - # Find the newest JDK version. - num_values = winreg.QueryInfoKey(key)[1] - for i in range(num_values): - (name, value, key_type) = winreg.EnumValue(key, i) - if name == "CurrentVersion": - jdk_ver = value - break - - # Find the JDK path. - if jdk_ver is not None: - key = winreg.OpenKey(key, jdk_ver) - num_values = winreg.QueryInfoKey(key)[1] - for i in range(num_values): - (name, value, key_type) = winreg.EnumValue(key, i) - if name == "JavaHome": - self.jdk_path = value - break - winreg.CloseKey(key) - except (ImportError, EnvironmentError): - pass - if self.jdk_path: - print("Found JDK version %s in %s\n" % (jdk_ver, self.jdk_path)) - else: - print("Using JDK in %s\n" % (self.jdk_path)) - - def _find_swig(self): - # Require 1.3.24. If not found, assume 1.3.25. - default_version = '1.3.25' - minimum_version = '1.3.24' - vernum = 103025 - minimum_vernum = 103024 - libdir = '' - - if self.swig_path is not None: - self.swig_exe = os.path.abspath(os.path.join(self.swig_path, 'swig')) - else: - self.swig_exe = 'swig' - - try: - outfp = subprocess.Popen([self.swig_exe, '-version'], stdout=subprocess.PIPE, universal_newlines=True).stdout - txt = outfp.read() - if txt: - vermatch = re.compile(r'^SWIG\ Version\ (\d+)\.(\d+)\.(\d+)$', re.M) \ - .search(txt) - else: - vermatch = None - - if vermatch: - version = tuple(map(int, vermatch.groups())) - # build/ac-macros/swig.m4 explains the next incantation - vernum = int('%d%02d%03d' % version) - print('Found installed SWIG version %d.%d.%d\n' % version) - if vernum < minimum_vernum: - print('WARNING: Subversion requires version %s\n' - % minimum_version) - - libdir = self._find_swig_libdir() - else: - print('Could not find installed SWIG,' - ' assuming version %s\n' % default_version) - self.swig_libdir = '' - outfp.close() - except OSError: - print('Could not find installed SWIG,' - ' assuming version %s\n' % default_version) - self.swig_libdir = '' - - self.swig_vernum = vernum - self.swig_libdir = libdir - - def _find_swig_libdir(self): - fp = os.popen(self.swig_exe + ' -swiglib', 'r') - try: - libdir = fp.readline().rstrip() - if libdir: - print('Using SWIG library directory %s\n' % libdir) - return libdir - else: - print('WARNING: could not find SWIG library directory\n') - finally: - fp.close() - return '' - - def _find_ml(self): - "Check if the ML assembler is in the path" - if not self.enable_ml: - self.have_ml = 0 - return - fp = os.popen('ml /help', 'r') - try: - line = fp.readline() - if line: - msg = 'Found ML, ZLib build will use ASM sources' - self.have_ml = 1 - else: - msg = 'Could not find ML, ZLib build will not use ASM sources' - self.have_ml = 0 - print('%s\n' % (msg,)) - finally: - fp.close() - - def _get_serf_version(self): - "Retrieves the serf version from serf.h" - - # shouldn't be called unless serf is there - assert self.serf_path and os.path.exists(self.serf_path) - - self.serf_ver_maj = None - self.serf_ver_min = None - self.serf_ver_patch = None - - # serf.h should be present - if not os.path.exists(os.path.join(self.serf_path, 'serf.h')): - return None, None, None - - txt = open(os.path.join(self.serf_path, 'serf.h')).read() - - maj_match = re.search(r'SERF_MAJOR_VERSION\s+(\d+)', txt) - min_match = re.search(r'SERF_MINOR_VERSION\s+(\d+)', txt) - patch_match = re.search(r'SERF_PATCH_VERSION\s+(\d+)', txt) - if maj_match: - self.serf_ver_maj = int(maj_match.group(1)) - if min_match: - self.serf_ver_min = int(min_match.group(1)) - if patch_match: - self.serf_ver_patch = int(patch_match.group(1)) - - return self.serf_ver_maj, self.serf_ver_min, self.serf_ver_patch - - def _find_serf(self): - "Check if serf and its dependencies are available" - - minimal_serf_version = (1, 2, 1) - - if self.openssl_path and os.path.exists(self.openssl_path): - version_path = os.path.join(self.openssl_path, 'inc32/openssl/opensslv.h') - if os.path.isfile(version_path): - # We have an OpenSSL Source location (legacy handling) - self.openssl_inc_dir = os.path.join(self.openssl_path, 'inc32') - if self.static_openssl: - self.openssl_lib_dir = os.path.join(self.openssl_path, 'out32') - else: - self.openssl_lib_dir = os.path.join(self.openssl_path, 'out32dll') - elif os.path.isfile(os.path.join(self.openssl_path, - 'include/openssl/opensslv.h')): - self.openssl_inc_dir = os.path.join(self.openssl_path, 'include') - self.openssl_lib_dir = os.path.join(self.openssl_path, 'lib') - else: - print('WARNING: \'opensslv.h\' not found') - self.openssl_path = None - - self.serf_lib = None - if self.serf_path and os.path.exists(self.serf_path): - if self.openssl_path and os.path.exists(self.openssl_path): - self.serf_lib = 'serf' - version = self._get_serf_version() - if None in version: - msg = 'Unknown serf version found; but, will try to build ' \ - 'ra_serf.' - else: - self.serf_ver = '.'.join(str(v) for v in version) - if version < minimal_serf_version: - self.serf_lib = None - msg = 'Found serf %s, but >= %s is required. ra_serf will not be built.\n' % \ - (self.serf_ver, '.'.join(str(v) for v in minimal_serf_version)) - else: - msg = 'Found serf %s' % self.serf_ver - print(msg) - else: - print('openssl not found, ra_serf will not be built\n') - else: - print('serf not found, ra_serf will not be built\n') - - def _find_apr(self): - "Find the APR library and version" - - minimal_apr_version = (0, 9, 0) - - version_file_path = os.path.join(self.apr_path, 'include', - 'apr_version.h') - - if not os.path.exists(version_file_path): - sys.stderr.write("ERROR: '%s' not found.\n" % version_file_path); - sys.stderr.write("Use '--with-apr' option to configure APR location.\n"); - sys.exit(1) - - fp = open(version_file_path) - txt = fp.read() - fp.close() - - vermatch = re.search(r'^\s*#define\s+APR_MAJOR_VERSION\s+(\d+)', txt, re.M) - major = int(vermatch.group(1)) - - vermatch = re.search(r'^\s*#define\s+APR_MINOR_VERSION\s+(\d+)', txt, re.M) - minor = int(vermatch.group(1)) - - vermatch = re.search(r'^\s*#define\s+APR_PATCH_VERSION\s+(\d+)', txt, re.M) - patch = int(vermatch.group(1)) - - version = (major, minor, patch) - self.apr_version = '%d.%d.%d' % version - - suffix = '' - if major > 0: - suffix = '-%d' % major - - if self.static_apr: - self.apr_lib = 'apr%s.lib' % suffix - else: - self.apr_lib = 'libapr%s.lib' % suffix - - if version < minimal_apr_version: - sys.stderr.write("ERROR: apr %s or higher is required " - "(%s found)\n" % ( - '.'.join(str(v) for v in minimal_apr_version), - self.apr_version)) - sys.exit(1) - else: - print('Found apr %s' % self.apr_version) - - def _find_apr_util(self): - "Find the APR-util library and version" - - minimal_aprutil_version = (0, 9, 0) - version_file_path = os.path.join(self.apr_util_path, 'include', - 'apu_version.h') - - if not os.path.exists(version_file_path): - sys.stderr.write("ERROR: '%s' not found.\n" % version_file_path); - sys.stderr.write("Use '--with-apr-util' option to configure APR-Util location.\n"); - sys.exit(1) - - fp = open(version_file_path) - txt = fp.read() - fp.close() - - vermatch = re.search(r'^\s*#define\s+APU_MAJOR_VERSION\s+(\d+)', txt, re.M) - major = int(vermatch.group(1)) - - vermatch = re.search(r'^\s*#define\s+APU_MINOR_VERSION\s+(\d+)', txt, re.M) - minor = int(vermatch.group(1)) - - vermatch = re.search(r'^\s*#define\s+APU_PATCH_VERSION\s+(\d+)', txt, re.M) - patch = int(vermatch.group(1)) - - version = (major, minor, patch) - self.aprutil_version = '%d.%d.%d' % version - - suffix = '' - if major > 0: - suffix = '-%d' % major - - if self.static_apr: - self.aprutil_lib = 'aprutil%s.lib' % suffix - else: - self.aprutil_lib = 'libaprutil%s.lib' % suffix - - if version < minimal_aprutil_version: - sys.stderr.write("ERROR: aprutil %s or higher is required " - "(%s found)\n" % ( - '.'.join(str(v) for v in minimal_aprutil_version), - self.aprutil_version)) - sys.exit(1) - else: - print('Found aprutil %s' % self.aprutil_version) - - def _find_sqlite(self): - "Find the Sqlite library and version" - - minimal_sqlite_version = (3, 7, 12) - - header_file = os.path.join(self.sqlite_path, 'inc', 'sqlite3.h') - - # First check for compiled version of SQLite. - if os.path.exists(header_file): - # Compiled SQLite seems found, check for sqlite3.lib file. - lib_file = os.path.join(self.sqlite_path, 'lib', 'sqlite3.lib') - if not os.path.exists(lib_file): - sys.stderr.write("ERROR: '%s' not found.\n" % lib_file) - sys.stderr.write("Use '--with-sqlite' option to configure sqlite location.\n"); - sys.exit(1) - self.sqlite_inline = False - else: - # Compiled SQLite not found. Try amalgamation version. - amalg_file = os.path.join(self.sqlite_path, 'sqlite3.c') - if not os.path.exists(amalg_file): - sys.stderr.write("ERROR: SQLite not found in '%s' directory.\n" % self.sqlite_path) - sys.stderr.write("Use '--with-sqlite' option to configure sqlite location.\n"); - sys.exit(1) - header_file = os.path.join(self.sqlite_path, 'sqlite3.h') - self.sqlite_inline = True - - fp = open(header_file) - txt = fp.read() - fp.close() - vermatch = re.search(r'^\s*#define\s+SQLITE_VERSION\s+"(\d+)\.(\d+)\.(\d+)(?:\.(\d))?"', txt, re.M) - - version = vermatch.groups() - - # Sqlite doesn't add patch numbers for their ordinary releases - if not version[3]: - version = version[0:3] - - version = tuple(map(int, version)) - - self.sqlite_version = '.'.join(str(v) for v in version) - - if version < minimal_sqlite_version: - sys.stderr.write("ERROR: sqlite %s or higher is required " - "(%s found)\n" % ( - '.'.join(str(v) for v in minimal_sqlite_version), - self.sqlite_version)) - sys.exit(1) - else: - print('Found SQLite %s' % self.sqlite_version) - - def _find_zlib(self): - "Find the ZLib library and version" - - if not self.zlib_path: - self.zlib_version = '1' - return - - header_file = os.path.join(self.zlib_path, 'zlib.h') - - if not os.path.exists(header_file): - self.zlib_version = '1' - return - - fp = open(header_file) - txt = fp.read() - fp.close() - vermatch = re.search(r'^\s*#define\s+ZLIB_VERSION\s+"(\d+)\.(\d+)\.(\d+)(?:\.\d)?"', txt, re.M) - - version = tuple(map(int, vermatch.groups())) - - self.zlib_version = '%d.%d.%d' % version - - print('Found ZLib %s' % self.zlib_version) - class ProjectItem: "A generic item class for holding sources info, config info, etc for a project" def __init__(self, **kw): + self.ignored = None vars(self).update(kw) # ============================================================================ -# This is a cut-down and modified version of code from: -# subversion/subversion/bindings/swig/python/svn/core.py -# -if sys.platform == "win32": - _escape_shell_arg_re = re.compile(r'(\\+)(\"|$)') - - def escape_shell_arg(arg): - # The (very strange) parsing rules used by the C runtime library are - # described at: - # http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_Parsing_C.2b2b_.Command.2d.Line_Arguments.asp - - # double up slashes, but only if they are followed by a quote character - arg = re.sub(_escape_shell_arg_re, r'\1\1\2', arg) - - # surround by quotes and escape quotes inside - arg = '"' + arg.replace('"', '"^""') + '"' - return arg - -else: - def escape_shell_arg(str): - return "'" + str.replace("'", "'\\''") + "'" - -# ============================================================================ FILTER_LIBS = 1 FILTER_PROJECTS = 2 +FILTER_EXTERNALLIBS = 3 class POFile: "Item class for holding po file info" diff --git a/build/generator/gen_win_dependencies.py b/build/generator/gen_win_dependencies.py new file mode 100644 index 0000000..68a1784 --- /dev/null +++ b/build/generator/gen_win_dependencies.py @@ -0,0 +1,1465 @@ +# +# +# 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_win_dependencies.py +# +# base class for generating windows projects, containing the +# dependency locator code shared between the test runner and +# the make file generators +# + +import os +import sys +import fnmatch +import re +import subprocess +import string + +if sys.version_info[0] >= 3: + # Python >=3.0 + from io import StringIO +else: + # Python <3.0 + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + +import gen_base +import ezt + +class SVNCommonLibrary: + + def __init__(self, name, include_dirs, lib_dir, lib_name, version=None, + debug_lib_dir=None, debug_lib_name=None, dll_dir=None, + dll_name=None, debug_dll_dir=None, debug_dll_name=None, + defines=[], forced_includes=[], extra_bin=[]): + self.name = name + if include_dirs: + self.include_dirs = include_dirs if isinstance(include_dirs, list) \ + else [include_dirs] + else: + self.include_dirs = [] + self.defines = defines if not defines or isinstance(defines, list) else [defines] + self.lib_dir = lib_dir + self.lib_name = lib_name + self.version = version + self.dll_dir = dll_dir + self.dll_name = dll_name + + self.forced_includes = forced_includes if not forced_includes \ + or isinstance(forced_includes, list) \ + else [forced_includes] + + if debug_lib_dir: + self.debug_lib_dir = debug_lib_dir + else: + self.debug_lib_dir = lib_dir + + if debug_lib_name: + self.debug_lib_name = debug_lib_name + else: + self.debug_lib_name = lib_name + + if debug_dll_dir: + self.debug_dll_dir = debug_dll_dir + else: + self.debug_dll_dir = dll_dir + + if debug_dll_name: + self.debug_dll_name = debug_dll_name + else: + self.debug_dll_name = dll_name + + self.extra_bin = extra_bin + +class GenDependenciesBase(gen_base.GeneratorBase): + """This intermediate base class exists to be instantiated by win-tests.py, + in order to obtain information from build.conf and library paths without + actually doing any generation.""" + _extension_map = { + ('exe', 'target'): '.exe', + ('exe', 'object'): '.obj', + ('lib', 'target'): '.dll', + ('lib', 'object'): '.obj', + ('pyd', 'target'): '.pyd', + ('pyd', 'object'): '.obj', + ('so', 'target'): '.so', + ('so', 'object'): '.obj', + } + + _libraries = {} # Dict of SVNCommonLibrary instances of found libraries + + _optional_libraries = [ # List of optional libraries to suppress warnings + 'db', + 'intl', + 'serf', + 'sasl', + 'swig', + 'perl', + 'python', + 'ruby', + 'java_sdk', + 'openssl', + 'apr_memcache', + + # So optional, we don't even have any code to detect them on Windows + 'magic', + ] + + # When build.conf contains a 'when = SOMETHING' where SOMETHING is not in + # this list, then the project is not generated on Windows. + _windows_when = [ + 'INSTALL_APACHE_MODS', + # not 'SVN_USE_GMOCK', + ] + + def parse_options(self, options): + self.apr_path = 'apr' + self.apr_util_path = 'apr-util' + self.apr_iconv_path = 'apr-iconv' + self.serf_path = None + self.bdb_path = None + self.httpd_path = None + self.libintl_path = None + self.zlib_path = 'zlib' + self.openssl_path = None + self.jdk_path = None + self.junit_path = None + self.swig_path = None + self.vs_version = '2002' + self.sln_version = '7.00' + self.vcproj_version = '7.00' + self.vcproj_extension = '.vcproj' + self.sqlite_path = 'sqlite-amalgamation' + self.skip_sections = { 'mod_dav_svn': None, + 'mod_authz_svn': None, + 'mod_dontdothat' : None, + 'libsvn_auth_kwallet': None, + 'libsvn_auth_gnome_keyring': None } + + # Instrumentation options + self.disable_shared = None + self.static_apr = None + self.static_openssl = None + self.instrument_apr_pools = None + self.instrument_purify_quantify = None + self.sasl_path = None + self.cpp_defines = [] + + # NLS options + self.enable_nls = None + + for opt, val in options: + if opt == '--with-berkeley-db': + self.bdb_path = val + elif opt == '--with-apr': + self.apr_path = val + elif opt == '--with-apr-util': + self.apr_util_path = val + elif opt == '--with-apr-iconv': + self.apr_iconv_path = val + elif opt == '--with-serf': + self.serf_path = val + elif opt == '--with-httpd': + self.httpd_path = val + del self.skip_sections['mod_dav_svn'] + del self.skip_sections['mod_authz_svn'] + del self.skip_sections['mod_dontdothat'] + elif opt == '--with-libintl': + self.libintl_path = val + self.enable_nls = 1 + elif opt == '--with-jdk': + self.jdk_path = val + elif opt == '--with-junit': + self.junit_path = val + elif opt == '--with-zlib': + self.zlib_path = val + elif opt == '--with-swig': + self.swig_path = val + elif opt == '--with-sqlite': + self.sqlite_path = val + elif opt == '--with-sasl': + self.sasl_path = val + elif opt == '--with-openssl': + self.openssl_path = val + elif opt == '--enable-purify': + self.instrument_purify_quantify = 1 + self.instrument_apr_pools = 1 + elif opt == '--enable-quantify': + self.instrument_purify_quantify = 1 + elif opt == '--enable-pool-debug': + self.instrument_apr_pools = 1 + elif opt == '--enable-nls': + self.enable_nls = 1 + elif opt == '--disable-shared': + self.disable_shared = 1 + elif opt == '--with-static-apr': + self.static_apr = 1 + elif opt == '--with-static-openssl': + self.static_openssl = 1 + elif opt == '-D': + self.cpp_defines.append(val) + elif opt == '--vsnet-version': + if val == '2002' or re.match('^7(\.\d+)?$', val): + self.vs_version = '2002' + self.sln_version = '7.00' + self.vcproj_version = '7.00' + self.vcproj_extension = '.vcproj' + elif val == '2003' or re.match('^8(\.\d+)?$', val): + self.vs_version = '2003' + self.sln_version = '8.00' + self.vcproj_version = '7.10' + self.vcproj_extension = '.vcproj' + elif val == '2005' or re.match('^9(\.\d+)?$', val): + self.vs_version = '2005' + self.sln_version = '9.00' + self.vcproj_version = '8.00' + self.vcproj_extension = '.vcproj' + elif val == '2008' or re.match('^10(\.\d+)?$', val): + self.vs_version = '2008' + self.sln_version = '10.00' + self.vcproj_version = '9.00' + self.vcproj_extension = '.vcproj' + elif val == '2010': + self.vs_version = '2010' + self.sln_version = '11.00' + self.vcproj_version = '10.0' + self.vcproj_extension = '.vcxproj' + elif val == '2012' or val == '11': + self.vs_version = '2012' + self.sln_version = '12.00' + self.vcproj_version = '11.0' + self.vcproj_extension = '.vcxproj' + elif val == '2013' or val == '12': + self.vs_version = '2013' + self.sln_version = '12.00' + self.vcproj_version = '12.0' + self.vcproj_extension = '.vcxproj' + elif val == '2015' or val == '14': + self.vs_version = '2015' + self.sln_version = '12.00' + self.vcproj_version = '14.0' + self.vcproj_extension = '.vcxproj' + elif re.match('^20\d+$', val): + print('WARNING: Unknown VS.NET version "%s",' + ' assuming VS2012. Your VS can probably upgrade') + self.vs_version = '2012' + self.sln_version = '12.00' + self.vcproj_version = '11.0' + self.vcproj_extension = '.vcxproj' + elif re.match('^1\d+$', val): + self.vs_version = val + self.sln_version = '12.00' + self.vcproj_version = val + '.0' + self.vcproj_extension = '.vcxproj' + else: + print('WARNING: Unknown VS.NET version "%s",' + ' assuming "%s"\n' % (val, '7.00')) + + + def __init__(self, fname, verfname, options, find_libs=True): + + # parse (and save) the options that were passed to us + self.parse_options(options) + + # Initialize parent + gen_base.GeneratorBase.__init__(self, fname, verfname, options) + + # These files will be excluded from the build when they're not + # explicitly listed as project sources. + self._excluded_from_build = frozenset(self.private_includes + + self.private_built_includes) + + if find_libs: + self.find_libraries(False) + + def find_libraries(self, show_warnings): + "find required and optional libraries" + + # Required dependencies + self._find_apr() + self._find_apr_util_etc() + self._find_zlib() + self._find_sqlite(show_warnings) + + # Optional dependencies + self._find_httpd(show_warnings) + self._find_bdb(show_warnings) + self._find_openssl(show_warnings) + self._find_serf(show_warnings) + self._find_sasl(show_warnings) + self._find_libintl(show_warnings) + + self._find_jdk(show_warnings) + + # Swig (optional) dependencies + if self._find_swig(show_warnings): + self._find_perl(show_warnings) + self._find_python(show_warnings) + self._find_ruby(show_warnings) + + def _find_apr(self): + "Find the APR library and version" + + minimal_apr_version = (1, 3, 0) + + if not self.apr_path: + sys.stderr.write("ERROR: Use '--with-apr' option to configure APR " + \ + "location.\n") + sys.exit(1) + + inc_base = os.path.join(self.apr_path, 'include') + + if os.path.isfile(os.path.join(inc_base, 'apr-1', 'apr_version.h')): + inc_path = os.path.join(inc_base, 'apr-1') + elif os.path.isfile(os.path.join(inc_base, 'apr_version.h')): + inc_path = inc_base + else: + sys.stderr.write("ERROR: 'apr_version' not found.\n") + sys.stderr.write("Use '--with-apr' option to configure APR location.\n") + sys.exit(1) + + version_file_path = os.path.join(inc_path, 'apr_version.h') + txt = open(version_file_path).read() + + vermatch = re.search(r'^\s*#define\s+APR_MAJOR_VERSION\s+(\d+)', txt, re.M) + major = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+APR_MINOR_VERSION\s+(\d+)', txt, re.M) + minor = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+APR_PATCH_VERSION\s+(\d+)', txt, re.M) + patch = int(vermatch.group(1)) + + version = (major, minor, patch) + self.apr_version = apr_version = '%d.%d.%d' % version + + if version < minimal_apr_version: + sys.stderr.write("ERROR: apr %s or higher is required " + "(%s found)\n" % ( + '.'.join(str(v) for v in minimal_apr_version), + self.apr_version)) + sys.exit(1) + + suffix = '' + if major > 0: + suffix = '-%d' % major + + defines = [] + if self.static_apr: + lib_name = 'apr%s.lib' % suffix + lib_dir = os.path.join(self.apr_path, 'LibR') + dll_dir = None + debug_dll_dir = None + dll_name = None + defines.extend(["APR_DECLARE_STATIC"]) + + if not os.path.isdir(lib_dir) and \ + os.path.isfile(os.path.join(self.apr_path, 'lib', lib_name)): + # Installed APR instead of APR-Source + lib_dir = os.path.join(self.apr_path, 'lib') + debug_lib_dir = None + else: + debug_lib_dir = os.path.join(self.apr_path, 'LibD') + else: + lib_name = 'libapr%s.lib' % suffix + + if os.path.isfile(os.path.join(self.apr_path, 'lib', lib_name)): + # Installed APR instead of APR-Source + lib_dir = os.path.join(self.apr_path, 'lib') + debug_lib_dir = None + else: + lib_dir = os.path.join(self.apr_path, 'Release') + if os.path.isfile(os.path.join(self.apr_path, 'Debug', lib_name)): + debug_lib_dir = os.path.join(self.apr_path, 'Debug') + else: + debug_lib_dir = None + + dll_name = 'libapr%s.dll' % suffix + if os.path.isfile(os.path.join(lib_dir, dll_name)): + dll_dir = lib_dir + debug_dll_dir = debug_lib_dir + else: + dll_dir = os.path.join(self.apr_path, 'bin') + debug_dll_dir = None + + extra_bin = [] + + if dll_dir: + bin_files = os.listdir(dll_dir) + if debug_dll_dir and os.path.isdir(debug_dll_dir): + debug_bin_files = os.listdir(debug_dll_dir) + else: + debug_bin_files = bin_files + + for bin in bin_files: + if bin in debug_bin_files: + if re.match('^(lib)?apr[-_].*' + suffix + '(d)?.dll$', bin): + extra_bin.append(bin) + + self._libraries['apr'] = SVNCommonLibrary('apr', inc_path, lib_dir, lib_name, + apr_version, + debug_lib_dir=debug_lib_dir, + dll_dir=dll_dir, + dll_name=dll_name, + debug_dll_dir=debug_dll_dir, + defines=defines, + extra_bin=extra_bin) + + def _find_apr_util_etc(self): + "Find the APR-util library and version" + + minimal_aprutil_version = (1, 3, 0) + + inc_base = os.path.join(self.apr_util_path, 'include') + + if os.path.isfile(os.path.join(inc_base, 'apr-1', 'apu_version.h')): + inc_path = os.path.join(inc_base, 'apr-1') + elif os.path.isfile(os.path.join(inc_base, 'apu_version.h')): + inc_path = inc_base + else: + sys.stderr.write("ERROR: 'apu_version' not found.\n") + sys.stderr.write("Use '--with-apr-util' option to configure APR-Util location.\n") + sys.exit(1) + + version_file_path = os.path.join(inc_path, 'apu_version.h') + txt = open(version_file_path).read() + + vermatch = re.search(r'^\s*#define\s+APU_MAJOR_VERSION\s+(\d+)', txt, re.M) + major = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+APU_MINOR_VERSION\s+(\d+)', txt, re.M) + minor = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+APU_PATCH_VERSION\s+(\d+)', txt, re.M) + patch = int(vermatch.group(1)) + + version = (major, minor, patch) + self.aprutil_version = aprutil_version = '%d.%d.%d' % version + + if version < minimal_aprutil_version: + sys.stderr.write("ERROR: apr-util %s or higher is required " + "(%s found)\n" % ( + '.'.join(str(v) for v in minimal_aprutil_version), + aprutil_version)) + sys.exit(1) + + suffix = '' + if major > 0: + suffix = '-%d' % major + + defines = [] + if self.static_apr: + lib_name = 'aprutil%s.lib' % suffix + lib_dir = os.path.join(self.apr_util_path, 'LibR') + dll_dir = None + debug_dll_dir = None + dll_name = None + defines.extend(["APU_DECLARE_STATIC"]) + + if not os.path.isdir(lib_dir) and \ + os.path.isfile(os.path.join(self.apr_util_path, 'lib', lib_name)): + # Installed APR-Util instead of APR-Util-Source + lib_dir = os.path.join(self.apr_util_path, 'lib') + debug_lib_dir = None + else: + debug_lib_dir = os.path.join(self.apr_util_path, 'LibD') + else: + lib_name = 'libaprutil%s.lib' % suffix + lib_dir = os.path.join(self.apr_util_path, 'Release') + + if not os.path.isdir(lib_dir) and \ + os.path.isfile(os.path.join(self.apr_util_path, 'lib', lib_name)): + # Installed APR-Util instead of APR-Util-Source + lib_dir = os.path.join(self.apr_util_path, 'lib') + debug_lib_dir = lib_dir + else: + debug_lib_dir = os.path.join(self.apr_util_path, 'Debug') + + dll_name = 'libaprutil%s.dll' % suffix + if os.path.isfile(os.path.join(lib_dir, dll_name)): + dll_dir = lib_dir + debug_dll_dir = debug_lib_dir + else: + dll_dir = os.path.join(self.apr_util_path, 'bin') + debug_dll_dir = None + + extra_bin = [] + + if dll_dir: + bin_files = os.listdir(dll_dir) + if debug_dll_dir and os.path.isdir(debug_dll_dir): + debug_bin_files = os.listdir(debug_dll_dir) + else: + debug_bin_files = bin_files + + for bin in bin_files: + if bin in debug_bin_files: + if re.match('^(lib)?aprutil[-_].*' + suffix + '(d)?.dll$', bin): + extra_bin.append(bin) + + self._libraries['aprutil'] = SVNCommonLibrary('apr-util', inc_path, lib_dir, + lib_name, + aprutil_version, + debug_lib_dir=debug_lib_dir, + dll_dir=dll_dir, + dll_name=dll_name, + debug_dll_dir=debug_dll_dir, + defines=defines, + extra_bin=extra_bin) + + # Perhaps apr-util can also provide memcached support + if version >= (1, 3, 0) : + self._libraries['apr_memcache'] = SVNCommonLibrary( + 'apr_memcache', inc_path, lib_dir, + None, aprutil_version, + defines=['SVN_HAVE_MEMCACHE']) + + # And now find expat + # If we have apr-util as a source location, it is in a subdir. + # If we have an install package it is in the lib subdir + if os.path.exists(os.path.join(self.apr_util_path, 'xml/expat')): + inc_path = os.path.join(self.apr_util_path, 'xml/expat/lib') + lib_dir = os.path.join(self.apr_util_path, 'xml/expat/lib/LibR') + debug_lib_dir = os.path.join(self.apr_util_path, 'xml/expat/lib/LibD') + else: + inc_path = os.path.join(self.apr_util_path, 'include') + lib_dir = os.path.join(self.apr_util_path, 'lib') + debug_lib_dir = None + + version_file_path = os.path.join(inc_path, 'expat.h') + + if not os.path.exists(version_file_path): + sys.stderr.write("ERROR: '%s' not found.\n" % version_file_path); + sys.stderr.write("Use '--with-apr-util' option to configure APR-Util's XML location.\n"); + sys.exit(1) + + txt = open(version_file_path).read() + + vermatch = re.search(r'^\s*#define\s+XML_MAJOR_VERSION\s+(\d+)', txt, re.M) + major = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+XML_MINOR_VERSION\s+(\d+)', txt, re.M) + minor = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+XML_MICRO_VERSION\s+(\d+)', txt, re.M) + patch = int(vermatch.group(1)) + + # apr-Util 0.9-1.4 compiled expat to 'xml.lib', but apr-util 1.5 switched + # to the more common 'libexpat.lib' + libname = 'libexpat.lib' + if not os.path.exists(os.path.join(lib_dir, 'libexpat.lib')): + libname = 'xml.lib' + + version = (major, minor, patch) + xml_version = '%d.%d.%d' % version + + self._libraries['xml'] = SVNCommonLibrary('expat', inc_path, lib_dir, + libname, xml_version, + debug_lib_dir = debug_lib_dir, + defines=['XML_STATIC']) + + def _find_httpd(self, show_warnings): + "Find Apache HTTPD and version" + + minimal_httpd_version = (2, 2, 0) + if not self.httpd_path: + return + + inc_base = os.path.join(self.httpd_path, 'include') + + if os.path.isfile(os.path.join(inc_base, 'apache26', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache26') + elif os.path.isfile(os.path.join(inc_base, 'apache24', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache24') + elif os.path.isfile(os.path.join(inc_base, 'apache22', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache22') + elif os.path.isfile(os.path.join(inc_base, 'apache20', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache20') + elif os.path.isfile(os.path.join(inc_base, 'apache2', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache2') + elif os.path.isfile(os.path.join(inc_base, 'apache', 'ap_release.h')): + inc_path = os.path.join(inc_base, 'apache') + elif os.path.isfile(os.path.join(inc_base, 'ap_release.h')): + inc_path = inc_base + else: + if show_warnings: + print('WARNING: \'ap_release.h\' not found') + print("Use '--with-httpd' to configure openssl location."); + return + + version_file_path = os.path.join(inc_path, 'ap_release.h') + txt = open(version_file_path).read() + + vermatch = re.search(r'^\s*#define\s+AP_SERVER_MAJORVERSION_NUMBER\s+(\d+)', + txt, re.M) + major = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+AP_SERVER_MINORVERSION_NUMBER\s+(\d+)', + txt, re.M) + minor = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+AP_SERVER_PATCHLEVEL_NUMBER\s+(\d+)', + txt, re.M) + patch = int(vermatch.group(1)) + + version = (major, minor, patch) + httpd_version = '%d.%d.%d' % version + + if version < minimal_httpd_version: + if show_warnings: + print("WARNING: httpd %s or higher is required " + "(%s found)\n" % ( + '.'.join(str(v) for v in minimal_httpd_version), + httpd_version)) + return + + lib_name = 'libhttpd.lib' + lib_base = self.httpd_path + + debug_lib_dir = None + + if os.path.isfile(os.path.join(lib_base, 'lib', lib_name)): + # Install location + lib_dir = os.path.join(lib_base, 'lib') + elif os.path.isfile(os.path.join(lib_base, 'Release', lib_name)): + # Source location + lib_dir = os.path.join(lib_base, 'Release') + if os.path.isfile(os.path.join(lib_base, 'Debug', lib_name)): + debug_lib_dir = os.path.join(lib_base, 'Debug') + + # Our modules run inside httpd, so we don't have to find binaries + + self._libraries['httpd'] = SVNCommonLibrary('httpd', inc_path, lib_dir, lib_name, + httpd_version, + debug_lib_dir=debug_lib_dir, + defines=['AP_DECLARE_EXPORT']) + + # And now find mod_dav + + if os.path.isfile(os.path.join(inc_path, 'mod_dav.h')): + # Install location, we are lucky + inc_path = inc_path + elif os.path.isfile(os.path.join(lib_base, 'modules/dav/main/mod_dav.h')): + # Source location + inc_path = os.path.join(lib_base, 'modules/dav/main') + else: + if show_warnings: + print("WARNING: Can't find mod_dav.h in the httpd directory") + return + + lib_name = 'mod_dav.lib' + if os.path.isfile(os.path.join(lib_dir, lib_name)): + # Same location as httpd + lib_dir = lib_dir + elif os.path.isfile(os.path.join(lib_base, 'modules/dav/main/Release', lib_name)): + # Source location + lib_dir = os.path.join(lib_base, 'modules/dav/main/Release') + + if os.path.isfile(os.path.join(lib_base, 'modules/dav/main/Debug', lib_name)): + debug_lib_dir = os.path.join(lib_base, 'modules/dav/main/Debug') + else: + debug_lib_dir = None + else: + if show_warnings: + print("WARNING: Can't find mod_dav.lib in the httpd directory") + return + + self._libraries['mod_dav'] = SVNCommonLibrary('mod_dav', inc_path, lib_dir, lib_name, + httpd_version, + debug_lib_dir=debug_lib_dir) + + def _find_zlib(self): + "Find the ZLib library and version" + + minimal_zlib_version = (1, 2, 5) + + if not self.zlib_path or not os.path.isdir(self.zlib_path): + sys.stderr.write("ERROR: '%s' not found.\n" % self.zlib_path); + sys.stderr.write("Use '--with-zlib' option to configure ZLib location.\n"); + sys.exit(1) + + if os.path.isdir(os.path.join(self.zlib_path, 'include')): + # We have an install location + inc_path = os.path.join(self.zlib_path, 'include') + lib_path = os.path.join(self.zlib_path, 'lib') + + # Different build options produce different library names :( + if os.path.exists(os.path.join(lib_path, 'zlibstatic.lib')): + # CMake default: zlibstatic.lib (static) and zlib.lib (dll) + lib_name = 'zlibstatic.lib' + elif os.path.exists(os.path.join(lib_path, 'zlibstat.lib')): + # Visual Studio project file default: zlibstat.lib (static) and zlibwapi.lib (dll) + lib_name = 'zlibstat.lib' + else: + # Standard makefile produces zlib.lib (static) and zdll.lib (dll) + lib_name = 'zlib.lib' + debug_lib_name = None + else: + # We have a source location + inc_path = lib_path = self.zlib_path + lib_name = 'zlibstat.lib' + debug_lib_name = 'zlibstatD.lib' + + version_file_path = os.path.join(inc_path, 'zlib.h') + + if not os.path.exists(version_file_path): + sys.stderr.write("ERROR: '%s' not found.\n" % version_file_path); + sys.stderr.write("Use '--with-zlib' option to configure ZLib location.\n"); + sys.exit(1) + + txt = open(version_file_path).read() + vermatch = re.search( + r'^\s*#define\s+ZLIB_VERSION\s+"(\d+)\.(\d+)\.(\d+)(?:\.\d)?"', + txt, re.M) + + version = tuple(map(int, vermatch.groups())) + self.zlib_version = '%d.%d.%d' % version + + if version < minimal_zlib_version: + sys.stderr.write("ERROR: ZLib %s or higher is required " + "(%s found)\n" % ( + '.'.join(str(v) for v in minimal_zlib_version), + self.zlib_version)) + sys.exit(1) + + self._libraries['zlib'] = SVNCommonLibrary('zlib', inc_path, lib_path, lib_name, + self.zlib_version, + debug_lib_name=debug_lib_name) + + def _find_bdb(self, show_warnings): + "Find the Berkeley DB library and version" + + # try default path to detect BDB support, unless different path is + # specified so to keep pre 1.10-behavior for BDB detection on Windows + bdb_path = 'db4-win32' + + if self.bdb_path: + bdb_path = self.bdb_path + + inc_path = os.path.join(bdb_path, 'include') + db_h_path = os.path.join(inc_path, 'db.h') + + if not os.path.isfile(db_h_path): + if show_warnings and self.bdb_path: + print('WARNING: \'%s\' not found' % (db_h_path,)) + print("Use '--with-berkeley-db' to configure BDB location."); + return + + # Obtain bdb version from db.h + txt = open(db_h_path).read() + + maj_match = re.search(r'DB_VERSION_MAJOR\s+(\d+)', txt) + min_match = re.search(r'DB_VERSION_MINOR\s+(\d+)', txt) + patch_match = re.search(r'DB_VERSION_PATCH\s+(\d+)', txt) + + if maj_match and min_match and patch_match: + ver = (int(maj_match.group(1)), + int(min_match.group(1)), + int(patch_match.group(1))) + else: + return + + version = '%d.%d.%d' % ver + versuffix = '%d%d' % (ver[0], ver[1]) + + # Before adding "60" to this list, see build/ac-macros/berkeley-db.m4. + if versuffix not in ( + '50', '51', '52', '53', + '40', '41', '42', '43', '44', '45', '46', '47', '48', + ): + return + + lib_dir = os.path.join(bdb_path, 'lib') + lib_name = 'libdb%s.lib' % (versuffix,) + + if not os.path.exists(os.path.join(lib_dir, lib_name)): + return + + # Do we have a debug version? + debug_lib_name = 'libdb%sd.lib' % (versuffix,) + if not os.path.isfile(os.path.join(lib_dir, debug_lib_name)): + debug_lib_name = None + + dll_dir = os.path.join(bdb_path, 'bin') + + # Are there binaries we should copy for testing? + dll_name = os.path.splitext(lib_name)[0] + '.dll' + if not os.path.isfile(os.path.join(dll_dir, dll_name)): + dll_name = None + + if debug_lib_name: + debug_dll_name = os.path.splitext(debug_lib_name)[0] + '.dll' + if not os.path.isfile(os.path.join(dll_dir, debug_dll_name)): + debug_dll_name = None + else: + debug_dll_name = None + + # Usually apr-util doesn't find BDB on Windows, so we help apr-util + # by defining the value ourselves (Legacy behavior) + defines = ['APU_HAVE_DB=1', 'SVN_LIBSVN_FS_LINKS_FS_BASE'] + + self._libraries['db'] = SVNCommonLibrary('db', inc_path, lib_dir, lib_name, + version, + debug_lib_name=debug_lib_name, + dll_dir=dll_dir, + dll_name=dll_name, + debug_dll_name=debug_dll_name, + defines=defines) + + def _find_openssl(self, show_warnings): + "Find openssl" + + if not self.openssl_path: + return + + version_path = os.path.join(self.openssl_path, 'inc32/openssl/opensslv.h') + if os.path.isfile(version_path): + # We have an OpenSSL Source location + # For legacy reason + inc_dir = os.path.join(self.openssl_path, 'inc32') + if self.static_openssl: + lib_dir = os.path.join(self.openssl_path, 'out32') + bin_dir = None + else: + lib_dir = os.path.join(self.openssl_path, 'out32dll') + bin_dir = lib_dir + elif os.path.isfile(os.path.join(self.openssl_path, + 'include/openssl/opensslv.h')): + version_path = os.path.join(self.openssl_path, + 'include/openssl/opensslv.h') + inc_dir = os.path.join(self.openssl_path, 'include') + lib_dir = os.path.join(self.openssl_path, 'lib') + if self.static_openssl: + bin_dir = None + else: + bin_dir = os.path.join(self.openssl_path, 'bin') + else: + if show_warnings: + print('WARNING: \'opensslv.h\' not found') + print("Use '--with-openssl' to configure openssl location."); + return + + txt = open(version_path).read() + + vermatch = re.search( + r'#\s*define\s+OPENSSL_VERSION_TEXT\s+"OpenSSL\s+((\d+)\.(\d+).(\d+)([^ -]*))', + txt) + + version = (int(vermatch.group(2)), + int(vermatch.group(3)), + int(vermatch.group(4))) + openssl_version = vermatch.group(1) + + self._libraries['openssl'] = SVNCommonLibrary('openssl', inc_dir, lib_dir, + 'ssleay32.lib', + openssl_version, + dll_name='ssleay32.dll', + dll_dir=bin_dir) + + self._libraries['libeay32'] = SVNCommonLibrary('openssl', inc_dir, lib_dir, + 'libeay32.lib', + openssl_version, + dll_name='libeay32.dll', + dll_dir=bin_dir) + + def _find_perl(self, show_warnings): + "Find the right perl library name to link swig bindings with" + + fp = os.popen('perl -MConfig -e ' + escape_shell_arg( + 'print "$Config{libperl}\\n"; ' + 'print "$Config{PERL_REVISION}.$Config{PERL_VERSION}.' + '$Config{PERL_SUBVERSION}\\n"; ' + 'print "$Config{archlib}\\n"'), 'r') + try: + line = fp.readline() + if line: + perl_lib = line.strip() + else: + return + + line = fp.readline() + if line: + perl_version = line.strip() + perl_ver = perl_version.split('.') + else: + return + + line = fp.readline() + if line: + lib_dir = os.path.join(line.strip(), 'CORE') + inc_dir = lib_dir + finally: + fp.close() + + perl_ver = tuple(map(int, perl_ver)) + forced_includes = [] + + if perl_ver >= (5, 18, 0): + forced_includes.append('swigutil_pl__pre_perl.h') + + self._libraries['perl'] = SVNCommonLibrary('perl', inc_dir, lib_dir, + perl_lib, perl_version, + forced_includes=forced_includes) + + def _find_ruby(self, show_warnings): + "Find the right Ruby library name to link swig bindings with" + + lib_dir = None + inc_dirs = [] + + # Pass -W0 to stifle the "-e:1: Use RbConfig instead of obsolete + # and deprecated Config." warning if we are using Ruby 1.9. + fp = os.popen('ruby -rrbconfig -W0 -e ' + escape_shell_arg( + "puts RbConfig::CONFIG['ruby_version'];" + "puts RbConfig::CONFIG['LIBRUBY'];" + "puts RbConfig::CONFIG['libdir'];" + "puts RbConfig::CONFIG['rubyhdrdir'];" + "puts RbConfig::CONFIG['arch'];"), 'r') + try: + line = fp.readline() + if line: + ruby_version = line.strip() + + line = fp.readline() + if line: + ruby_lib = line.strip() + + line = fp.readline() + if line: + lib_dir = line.strip() + + line = fp.readline() + if line: + inc_base = line.strip() + inc_dirs = [inc_base] + + line = fp.readline() + if line: + inc_dirs.append(os.path.join(inc_base, line.strip())) + + finally: + fp.close() + + if not lib_dir: + return + + # Visual C++ prior to VS2015 doesn't have a standard compliant snprintf + if self.vs_version < '2015': + defines = ['snprintf=_snprintf'] + else: + defines = [] + + ver = ruby_version.split('.') + ver = tuple(map(int, ver)) + if ver >= (1, 8, 0): + defines.extend(["HAVE_RB_ERRINFO"]) + + forced_includes = [] + + if ver >= (1, 8, 0): + # Swig redefines NUM2LL as NUM2LONG if it isn't defined, but on Windows + # ruby 1.8+ declares NUM2LL as a static inline function. + # (LL2NUM and NUM2ULL don't have these problems) + defines.extend(['NUM2LL=NUM2LL']) + + if ver >= (1, 9, 0): + forced_includes.append('swigutil_rb__pre_ruby.h') + defines.extend(["SVN_SWIG_RUBY__CUSTOM_RUBY_CONFIG"]) + + self._libraries['ruby'] = SVNCommonLibrary('ruby', inc_dirs, lib_dir, + ruby_lib, ruby_version, + defines=defines, + forced_includes=forced_includes) + + def _find_python(self, show_warnings): + "Find the appropriate options for creating SWIG-based Python modules" + + try: + from distutils import sysconfig + + inc_dir = sysconfig.get_python_inc() + lib_dir = os.path.join(sysconfig.PREFIX, "libs") + except ImportError: + return + + self._libraries['python'] = SVNCommonLibrary('python', inc_dir, lib_dir, None, + sys.version.split(' ')[0]) + + def _find_jdk(self, show_warnings): + "Find details about an installed jdk" + + jdk_path = self.jdk_path + self.jdk_path = None # No jdk on errors + + minimal_jdk_version = (1, 0, 0) # ### Provide sane default + + if not jdk_path: + jdk_ver = None + try: + try: + # Python >=3.0 + import winreg + except ImportError: + # Python <3.0 + import _winreg as winreg + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, + r"SOFTWARE\JavaSoft\Java Development Kit") + # Find the newest JDK version. + num_values = winreg.QueryInfoKey(key)[1] + for i in range(num_values): + (name, value, key_type) = winreg.EnumValue(key, i) + if name == "CurrentVersion": + jdk_ver = value + break + + # Find the JDK path. + if jdk_ver is not None: + key = winreg.OpenKey(key, jdk_ver) + num_values = winreg.QueryInfoKey(key)[1] + for i in range(num_values): + (name, value, key_type) = winreg.EnumValue(key, i) + if name == "JavaHome": + jdk_path = value + break + winreg.CloseKey(key) + except (ImportError, EnvironmentError): + pass + + if not jdk_path or not os.path.isdir(jdk_path): + return + + try: + outfp = subprocess.Popen([os.path.join(jdk_path, 'bin', 'javah.exe'), + '-version'], stdout=subprocess.PIPE).stdout + line = outfp.read() + if line: + vermatch = re.search(r'"(([0-9]+(\.[0-9]+)+)(_[._0-9]+)?)"', line, re.M) + else: + vermatch = None + + if vermatch: + version = tuple(map(int, vermatch.groups()[1].split('.'))) + versionstr = vermatch.groups()[0] + else: + if show_warnings: + print('Could not find installed JDK,') + return + outfp.close() + except OSError: + if show_warnings: + print('Could not find installed JDK,') + return + + if version < minimal_jdk_version: + if show_warnings: + print('Found java jdk %s, but >= %s is required. ' + 'javahl will not be built.\n' % \ + (versionstr, '.'.join(str(v) for v in minimal_jdk_version))) + return + + self.jdk_path = jdk_path + inc_dirs = [ + os.path.join(jdk_path, 'include'), + os.path.join(jdk_path, 'include', 'win32'), + ] + + lib_dir = os.path.join(jdk_path, 'lib') + + # The JDK provides .lib files, but we currently don't use these. + self._libraries['java_sdk'] = SVNCommonLibrary('java-sdk', inc_dirs, + lib_dir, None, + versionstr) + + def _find_swig(self, show_warnings): + "Find details about an installed swig" + + minimal_swig_version = (1, 3, 25) + + if not self.swig_path: + swig_exe = 'swig.exe' + else: + swig_exe = os.path.abspath(os.path.join(self.swig_path, 'swig.exe')) + + if self.swig_path is not None: + self.swig_exe = os.path.abspath(os.path.join(self.swig_path, 'swig.exe')) + else: + self.swig_exe = 'swig' + + swig_version = None + try: + fp = subprocess.Popen([self.swig_exe, '-version'], + stdout=subprocess.PIPE).stdout + txt = fp.read() + if txt: + vermatch = re.search(r'^SWIG\ Version\ (\d+)\.(\d+)\.(\d+)', txt, re.M) + else: + vermatch = None + + if vermatch: + swig_version = tuple(map(int, vermatch.groups())) + fp.close() + except OSError: + swig_version = None + + if not swig_version: + if show_warnings: + print('Could not find installed SWIG') + return False + + swig_ver = '%d.%d.%d' % (swig_version) + if swig_version < minimal_swig_version: + if show_warnings: + print('Found swig %s, but >= %s is required. ' + 'the swig bindings will not be built.\n' % + (swig_version, '.'.join(str(v) for v in minimal_swig_version))) + return + + try: + fp = subprocess.Popen([self.swig_exe, '-swiglib'], + stdout=subprocess.PIPE).stdout + lib_dir = fp.readline().strip() + fp.close() + except OSError: + lib_dir = None + fp.close() + + if not lib_dir: + if show_warnings: + print('Could not find libdir of installed SWIG') + return False + + if (not self.swig_path and + os.path.isfile(os.path.join(lib_dir, '../swig.exe'))): + self.swig_path = os.path.dirname(lib_dir) + + inc_dirs = [ + 'subversion/bindings/swig', + 'subversion/bindings/swig/proxy', + 'subversion/bindings/swig/include', + ] + + self.swig_libdir = lib_dir + self.swig_version = swig_version + + self._libraries['swig'] = SVNCommonLibrary('swig', inc_dirs, lib_dir, None, + swig_ver) + return True + + def _get_serf_version(self, inc_dir): + "Retrieves the serf version from serf.h" + + # shouldn't be called unless serf is there + assert inc_dir and os.path.exists(inc_dir) + + serf_ver_maj = None + serf_ver_min = None + serf_ver_patch = None + + # serf.h should be present + if not os.path.exists(os.path.join(inc_dir, 'serf.h')): + return None, None, None + + txt = open(os.path.join(inc_dir, 'serf.h')).read() + + maj_match = re.search(r'SERF_MAJOR_VERSION\s+(\d+)', txt) + min_match = re.search(r'SERF_MINOR_VERSION\s+(\d+)', txt) + patch_match = re.search(r'SERF_PATCH_VERSION\s+(\d+)', txt) + if maj_match: + serf_ver_maj = int(maj_match.group(1)) + if min_match: + serf_ver_min = int(min_match.group(1)) + if patch_match: + serf_ver_patch = int(patch_match.group(1)) + + return serf_ver_maj, serf_ver_min, serf_ver_patch + + def _find_serf(self, show_warnings): + "Check if serf and its dependencies are available" + + minimal_serf_version = (1, 3, 4) + + if not self.serf_path: + return + + inc_dir = self.serf_path + + if os.path.isfile(os.path.join(inc_dir, 'serf.h')): + # Source layout + lib_dir = self.serf_path + debug_lib_dir = None + inc_dir = self.serf_path + elif os.path.isfile(os.path.join(self.serf_path, 'include/serf-1/serf.h')): + # Install layout + inc_dir = os.path.join(self.serf_path, 'include/serf-1') + lib_dir = os.path.join(self.serf_path, 'lib') + debug_lib_dir = None + elif os.path.isfile(os.path.join(self.serf_path, 'include/serf-2/serf.h')): + # Install layout + inc_dir = os.path.join(self.serf_path, 'include/serf-2') + lib_dir = os.path.join(self.serf_path, 'lib') + debug_lib_dir = None + else: + if show_warnings: + print('WARNING: \'serf.h\' not found') + print("Use '--with-serf' to configure serf location."); + return + + version = self._get_serf_version(inc_dir) + serf_version = '.'.join(str(v) for v in version) + + if version < minimal_serf_version: + if show_warnings: + print('Found serf %s, but >= %s is required. ' + 'ra_serf will not be built.\n' % + (serf_version, '.'.join(str(v) for v in minimal_serf_version))) + return + + serf_ver_maj = version[0] + + if serf_ver_maj > 0: + lib_name = 'serf-%d.lib' % (serf_ver_maj,) + else: + lib_name = 'serf.lib' + + defines = ['SVN_HAVE_SERF', 'SVN_LIBSVN_CLIENT_LINKS_RA_SERF'] + + self._libraries['serf'] = SVNCommonLibrary('serf', inc_dir, lib_dir, + lib_name, serf_version, + debug_lib_dir=debug_lib_dir, + defines=defines) + + def _find_sasl(self, show_warnings): + "Check if sals is available" + + minimal_sasl_version = (2, 0, 0) + + if not self.sasl_path: + return + + inc_dir = os.path.join(self.sasl_path, 'include') + + version_file_path = os.path.join(inc_dir, 'sasl.h') + + if not os.path.isfile(version_file_path): + if show_warnings: + print('WARNING: \'%s\' not found' % (version_file_path,)) + print("Use '--with-sasl' to configure sasl location."); + return + + txt = open(version_file_path).read() + + vermatch = re.search(r'^\s*#define\s+SASL_VERSION_MAJOR\s+(\d+)', txt, re.M) + major = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+SASL_VERSION_MINOR\s+(\d+)', txt, re.M) + minor = int(vermatch.group(1)) + + vermatch = re.search(r'^\s*#define\s+SASL_VERSION_STEP\s+(\d+)', txt, re.M) + patch = int(vermatch.group(1)) + + version = (major, minor, patch) + sasl_version = '.'.join(str(v) for v in version) + + if version < minimal_sasl_version: + if show_warnings: + print('Found sasl %s, but >= %s is required. ' + 'sals support will not be built.\n' % + (sasl_version, '.'.join(str(v) for v in minimal_serf_version))) + return + + lib_dir = os.path.join(self.sasl_path, 'lib') + + if os.path.isfile(os.path.join(lib_dir, 'libsasl.dll')): + dll_dir = lib_dir + dll_name = 'libsasl.dll' + elif os.path.isfile(os.path.join(self.sasl_path, 'bin', 'libsasl.dll')): + dll_dir = os.path.join(self.sasl_path, 'bin') + dll_name = 'libsasl.dll' + else: + # Probably a static compilation + dll_dir = None + dll_name = None + + self._libraries['sasl'] = SVNCommonLibrary('sasl', inc_dir, lib_dir, + 'libsasl.lib', sasl_version, + dll_dir=dll_dir, + dll_name=dll_name, + defines=['SVN_HAVE_SASL']) + + def _find_libintl(self, show_warnings): + "Find gettext support" + minimal_libintl_version = (0, 14, 1) + + if not self.enable_nls or not self.libintl_path: + return; + + # We support 2 scenarios. + if os.path.isfile(os.path.join(self.libintl_path, 'inc', 'libintl.h')) and\ + os.path.isfile(os.path.join(self.libintl_path, 'lib', 'intl3_svn.lib')): + + # 1. Subversion's custom libintl based on gettext 0.14.1 + inc_dir = os.path.join(self.libintl_path, 'inc') + lib_dir = os.path.join(self.libintl_path, 'lib') + dll_dir = os.path.join(self.libintl_path, 'bin') + + lib_name = 'intl3_svn.lib' + dll_name = 'intl3_svn.dll' + elif os.path.isfile(os.path.join(self.libintl_path, \ + 'include', 'libintl.h')): + # 2. A gettext install + inc_dir = os.path.join(self.libintl_path, 'include') + lib_dir = os.path.join(self.libintl_path, 'lib') + dll_dir = os.path.join(self.libintl_path, 'bin') + + lib_name = 'intl.lib' + dll_name = 'intl.dll' + else: + if (show_warnings): + print('WARNING: \'libintl.h\' not found') + print("Use '--with-libintl' to configure libintl location.") + return + + version_file_path = os.path.join(inc_dir, 'libintl.h') + txt = open(version_file_path).read() + + match = re.search(r'^\s*#define\s+LIBINTL_VERSION\s+((0x)?[0-9A-Fa-f]+)', + txt, re.M) + + ver = int(match.group(1), 0) + version = (ver >> 16, (ver >> 8) & 0xFF, ver & 0xFF) + + libintl_version = '.'.join(str(v) for v in version) + + if version < minimal_libintl_version: + if show_warnings: + print('Found libintl %s, but >= %s is required.\n' % \ + (libintl_version, + '.'.join(str(v) for v in minimal_libintl_version))) + return + + self._libraries['intl'] = SVNCommonLibrary('libintl', inc_dir, lib_dir, + lib_name, libintl_version, + dll_dir=dll_dir, + dll_name=dll_name) + + def _find_sqlite(self, show_warnings): + "Find the Sqlite library and version" + + minimal_sqlite_version = (3, 7, 12) + + # For SQLite we support 3 scenarios: + # - Installed in standard directory layout + # - Installed in legacy directory layout + # - Amalgamation compiled directly into our libraries + + sqlite_base = self.sqlite_path + + lib_dir = None + dll_dir = None + dll_name = None + defines = [] + + lib_name = 'sqlite3.lib' + + if os.path.isfile(os.path.join(sqlite_base, 'include/sqlite3.h')): + # Standard layout + inc_dir = os.path.join(sqlite_base, 'include') + lib_dir = os.path.join(sqlite_base, 'lib') + + # We assume a static library, but let's support shared in this case + if os.path.isfile(os.path.join(sqlite_base, 'bin/sqlite3.dll')): + dll_dir = os.path.join(sqlite_base, 'bin') + dll_name = 'sqlite3.dll' + elif os.path.isfile(os.path.join(sqlite_base, 'inc/sqlite3.h')): + # Standard layout + inc_dir = os.path.join(sqlite_base, 'inc') + lib_dir = os.path.join(sqlite_base, 'lib') + + # We assume a static library, but let's support shared in this case + if os.path.isfile(os.path.join(sqlite_base, 'bin/sqlite3.dll')): + dll_dir = os.path.join(sqlite_base, 'bin') + dll_name = 'sqlite3.dll' + elif (os.path.isfile(os.path.join(sqlite_base, 'sqlite3.h')) + and os.path.isfile(os.path.join(sqlite_base, 'sqlite3.c'))): + # Amalgamation + inc_dir = sqlite_base + lib_dir = None + lib_name = None + defines.append('SVN_SQLITE_INLINE') + else: + sys.stderr.write("ERROR: SQLite not found\n") + sys.stderr.write("Use '--with-sqlite' option to configure sqlite location.\n"); + sys.exit(1) + + version_file_path = os.path.join(inc_dir, 'sqlite3.h') + + txt = open(version_file_path).read() + + match = re.search(r'^\s*#define\s+SQLITE_VERSION\s+' + r'"(\d+)\.(\d+)\.(\d+)(?:\.(\d))?"', txt, re.M) + + version = match.groups() + + # Sqlite doesn't add patch numbers for their ordinary releases + if not version[3]: + version = version[0:3] + + version = tuple(map(int, version)) + + sqlite_version = '.'.join(str(v) for v in version) + + if version < minimal_sqlite_version: + sys.stderr.write("ERROR: sqlite %s or higher is required " + "(%s found)\n" % ( + '.'.join(str(v) for v in minimal_sqlite_version), + sqlite_version)) + sys.exit(1) + + self._libraries['sqlite'] = SVNCommonLibrary('sqlite', inc_dir, lib_dir, + lib_name, sqlite_version, + dll_dir=dll_dir, + dll_name=dll_name, + defines=defines) + +# ============================================================================ +# This is a cut-down and modified version of code from: +# subversion/subversion/bindings/swig/python/svn/core.py +# +if sys.platform == "win32": + _escape_shell_arg_re = re.compile(r'(\\+)(\"|$)') + + def escape_shell_arg(arg): + # The (very strange) parsing rules used by the C runtime library are + # described at: + # http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_Parsing_C.2b2b_.Command.2d.Line_Arguments.asp + + # double up slashes, but only if they are followed by a quote character + arg = re.sub(_escape_shell_arg_re, r'\1\1\2', arg) + + # surround by quotes and escape quotes inside + arg = '"' + arg.replace('"', '"^""') + '"' + return arg + +else: + def escape_shell_arg(str): + return "'" + str.replace("'", "'\\''") + "'" diff --git a/build/generator/swig/__init__.py b/build/generator/swig/__init__.py index 99820cc..993d17b 100644 --- a/build/generator/swig/__init__.py +++ b/build/generator/swig/__init__.py @@ -61,10 +61,17 @@ class Generator: self.swig_path = swig_path self.swig_libdir = _exec.output([self.swig_path, "-swiglib"], strip=1) + _swigVersion = None def version(self): """Get the version number of SWIG""" - swig_version = _exec.output([self.swig_path, "-version"]) - m = re.search("Version (\d+).(\d+).(\d+)", swig_version) - if m: - return (m.group(1), m.group(2), m.group(3)) - return (0, 0, 0) + + if not self._swigVersion: + swig_version = _exec.output([self.swig_path, "-version"]) + m = re.search("Version (\d+).(\d+).(\d+)", swig_version) + if m: + self._swigVersion = tuple(map(int, m.groups())) + else: + self._swigVersion = (0, 0, 0) + + # Copy value to avoid changes + return tuple(list(self._swigVersion)) diff --git a/build/generator/swig/external_runtime.py b/build/generator/swig/external_runtime.py index bbf58fc..c37c225 100755 --- a/build/generator/swig/external_runtime.py +++ b/build/generator/swig/external_runtime.py @@ -24,7 +24,12 @@ # external_runtime.py: Generate external runtime files for SWIG # -import sys, os, re, fileinput +import sys +import os +import re +import fileinput +import filecmp + if __name__ == "__main__": parent_dir = os.path.dirname(os.path.abspath(os.path.dirname(sys.argv[0]))) sys.path[0:0] = [ parent_dir, os.path.dirname(parent_dir) ] @@ -63,8 +68,10 @@ class Generator(generator.swig.Generator): "python": "pyrun.swg", "perl":"perlrun.swg", "ruby":"rubydef.swg" } - # Build runtime files - out = self._output_file(lang) + # Build runtime files to temporary location + dest = self._output_file(lang) + out = dest + '.tmp' + if self.version() == (1, 3, 24): out_file = open(out, "w") out_file.write(open("%s/swigrun.swg" % self.proxy_dir).read()) @@ -99,6 +106,26 @@ class Generator(generator.swig.Generator): sys.stdout.write( re.sub(r"SWIG_GetModule\(\)", "SWIG_GetModule(NULL)", line) ) + + # Did the output change? + try: + if filecmp.cmp(dest, out): + identical = True + else: + identical = False + except: + identical = False + + # Only overwrite file if changed + if identical: + os.remove(out) + else: + try: + os.remove(dest) + except: pass + os.rename(out, dest) + print('Wrote %s' % (dest,)) + def _output_file(self, lang): """Return the output filename of the runtime for the given language""" return '%s/swig_%s_external_runtime.swg' % (self.proxy_dir, lang) diff --git a/build/generator/templates/build-outputs.mk.ezt b/build/generator/templates/build-outputs.mk.ezt index 97e024a..3677a6d 100644 --- a/build/generator/templates/build-outputs.mk.ezt +++ b/build/generator/templates/build-outputs.mk.ezt @@ -44,7 +44,10 @@ check-deps test-deps: [for test_helpers] [test_helpers][end] MANPAGES =[for manpages] [manpages][end] CLEAN_FILES =[for cfiles] [cfiles][end] -EXTRACLEAN_FILES =[for sql] [sql.header][end] +EXTRACLEAN_FILES =[for sql] [sql.header][end] \ + $(abs_builddir)/subversion/libsvn_subr/errorcode.inc \ + $(abs_builddir)/subversion/libsvn_subr/config_keys.inc \ + $(abs_srcdir)/compile_commands.json SWIG_INCLUDES = -I$(abs_builddir)/subversion \ -I$(abs_srcdir)/subversion/include \ @@ -97,7 +100,7 @@ autogen-swig: autogen-swig-[swig_langs.short] install-[target.install]: [target.install_deps][end] [is target.type "java"][target.varname]_HEADERS = [for target.headers][if-index target.headers first][else] [end][target.headers][end] [target.varname]_OBJECTS = [for target.objects][if-index target.objects first][else] [end][target.objects][end] -[target.varname]_DEPS = $([target.varname]_HEADERS) $([target.varname]_OBJECTS) [target.add_deps] [for target.deps][if-index target.deps first][else] [end][target.deps][end] +[target.varname]_DEPS = $([target.varname]_HEADERS) $([target.varname]_OBJECTS)[for target.add_deps] [target.add_deps][end][for target.deps][if-index target.deps first][else] [end][target.deps][end] [target.name]: $([target.varname]_DEPS) [if-any target.headers][target.varname]_CLASS_FILENAMES =[for target.header_class_filenames] [target.header_class_filenames][end] [target.varname]_CLASSES =[for target.header_classes] [target.header_classes][end] @@ -108,9 +111,9 @@ $([target.varname]_OBJECTS): $([target.varname]_SRC) [target.link_cmd] -d [target.output_dir] -classpath [target.classes]:$([target.varname]_CLASSPATH) $([target.varname]_SRC) [if-any target.jar] $(JAR) cf [target.jar_path] -C [target.classes][for target.packages] [target.packages][end][end][end] -[else][is target.type "i18n"][target.varname]_DEPS = [target.add_deps][for target.objects] [target.objects][end][for target.deps] [target.deps][end] +[else][is target.type "i18n"][target.varname]_DEPS =[for target.add_deps] [target.add_deps][end][for target.objects] [target.objects][end][for target.deps] [target.deps][end] [target.name]: $([target.varname]_DEPS) -[else][target.varname]_DEPS = [target.add_deps][for target.objects] [target.objects][end][for target.deps] [target.deps][end] +[else][target.varname]_DEPS =[for target.add_deps] [target.add_deps][end][for target.objdeps] [target.objdeps][end][for target.deps] [target.deps][end] [target.varname]_OBJECTS =[for target.objnames] [target.objnames][end] [target.filename]: $([target.varname]_DEPS) [if-any target.when]if $([target.when]) ; then [else][end]cd [target.path] && [target.link_cmd] $([target.varname]_LDFLAGS) -o [target.basename] [target.undefined_flag] $([target.varname]_OBJECTS)[for target.libs] [target.libs][end] $(LIBS)[if-any target.when] ; else echo "fake" > [target.filename] ; fi[else][end] @@ -128,9 +131,10 @@ $([target.varname]_OBJECTS): $([target.varname]_SRC) ######################################## [for areas] install-[areas.type]: [for areas.files][if-index areas.files first][else] [end][areas.files.fullname][end] -[if-any areas.files][for areas.files] [is areas.files.mode "apache-mod"][if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(MKDIR) "$(APACHE_LIBEXECDIR)" ; $(INSTALL_MOD_SHARED) -n [areas.files.name] [areas.files.filename][if-any areas.files.when] ; fi[else][end][else][if-index areas.files first]$(MKDIR) $(DESTDIR)$([areas.varname]dir) +[if-any areas.files][for areas.files] [is areas.files.mode "apache-mod"][if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(MKDIR) "$(APACHE_LIBEXECDIR)" ; $(INSTALL_MOD_SHARED) -n [areas.files.name] [areas.files.filename][if-any areas.files.when] ; fi[else][end][else][if-index areas.files first]$(MKDIR) $(DESTDIR)$([areas.varname]dir)[if-any areas.files.pc_installdir] $(DESTDIR)[areas.files.pc_installdir][end] [else][end][is areas.type "locale"]$(MKDIR) [areas.files.installdir] - [if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(INSTALL_[areas.uppervar]) [areas.files.filename] [areas.files.installdir]/$(PACKAGE_NAME)[areas.files.objext][if-any areas.files.when] ; fi[else][end][else][if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(INSTALL_[areas.uppervar]) [areas.files.filename] $(DESTDIR)[areas.files.install_fname][if-any areas.files.when] ; fi[else][end][end][end] + [if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(INSTALL_[areas.uppervar]) [areas.files.filename] [areas.files.installdir]/$(PACKAGE_NAME)[areas.files.objext][if-any areas.files.when] ; fi[else][end][else][if-any areas.files.when]if $([areas.files.when]) ; then [else][end]cd [areas.files.dirname] ; $(INSTALL_[areas.uppervar]) [areas.files.filename] $(DESTDIR)[areas.files.install_fname][if-any areas.files.when] ; fi[else][end] + [if-any areas.files.pc_fullname]$(INSTALL_DATA) [areas.files.pc_fullname] $(DESTDIR)[areas.files.pc_install_fname][end][end][end] [end][else] $(MKDIR) $(DESTDIR)$([areas.varname]dir) [end][if-any areas.extra_install] $(INSTALL_EXTRA_[areas.uppervar]) [end][end] diff --git a/build/generator/templates/build_locale.ezt b/build/generator/templates/build_locale.ezt index ab7d201..a4b3db9 100644 --- a/build/generator/templates/build_locale.ezt +++ b/build/generator/templates/build_locale.ezt @@ -19,7 +19,7 @@ @echo off @rem ************************************************************************** cd ..\..\..\subversion\po -mkdir ..\..\%1\mo +if not exist ..\..\%1\mo mkdir ..\..\%1\mo set exitcode=0 [for pofiles]echo Running msgfmt on [pofiles.po]... msgfmt.exe -c -o ..\..\%1\mo\[pofiles.mo] [pofiles.po] diff --git a/build/generator/templates/build_zlib.ezt b/build/generator/templates/build_zlib.ezt deleted file mode 100644 index 9724f7d..0000000 --- a/build/generator/templates/build_zlib.ezt +++ /dev/null @@ -1,134 +0,0 @@ -[define COPYRIGHT] -# -# -# 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. -# -# -[end]@echo off -@rem ************************************************************************** -@rem * --== WARNING ==-- This is a generated file. Do not edit! -@rem * -@rem * From this directory, run this batch file like so: -@rem * -@rem * .\build_zlib debug|release Win32|X64 [rebuild|clean] -@rem * -@rem ************************************************************************** - -@rem ************************************************************************** -cd /D [zlib_path] -set exitcode=0 -set zlib_version=[zlib_version] - -if /i "%1" == "release" goto release -if /i "%1" == "debug" goto debug -goto pIerr - -:checkplatform -if /i "%2" == "Win32" goto PWin32 -if /i "%2" == "x64" goto PX64 -goto pIIerr - -:checkrebuild - -[if-any use_ml] -@rem ************************************************************************** -@rem Compile ASM sources with ML -set ASFLAGS=-nologo -Zi -coff -set LOC=-DASMV -DASMINF -[is zlib_version "1.2.4"] -set OBJA=contrib\masmx86\gvmat32c.obj contrib\masmx86\gvmat32.obj contrib\masmx86\inffas32.obj -set ASM_OPTS=ASFLAGS="%ASFLAGS%" LOC="%LOC%" OBJA="%OBJA%" -[else] -if /i "%2" == "Win32" ( - set ASM_OPTS=LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj" "AS=ml -safeseh" -) else if /i "%2" == "x64" ( - set ASM_OPTS=LOC="-DASMV -DASMINF" OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" AS=ml64 -) -[end] -[end] - - -if /i "%3" == "rebuild" goto rebuild -if /i "%3" == "clean" goto clean -if not "%3" == "" goto pIIIerr -set target= %STATICLIB% -goto build - -:rebuild -set target=clean %STATICLIB% -goto build - -:clean -set target=clean -goto build - -@rem ************************************************************************** -:release -set STATICLIB=zlibstat.lib -set CC_OPTS=/MD /O2 /Zi -goto checkplatform - -@rem ************************************************************************** -:debug -set STATICLIB=zlibstatD.lib -set CC_OPTS=/MDd /Gm /ZI /Od /GZ /D_DEBUG -goto checkplatform - -@rem ************************************************************************** -:PWin32 -goto checkrebuild - -@rem ************************************************************************** -:PX64 -goto checkrebuild - -@rem ************************************************************************** -:build -set COMMON_CC_OPTS=/nologo /W3 /DWIN32 /D_WINDOWS -[is zlib_version "1.2.4"] -set CFLAGS=%COMMON_CC_OPTS% %CC_OPTS% %LOC% -set BUILD_OPTS=%ASM_OPTS% CFLAGS="%COMMON_CC_OPTS% %CC_OPTS% %LOC%" -[else] -set BUILD_OPTS=%ASM_OPTS% -[end] -@echo nmake /f win32\Makefile.msc %BUILD_OPTS% STATICLIB=%STATICLIB% %target% -nmake /nologo /f win32\Makefile.msc %BUILD_OPTS% STATICLIB=%STATICLIB% %target% -if errorlevel 1 goto err -goto end - -@rem ************************************************************************** -:pIerr -echo error: First parameter should be "release" or "debug" -goto err - -@rem ************************************************************************** -:pIIerr -echo error: Second parameter should be "Win32" or "X64" -goto err - - -@rem ************************************************************************** -:pIIIerr -echo error: Third parameter should be "rebuild" or empty -goto err - -@rem ************************************************************************** -:err -set exitcode=1 -:end -exit %exitcode% diff --git a/build/generator/templates/msvc_dsp.ezt b/build/generator/templates/msvc_dsp.ezt index f34e646..1a9dfff 100644 --- a/build/generator/templates/msvc_dsp.ezt +++ b/build/generator/templates/msvc_dsp.ezt @@ -42,8 +42,8 @@ RSC=rc.exe # PROP Target_Dir "" [if-any is_utility][else]LIB32=link.exe -lib # ADD LIB32 /out:"[rootpath]\[configs.name]\[target.output_dir]\[target.output_name]" -# ADD CPP /nologo /W3 /FD /Fd"[rootpath]\[configs.name]\[target.output_dir]\[target.output_pdb]" /c [is configs.name "Debug"]/MDd /Gm /Gi /GX /ZI /Od /GZ[else]/MD /GX /O2 /Zi[end][for configs.defines] /D "[configs.defines]"[end][if-any instrument_apr_pools] /D "APR_POOL_DEBUG=[instrument_apr_pools]"[end][for includes] /I "[includes]"[end] -# ADD RSC /l [if-any is_exe]0x409[else]0x424[end][is configs.name "Debug"] /d "_DEBUG"[end][for includes] /I "[includes]"[end] +# ADD CPP /nologo /W3 /FD /Fd"[rootpath]\[configs.name]\[target.output_dir]\[target.output_pdb]" /c [is configs.name "Debug"]/MDd /Gm /Gi /GX /ZI /Od /GZ[else]/MD /GX /O2 /Zi[end][for configs.defines] /D "[configs.defines]"[end][if-any instrument_apr_pools] /D "APR_POOL_DEBUG=[instrument_apr_pools]"[end][for configs.includes] /I "[configs.includes]"[end] +# ADD RSC /l [if-any is_exe]0x409[else]0x424[end][is configs.name "Debug"] /d "_DEBUG"[end][for configs.includes] /I "[configs.includes]"[end] BSC32=bscmake.exe LINK32=link.exe [if-any is_exe is_dll]# ADD LINK32 /nologo[if-any is_exe] /subsystem:console[end][if-any is_dll] /dll[end] /debug /machine:IX86[for configs.libs] [configs.libs][end][for configs.libdirs] /libpath:"[configs.libdirs]"[end] /out:"[rootpath]\[configs.name]\[target.output_dir]\[target.output_name]"[if-any instrument_purify_quantify] /fixed:no[end] diff --git a/build/generator/templates/pkg-config.in.ezt b/build/generator/templates/pkg-config.in.ezt new file mode 100644 index 0000000..959eb81 --- /dev/null +++ b/build/generator/templates/pkg-config.in.ezt @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: [lib_name] +Description: [lib_desc] +Version: @PACKAGE_VERSION@ +Requires: [for lib_required] [lib_required][end] +Requires.private: [for lib_required_private] [lib_required_private][end] +Libs: -L${libdir} [for lib_deps] [lib_deps][end] +Cflags: -I${includedir} diff --git a/build/generator/templates/serf.dsp.ezt b/build/generator/templates/serf.dsp.ezt deleted file mode 100644 index 0db7452..0000000 --- a/build/generator/templates/serf.dsp.ezt +++ /dev/null @@ -1,96 +0,0 @@ -# Microsoft Developer Studio Project File - Name="serf" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 - -CFG=serf - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "serf.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "serf.mak" CFG="serf - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "serf - Win32 Release" (based on "Win32 (x86) External Target") -!MESSAGE "serf - Win32 Debug" (based on "Win32 (x86) External Target") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" - -!IF "$(CFG)" == "serf - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_File "Release/[serf_lib]" -# PROP BASE Bsc_Name "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Cmd_Line "nmake /s /nologo /f serf.mak CLEAN ALL APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]" -# PROP Rebuild_Opt "/a" -# PROP Target_File "Release/[serf_lib]" -# PROP Bsc_Name "" - -!ELSEIF "$(CFG)" == "serf - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Rebuild_Opt "/a" -# PROP BASE Target_File "Debug/[serf_lib]" -# PROP BASE Bsc_Name "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Cmd_Line "nmake /s /nologo /f serf.mak CLEAN ALL DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path] ZLIB_LIBS=[zlib_path]\zlibstatD.lib[end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]" -# PROP Rebuild_Opt "/a" -# PROP Target_File "Debug/[serf_lib]" -# PROP Bsc_Name "" - -!ENDIF - -# Begin Target - -# Name "serf - Win32 Release" -# Name "serf - Win32 Debug" - -!IF "$(CFG)" == "serf - Win32 Release" - -!ELSEIF "$(CFG)" == "serf - Win32 Debug" - -!ENDIF - -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -[for serf_sources]# Begin Source File - -SOURCE="[serf_sources]" -# End Source File -[end] -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -[for serf_headers]# Begin Source File - -SOURCE="[serf_headers]" -# End Source File -[end] -# End Group -# End Target -# End Project diff --git a/build/generator/templates/serf.vcproj.ezt b/build/generator/templates/serf.vcproj.ezt deleted file mode 100644 index 85423ae..0000000 --- a/build/generator/templates/serf.vcproj.ezt +++ /dev/null @@ -1,85 +0,0 @@ -[define COPYRIGHT] -<!-- - 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. ---> -[end]<?xml version="1.0" encoding = "Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="[version]" - Name="serf" - ProjectGUID="[project_guid]" - Keyword="MakeFileProj"> - <Platforms> -[for platforms] <Platform - Name="[platforms]"/> -[end] </Platforms> - <Configurations> -[for platforms] <Configuration - Name="Debug|[platforms]" - OutputDirectory="Debug" - BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" - IntermediateDirectory="Debug" - ConfigurationType="0" - ManagedExtensions="1" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE"> - <Tool - Name="VCNMakeTool" - BuildCommandLine="nmake /s /nologo /f serf.mak ALL DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - ReBuildCommandLine="nmake /s /nologo /f serf.mak CLEAN ALL DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - CleanCommandLine="nmake /s /nologo /f serf.mak CLEAN DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - Output="$(OutDir)\[serf_lib]"/> - </Configuration> - <Configuration - Name="Release|[platforms]" - OutputDirectory="Release" - BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" - IntermediateDirectory="Release" - ConfigurationType="0" - ManagedExtensions="1" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE"> - <Tool - Name="VCNMakeTool" - BuildCommandLine="nmake /s /nologo /f serf.mak ALL APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - ReBuildCommandLine="nmake /s /nologo /f serf.mak CLEAN ALL APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - CleanCommandLine="nmake /s /nologo /f serf.mak CLEAN APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]" - Output="$(OutDir)\[serf_lib]"/> - </Configuration> -[end] </Configurations> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - [for serf_sources]<File - RelativePath="[serf_sources]"> - </File> - [end] - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - [for serf_headers]<File - RelativePath="[serf_headers]"> - </File> - [end] - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/build/generator/templates/serf.vcxproj.ezt b/build/generator/templates/serf.vcxproj.ezt deleted file mode 100644 index c8f14e5..0000000 --- a/build/generator/templates/serf.vcxproj.ezt +++ /dev/null @@ -1,65 +0,0 @@ -[# -<!-- - 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. ---> -]<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> -[for configs][for platforms] <ProjectConfiguration Include="[configs]|[platforms]"> - <Configuration>[configs]</Configuration> - <Platform>[platforms]</Platform> - </ProjectConfiguration> -[end][end] </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectName>serf</ProjectName> - <ProjectGuid>[project_guid]</ProjectGuid> - <Keyword>MakeFileProj</Keyword> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> -[for platforms][for configs] <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'" Label="Configuration"> - <ConfigurationType>Makefile</ConfigurationType> - <UseDebugLibraries>[is configs "Debug"]true[else]false[end]</UseDebugLibraries> - <PlatformToolset>[toolset_version]</PlatformToolset> - </PropertyGroup> -[end][end] <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> -[for platforms][for configs] <ImportGroup Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> - </ImportGroup> -[end][end] <PropertyGroup Label="UserMacros" /> - <PropertyGroup> -[for configs][for platforms] <OutDir Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">[configs]</OutDir> - <IntDir Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">[configs]</IntDir> - <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">"$(VCInstallDir)bin\nmake.exe" /s /nologo /f serf.mak ALL [is configs "Debug"]DEBUG_BUILD=1 [end]APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]</NMakeBuildCommandLine> - <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">"$(VCInstallDir)bin\nmake.exe" /s /nologo /f serf.mak CLEAN ALL [is configs "Debug"]DEBUG_BUILD=1 [end]APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]</NMakeReBuildCommandLine> - <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">"$(VCInstallDir)bin\nmake.exe" /s /nologo /f serf.mak CLEAN [is configs "Debug"]DEBUG_BUILD=1 [end]APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [apr_static] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path] [openssl_static][end]</NMakeCleanCommandLine> - <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">$(OutDir)\[serf_lib]</NMakeOutput> -[end][end] </PropertyGroup> - <ItemDefinitionGroup> - </ItemDefinitionGroup> - <ItemGroup> -[for serf_sources] <ClCompile Include="[serf_sources]" /> -[end] </ItemGroup> - <ItemGroup> -[for serf_headers] <ClInclude Include="[serf_headers]" /> -[end] </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> diff --git a/build/generator/templates/vcnet_vcproj.ezt b/build/generator/templates/vcnet_vcproj.ezt index 4d6d968..b12ed1a 100644 --- a/build/generator/templates/vcnet_vcproj.ezt +++ b/build/generator/templates/vcnet_vcproj.ezt @@ -45,7 +45,7 @@ EnableIntrinsicFunctions="TRUE" FavorSizeOrSpeed="1" OmitFramePointers="TRUE" -[end] AdditionalIncludeDirectories="..\..\..\[configs.name];[for includes][includes][if-index includes last][else];[end][end]" +[end] AdditionalIncludeDirectories="..\..\..\[configs.name];[for configs.includes][configs.includes][if-index configs.includes last][else];[end][end]" PreprocessorDefinitions="[if-any instrument_apr_pools]APR_POOL_DEBUG=[instrument_apr_pools];[end][is platforms "x64"]WIN64;[end][for configs.defines][configs.defines][if-index configs.defines last][else];[end][end];_CRT_SECURE_NO_WARNINGS" [is configs.name "Debug"] MinimalRebuild="TRUE" RuntimeLibrary="3" @@ -56,13 +56,14 @@ RuntimeLibrary="2" BufferSecurityCheck="FALSE" [end] WarningLevel="4" - DisableSpecificWarnings="4100;4127;4206;4701;4706" + DisableSpecificWarnings="4100;4127;4206;4512;4701;4706;4800" Detect64BitPortabilityProblems="FALSE" AdditionalOptions=" /we4002 /we4003 /we4013 /we4020 /we4022 /we4024 /we4028 /we4029 /we4030 /we4031 /we4033 /we4047 /we4089 /we4113 /we4115 /we4204 /we4715" DebugInformationFormat="3" ProgramDataBaseFileName="$(IntDir)\[target.output_pdb]" - CompileAsManaged="0" + [if-any configs.forced_include_files]ForcedIncludeFiles="[for configs.forced_include_files][configs.forced_include_files][if-index configs.forced_include_files last][else];[end][end]" + [end]CompileAsManaged="0" CompileAs="0"[if-any is_exe][is configs.name "Release"] OptimizeForWindowsApplication="TRUE"[end][end]/> <Tool @@ -74,7 +75,7 @@ [is target_type "4"][else] OutputFile="$(OutDir)\[target.output_name]" [end][is configs.name "Debug"] LinkIncremental="2" [else] LinkIncremental="1" -[end] AdditionalLibraryDirectories="..\..\..\db4-win32\lib;[for configs.libdirs][configs.libdirs];[end]" +[end] AdditionalLibraryDirectories="[for configs.libdirs][configs.libdirs];[end]" TargetMachine="[is platforms "Win32"]1[end][is platforms "x64"]17[end]" IgnoreDefaultLibraryNames="libc.lib[is configs.name "debug"];msvcrt.lib[end]" [if-any def_file] ModuleDefinitionFile="[def_file]" @@ -114,16 +115,22 @@ Name="[configs.name]|[platforms]"> <Tool Name="VCResourceCompilerTool" - AdditionalIncludeDirectories="[for includes][includes][if-index includes last][else];[end][end]" + AdditionalIncludeDirectories="[for configs.includes][configs.includes][if-index configs.includes last][else];[end][end]" PreprocessorDefinitions="SVN_FILE_NAME=[target.output_name];SVN_FILE_DESCRIPTION=[target.desc];[is configs.name "Debug"]_DEBUG[else]NDEBUG[end]"/> </FileConfiguration>[end][end] </File>[end] <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> -[for sources][is sources.extension ".h"][else] <File +[for sources][is sources.extension ".h"][else][is sources.extension ".hpp"][else] <File RelativePath="[sources.path]"> -[if-any sources.custom_build][for platforms][for configs] +[if-any sources.ignored][for platforms][for configs] <FileConfiguration + Name="[configs.name]|[platforms]" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +[end][end][else][if-any sources.custom_build][for platforms][for configs] <FileConfiguration Name="[configs.name]|[platforms]"> <Tool @@ -142,9 +149,9 @@ ObjectFile="$(IntDir)/[sources.reldir]/" ProgramDataBaseFileName="$(IntDir)/[sources.reldir]/[target.proj_name]-[sources.reldir].pdb"/> </FileConfiguration> -[end][end][end] +[end][end][end][end] </File> -[end][end] +[end][end][end] [is target_type "2"] <File RelativePath="..\empty.c"/>[end] </Filter> <Filter @@ -153,7 +160,10 @@ [for sources][is sources.extension ".h"] <File RelativePath="[sources.path]" /> -[end][end] +[else][is sources.extension ".hpp"] + <File + RelativePath="[sources.path]" /> +[end][end][end] </Filter> </Files> <Globals> diff --git a/build/generator/templates/vcnet_vcxproj.ezt b/build/generator/templates/vcnet_vcxproj.ezt index a503c14..8ff387d 100644 --- a/build/generator/templates/vcnet_vcxproj.ezt +++ b/build/generator/templates/vcnet_vcxproj.ezt @@ -18,8 +18,7 @@ under the License. --> ]<?xml version="1.0" encoding="utf-8"?> -[format "xml"] -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +[format "xml"]<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> [for configs][for platforms] <ProjectConfiguration Include="[configs.name]|[platforms]"> <Configuration>[configs.name]</Configuration> @@ -33,9 +32,9 @@ [for platforms][for configs] <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'" Label="Configuration"> <ConfigurationType>[config_type]</ConfigurationType> <UseDebugLibraries>[is configs.name "Debug"]true[else]false[end]</UseDebugLibraries> + <PlatformToolset>[toolset_version]</PlatformToolset> [is configs.name "Release"] <WholeProgramOptimization>true</WholeProgramOptimization> -[end] <PlatformToolset>[toolset_version]</PlatformToolset> - </PropertyGroup> +[end] </PropertyGroup> [end][end] <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <ImportGroup Label="ExtensionSettings"> </ImportGroup> @@ -43,44 +42,45 @@ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> </ImportGroup> [end][end] <PropertyGroup Label="UserMacros" /> - <PropertyGroup> -[for configs][for platforms] <OutDir Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">$(SolutionDir)[configs.name]\[target.output_dir]\</OutDir> - <IntDir Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">$(SolutionDir)[configs.name]\obj\[target.intermediate_dir]\[target.proj_name]\</IntDir> - <TargetName Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[target.output_name_without_ext]</TargetName> -[is config_type "DynamicLibrary"][is target.output_ext ".dll"][else] <TargetExt>[target.output_ext]</TargetExt> -[end][end][end][end] </PropertyGroup> -[for configs][for platforms] <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'"> +[for platforms][for configs] <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'"> + <OutDir>$(SolutionDir)[configs.name]\[target.output_dir]\</OutDir> + <IntDir>$(SolutionDir)[configs.name]\obj\[target.intermediate_dir]\[target.proj_name]\</IntDir> + <TargetName>[target.output_name_without_ext]</TargetName> +[is configs.name "Debug"] <LinkIncremental>false</LinkIncremental> +[end][is config_type "DynamicLibrary"][is target.output_ext ".dll"][else] <TargetExt>[target.output_ext]</TargetExt> +[end][end] </PropertyGroup> +[end][end][for configs][for platforms] <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'"> <ClCompile> [is configs.name "Debug"] <Optimization>Disabled</Optimization> [else] <Optimization>Full</Optimization> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> - <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> +[end] <AdditionalIncludeDirectories>$(SolutionDir)[configs.name];[for configs.includes][configs.includes];[end]%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <StringPooling>true</StringPooling> -[end] <AdditionalIncludeDirectories>$(SolutionDir)[configs.name];[for includes][includes];[end];%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>[if-any instrument_apr_pools]APR_POOL_DEBUG=[instrument_apr_pools];[end][is platforms "x64"]WIN64;[end][for configs.defines][configs.defines];[end]%(PreprocessorDefinitions)</PreprocessorDefinitions> <WarningLevel>Level4</WarningLevel> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <BrowseInformation>true</BrowseInformation> <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName> - <DisableSpecificWarnings>4100;4127;4206;4701;4706;%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>4100;4127;4206;4512;4701;4706;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings> <TreatSpecificWarningsAsErrors>4002;4003;4013;4020;4022;4024;4028;4029;4030;4031;4033;4047;4089;4113;4115;4204;4715;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors> - </ClCompile> +[if-any configs.forced_include_files] <ForcedIncludeFiles>[for configs.forced_include_files][configs.forced_include_files];[end]%(ForcedIncludeFiles)</ForcedIncludeFiles> +[end] </ClCompile> [is config_type "Application"] <Link> <AdditionalDependencies>[for configs.libs][configs.libs];[end]%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>[for configs.libdirs][configs.libdirs];[end]%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Console</SubSystem> <EnableUAC>true</EnableUAC> -[is configs.name "Debug"] <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> -[else] <OptimizeReferences>true</OptimizeReferences> + <OptimizeReferences>true</OptimizeReferences> +[is configs.name "Debug"] <EnableCOMDATFolding>false</EnableCOMDATFolding> + <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> [end] </Link> [else][is config_type "DynamicLibrary"] <Link> <AdditionalDependencies>[for configs.libs][configs.libs];[end]%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>[for configs.libdirs][configs.libdirs];[end]%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> -[is configs.name "Debug"] <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> -[end][if-any def_file] <ModuleDefinitionFile>[def_file]</ModuleDefinitionFile> + <IgnoreSpecificDefaultLibraries>[is configs.name "Debug"]msvcrt.lib[end][is configs.name "Release"]msvcrtd.lib[end]</IgnoreSpecificDefaultLibraries> +[if-any def_file] <ModuleDefinitionFile>[def_file]</ModuleDefinitionFile> [end] </Link> [else][is config_type "StaticLibrary"] <Lib> <TargetMachine>[is platforms "X64"]MachineX64[else]MachineX86[end]</TargetMachine> @@ -89,25 +89,26 @@ [end][end][end] </ItemDefinitionGroup> [end][end][if-any target.desc] <ItemGroup> <ResourceCompile Include="..\svn.rc"> -[for configs][for platforms] <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[for includes][includes];[end];%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +[for configs][for platforms] <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[for configs.includes][configs.includes];[end]%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">SVN_FILE_NAME=[target.output_name];SVN_FILE_DESCRIPTION=[target.desc];[is configs.name "Debug"]_DEBUG[else]NDEBUG[end];%(PreprocessorDefinitions)</PreprocessorDefinitions> [end][end] </ResourceCompile> </ItemGroup> [end] <ItemGroup> -[for sources][is sources.extension ".h"][else][if-any sources.custom_build] <CustomBuild Include="[sources.path]"> +[for sources][is sources.extension ".h"][else][is sources.extension ".hpp"][else][if-any sources.custom_build] <CustomBuild Include="[sources.path]"> <FileType>Document</FileType> [for configs][for platforms] <Command Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[sources.custom_build]</Command> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[for sources.user_deps][sources.user_deps];[end]%(AdditionalInputs)</AdditionalInputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[sources.custom_target];%(Outputs)</Outputs> [if-any sources.custom_desc]<Message Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">[sources.custom_desc]</Message> [end][end][end] </CustomBuild> -[else][is sources.extension ".c"] <ClCompile Include="[sources.path]" /> -[else][is sources.extension ".cpp"] <ClCompile Include="[sources.path]" /> +[else][is sources.extension ".c"][if-any sources.ignored] <None Include="[sources.path]" />[else] <ClCompile Include="[sources.path]" />[end] +[else][is sources.extension ".cpp"][if-any sources.ignored] <None Include="[sources.path]" />[else] <ClCompile Include="[sources.path]" />[end] [else] <None Include="[sources.path]" /> -[end][end][end][end][end] </ItemGroup> +[end][end][end][end][end][end] </ItemGroup> <ItemGroup> [for sources][is sources.extension ".h"] <ClInclude Include="[sources.path]" /> -[end][end] </ItemGroup> +[else][is sources.extension ".hpp"] <ClInclude Include="[sources.path]" /> +[end][end][end] </ItemGroup> <ItemGroup> [for depends] <ProjectReference Include="[depends.path]"> <Project>[depends.guid]</Project> diff --git a/build/generator/templates/zlib.dsp.ezt b/build/generator/templates/zlib.dsp.ezt deleted file mode 100644 index eb679f0..0000000 --- a/build/generator/templates/zlib.dsp.ezt +++ /dev/null @@ -1,99 +0,0 @@ -# Microsoft Developer Studio Project File - Name="zlib" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 - -CFG=zlib - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "zlib.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "zlib.mak" CFG="zlib - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "zlib - Win32 Release" (based on "Win32 (x86) External Target") -!MESSAGE "zlib - Win32 Debug" (based on "Win32 (x86) External Target") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" - -!IF "$(CFG)" == "zlib - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "[zlib_path]\Release" -# PROP BASE Intermediate_Dir "[zlib_path]\Release" -# PROP BASE Cmd_Line "build_zlib.bat release Win32" -# PROP BASE Rebuild_Opt "rebuild" -# PROP BASE Target_File "[zlib_path]\zlibstat.lib" -# PROP BASE Bsc_Name "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "[zlib_path]\Release" -# PROP Intermediate_Dir "[zlib_path]\Release" -# PROP Cmd_Line "cmd /c build_zlib.bat release Win32" -# PROP Rebuild_Opt "rebuild" -# PROP Target_File "[zlib_path]\zlibstat.lib" -# PROP Bsc_Name "" - -!ELSEIF "$(CFG)" == "zlib - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "[zlib_path]\Debug" -# PROP BASE Intermediate_Dir "[zlib_path]\Debug" -# PROP BASE Cmd_Line "build_zlib.bat debug Win32" -# PROP BASE Rebuild_Opt "rebuild" -# PROP BASE Target_File "[zlib_path]\zlibstatD.lib" -# PROP BASE Bsc_Name "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "[zlib_path]\Debug" -# PROP Intermediate_Dir "[zlib_path]\Debug" -# PROP Cmd_Line "cmd /c build_zlib.bat debug Win32" -# PROP Rebuild_Opt "rebuild" -# PROP Target_File "[zlib_path]\zlibstatD.lib" -# PROP Bsc_Name "" - -!ENDIF - -# Begin Target - -# Name "zlib - Win32 Release" -# Name "zlib - Win32 Debug" - -!IF "$(CFG)" == "zlib - Win32 Release" - -!ELSEIF "$(CFG)" == "zlib - Win32 Debug" - -!ENDIF - -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -[for zlib_sources]# Begin Source File - -SOURCE="[zlib_sources]" -# End Source File -[end] -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -[for zlib_headers]# Begin Source File - -SOURCE="[zlib_headers]" -# End Source File -[end] -# End Group -# End Target -# End Project diff --git a/build/generator/templates/zlib.vcproj.ezt b/build/generator/templates/zlib.vcproj.ezt deleted file mode 100644 index 537d41c..0000000 --- a/build/generator/templates/zlib.vcproj.ezt +++ /dev/null @@ -1,85 +0,0 @@ -[define COPYRIGHT] -<!-- - 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. ---> -[end]<?xml version="1.0" encoding = "Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="[version]" - Name="zlib" - ProjectGUID="[project_guid]" - Keyword="MakeFileProj"> - <Platforms> -[for platforms] <Platform - Name="[platforms]"/> -[end] </Platforms> - <Configurations> -[for platforms] <Configuration - Name="Debug|[platforms]" - OutputDirectory="[zlib_path]\Debug" - BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" - IntermediateDirectory="[zlib_path]\Debug" - ConfigurationType="0" - ManagedExtensions="1" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE"> - <Tool - Name="VCNMakeTool" - BuildCommandLine="cmd /c build_zlib.bat debug [platforms]" - ReBuildCommandLine="cmd /c build_zlib.bat debug [platforms] rebuild" - CleanCommandLine="cmd /c build_zlib.bat debug [platforms] clean" - Output="[zlib_path]\zlibstatD.lib"/> - </Configuration> - <Configuration - Name="Release|[platforms]" - OutputDirectory="[zlib_path]\Release" - BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" - IntermediateDirectory="[zlib_path]\Release" - ConfigurationType="0" - ManagedExtensions="1" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE"> - <Tool - Name="VCNMakeTool" - BuildCommandLine="cmd /c build_zlib.bat release [platforms]" - ReBuildCommandLine="cmd /c build_zlib.bat release [platforms] rebuild" - CleanCommandLine="cmd /c build_zlib.bat release [platforms] clean" - Output="[zlib_path]\zlibstat.lib"/> - </Configuration> -[end] </Configurations> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - [for zlib_sources]<File - RelativePath="[zlib_sources]"> - </File> -[end] - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - [for zlib_headers]<File - RelativePath="[zlib_headers]"> - </File> -[end] - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/build/generator/templates/zlib.vcxproj.ezt b/build/generator/templates/zlib.vcxproj.ezt deleted file mode 100644 index e00df8a..0000000 --- a/build/generator/templates/zlib.vcxproj.ezt +++ /dev/null @@ -1,64 +0,0 @@ -[# -<!-- - 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. ---> -]<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> -[for configs][for platforms] <ProjectConfiguration Include="[configs]|[platforms]"> - <Configuration>[configs]</Configuration> - <Platform>[platforms]</Platform> - </ProjectConfiguration> -[end][end] </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>[project_guid]</ProjectGuid> - <Keyword>MakeFileProj</Keyword> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> -[for platforms][for configs] <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'" Label="Configuration"> - <ConfigurationType>Makefile</ConfigurationType> - <UseDebugLibraries>[is configs "Debug"]true[else]false[end]</UseDebugLibraries> - <PlatformToolset>[toolset_version]</PlatformToolset> - </PropertyGroup> -[end][end] <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> -[for platforms][for configs] <ImportGroup Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" /> - </ImportGroup> -[end][end] <PropertyGroup Label="UserMacros" /> - <PropertyGroup> -[for configs][for platforms] <OutDir Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">.\</OutDir> - <IntDir Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">.\</IntDir> - <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">cmd /c "$(ProjectDir)build_zlib.bat" [configs] [platforms]</NMakeBuildCommandLine> - <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">cmd /c "$(ProjectDir)build_zlib.bat" [configs] [platforms] rebuild</NMakeReBuildCommandLine> - <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">cmd /c "$(ProjectDir)build_zlib.bat" [configs] [platforms] clean</NMakeCleanCommandLine> - <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='[configs]|[platforms]'">[zlib_path]\[is configs "Release"]zlibstat.lib[else]zlibstatD.lib[end]</NMakeOutput> -[end][end] </PropertyGroup> - <ItemDefinitionGroup> - </ItemDefinitionGroup> - <ItemGroup> -[for zlib_sources] <ClCompile Include="[zlib_sources]" /> -[end] </ItemGroup> - <ItemGroup> -[for zlib_headers] <ClInclude Include="[zlib_headers]" /> -[end] </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> |