summaryrefslogtreecommitdiff
path: root/build/generator
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-08-05 16:22:51 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-08-05 16:22:51 +0000
commitcf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch)
treeda27775a2161723ef342e91af41a8b51fedef405 /build/generator
parentbb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff)
downloadsubversion-tarball-master.tar.gz
Diffstat (limited to 'build/generator')
-rwxr-xr-xbuild/generator/extractor.py7
-rw-r--r--build/generator/gen_base.py222
-rw-r--r--build/generator/gen_make.py92
-rw-r--r--build/generator/gen_msvc_dsp.py9
-rw-r--r--build/generator/gen_vcnet_vcproj.py20
-rw-r--r--build/generator/gen_win.py1245
-rw-r--r--build/generator/gen_win_dependencies.py1465
-rw-r--r--build/generator/swig/__init__.py17
-rwxr-xr-xbuild/generator/swig/external_runtime.py33
-rw-r--r--build/generator/templates/build-outputs.mk.ezt16
-rw-r--r--build/generator/templates/build_locale.ezt2
-rw-r--r--build/generator/templates/build_zlib.ezt134
-rw-r--r--build/generator/templates/msvc_dsp.ezt4
-rw-r--r--build/generator/templates/pkg-config.in.ezt12
-rw-r--r--build/generator/templates/serf.dsp.ezt96
-rw-r--r--build/generator/templates/serf.vcproj.ezt85
-rw-r--r--build/generator/templates/serf.vcxproj.ezt65
-rw-r--r--build/generator/templates/vcnet_vcproj.ezt30
-rw-r--r--build/generator/templates/vcnet_vcxproj.ezt53
-rw-r--r--build/generator/templates/zlib.dsp.ezt99
-rw-r--r--build/generator/templates/zlib.vcproj.ezt85
-rw-r--r--build/generator/templates/zlib.vcxproj.ezt64
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>