Update build environment

This commit is contained in:
Alexander Afanasyev committed 2019-03-18 13:51:10 -04:00
1 parent 437f29d7e7
commit cc9f2fa712
5 files changed
+376 -155

No files matched your search

+2
View File
@@ -1,5 +1,7 @@
.waf-1*
.waf3-1*
.waf-2*
.waf3-2*
.DS*
.lock*
build/
+234 -82
View File
@@ -30,14 +30,14 @@ When using this tool, the wscript will look like:
Options are generated, in order to specify the location of boost includes/libraries.
The `check_boost` configuration function allows to specify the used boost libraries.
It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
It can also provide default arguments to the --boost-mt command-line arguments.
Everything will be packaged together in a BOOST component that you can use.
When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
- you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
Errors: C4530
- boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
So before calling `conf.check_boost` you might want to disabling by adding:
So before calling `conf.check_boost` you might want to disabling by adding
conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
Errors:
- boost might also be compiled with /MT, which links the runtime statically.
@@ -52,27 +52,60 @@ import sys
import re
from waflib import Utils, Logs, Errors
from waflib.Configure import conf
from waflib.TaskGen import feature, after_method
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib',
'/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
'/usr/local/ndn/lib', '/opt/ndn/lib']
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include',
'/usr/local/ndn/include', '/opt/ndn/include']
BOOST_VERSION_FILE = 'boost/version.hpp'
BOOST_VERSION_CODE = '''
#include <iostream>
#include <boost/version.hpp>
int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
'''
BOOST_SYSTEM_CODE = '''
BOOST_ERROR_CODE = '''
#include <boost/system/error_code.hpp>
int main() { boost::system::error_code c; }
'''
PTHREAD_CODE = '''
#include <pthread.h>
static void* f(void*) { return 0; }
int main() {
pthread_t th;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&th, &attr, &f, 0);
pthread_join(th, 0);
pthread_cleanup_push(0, 0);
pthread_cleanup_pop(0);
pthread_attr_destroy(&attr);
}
'''
BOOST_THREAD_CODE = '''
#include <boost/thread.hpp>
int main() { boost::thread t; }
'''
BOOST_LOG_CODE = '''
#include <boost/log/trivial.hpp>
int main() { BOOST_LOG_TRIVIAL(info) << "boost_log is working"; }
'''
BOOST_LOG_SETUP_CODE = '''
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
int main() {
using namespace boost::log;
add_common_attributes();
add_console_log(std::clog, keywords::format = "%Message%");
BOOST_LOG_TRIVIAL(info) << "boost_log_setup is working";
}
'''
# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
PLATFORM = Utils.unversioned_sys_platform()
detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
@@ -104,34 +137,37 @@ BOOST_TOOLSETS = {
def options(opt):
opt = opt.add_option_group('Boost Options')
opt.add_option('--boost-includes', type='string',
default='', dest='boost_includes',
help='''path to the directory where the boost includes are, e.g., /path/to/boost_1_55_0/stage/include''')
help='''path to the directory where the boost includes are,
e.g., /path/to/boost_1_55_0/stage/include''')
opt.add_option('--boost-libs', type='string',
default='', dest='boost_libs',
help='''path to the directory where the boost libs are, e.g., /path/to/boost_1_55_0/stage/lib''')
opt.add_option('--boost-static', action='store_true',
default=False, dest='boost_static',
help='link with static boost libraries (.lib/.a)')
help='''path to the directory where the boost libs are,
e.g., path/to/boost_1_55_0/stage/lib''')
opt.add_option('--boost-mt', action='store_true',
default=False, dest='boost_mt',
help='select multi-threaded libraries')
opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
help='''select libraries with tags (dgsyp, d for debug), see doc Boost, Getting Started, chapter 6.1''')
opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
help='''select libraries with tags (gd for debug, static is automatically added),
see doc Boost, Getting Started, chapter 6.1''')
opt.add_option('--boost-linkage_autodetect', action='store_true', dest='boost_linkage_autodetect',
help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
opt.add_option('--boost-toolset', type='string',
default='', dest='boost_toolset',
help='force a toolset e.g. msvc, vc90, gcc, mingw, mgw45 (default: auto)')
help='force a toolset e.g. msvc, vc90, \
gcc, mingw, mgw45 (default: auto)')
py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
opt.add_option('--boost-python', type='string',
default=py_version, dest='boost_python',
help='select the lib python with this version (default: %s)' % py_version)
help='select the lib python with this version \
(default: %s)' % py_version)
@conf
def __boost_get_version_file(self, d):
if not d:
return None
dnode = self.root.find_dir(d)
if dnode:
return dnode.find_node(BOOST_VERSION_FILE)
@@ -144,33 +180,30 @@ def boost_get_version(self, d):
if node:
try:
txt = node.read()
except (OSError, IOError):
Logs.error("Could not read the file %r" % node.abspath())
except EnvironmentError:
Logs.error('Could not read the file %r' % node.abspath())
else:
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M)
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
m1 = re_but1.search(txt)
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d*)', re.M)
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d+)', re.M)
m2 = re_but2.search(txt)
if m1 and m2:
return (m1.group(1), m2.group(1))
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(':')
@conf
def boost_get_includes(self, *k, **kw):
includes = k and k[0] or kw.get('includes', None)
if includes and self.__boost_get_version_file(includes):
return includes
for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
if self.__boost_get_version_file(d):
return d
if includes:
self.end_msg('headers not found in %s' % includes)
self.end_msg('headers not found in %s' % includes, 'YELLOW')
self.fatal('The configuration failed')
else:
self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
self.end_msg('headers not found, please provide a --boost-includes argument (see help)', 'YELLOW')
self.fatal('The configuration failed')
@@ -198,7 +231,9 @@ def __boost_get_libs_path(self, *k, **kw):
path = self.root.find_dir(libs)
files = path.ant_glob('*boost_*')
if not libs or not files:
for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS:
if not d:
continue
path = self.root.find_dir(d)
if path:
files = path.ant_glob('*boost_*')
@@ -211,10 +246,10 @@ def __boost_get_libs_path(self, *k, **kw):
break
if not path:
if libs:
self.end_msg('libs not found in %s' % libs)
self.end_msg('libs not found in %s' % libs, 'YELLOW')
self.fatal('The configuration failed')
else:
self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
self.end_msg('libs not found, please provide a --boost-libs argument (see help)', 'YELLOW')
self.fatal('The configuration failed')
self.to_log('Found the boost path in %r with the libraries:' % path)
@@ -229,15 +264,10 @@ def boost_get_libs(self, *k, **kw):
according to the parameters
'''
path, files = self.__boost_get_libs_path(**kw)
t = []
if kw.get('mt', False):
t.append('mt')
if kw.get('abi', None):
t.append(kw['abi'])
tags = t and '(-%s)+' % '-'.join(t) or ''
files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
toolset = self.boost_get_toolset(kw.get('toolset', ''))
toolset_pat = '(-%s[0-9]{0,3})+' % toolset
version = '(-%s)+' % self.env.BOOST_VERSION
toolset_pat = '(-%s[0-9]{0,3})' % toolset
version = '-%s' % self.env.BOOST_VERSION
def find_lib(re_lib, files):
for file in files:
@@ -251,28 +281,109 @@ def boost_get_libs(self, *k, **kw):
name = name[3:]
return name[:name.rfind('.')]
def match_libs(lib_names, is_static):
libs = []
for lib in Utils.to_list(k and k[0] or kw.get('lib', None)):
py = (lib == 'python') and '(-py%s)+' % kw['python'] or ''
lib_names = Utils.to_list(lib_names)
if not lib_names:
return libs
t = []
if kw.get('mt', False):
t.append('-mt')
if kw.get('abi', None):
t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
elif is_static:
t.append('-s')
tags_pat = t and ''.join(t) or ''
ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
for lib in lib_names:
if lib == 'python':
# for instance, with python='27',
# accepts '-py27', '-py2', '27' and '2'
# but will reject '-py3', '-py26', '26' and '3'
tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python'])
else:
tags = tags_pat
# Trying libraries, from most strict match to least one
for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version),
'boost_%s%s%s%s' % (lib, tags, py, version),
'boost_%s%s%s' % (lib, tags, version),
for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext),
'boost_%s%s%s%s$' % (lib, tags, version, ext),
# Give up trying to find the right version
'boost_%s%s%s%s' % (lib, toolset_pat, tags, py),
'boost_%s%s%s' % (lib, tags, py),
'boost_%s%s' % (lib, tags)]:
'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext),
'boost_%s%s%s$' % (lib, tags, ext),
'boost_%s%s$' % (lib, ext),
'boost_%s' % lib]:
self.to_log('Trying pattern %s' % pattern)
file = find_lib(re.compile(pattern), files)
if file:
libs.append(format_lib_name(file.name))
break
else:
self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
self.end_msg('lib %s not found in %s' % (lib, path.abspath()), 'YELLOW')
self.fatal('The configuration failed')
return libs
return path.abspath(), libs
return path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
@conf
def _check_pthread_flag(self, *k, **kw):
'''
Computes which flags should be added to CXXFLAGS and LINKFLAGS to compile in multi-threading mode
Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3,
boost/thread.hpp will trigger a #error if -pthread isn't used:
boost/config/requires_threads.hpp:47:5: #error "Compiler threading support
is not turned on. Please set the correct command line options for
threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
Based on _BOOST_PTHREAD_FLAG(): https://github.com/tsuna/boost.m4/blob/master/build-aux/boost.m4
'''
var = kw.get('uselib_store', 'BOOST')
self.start_msg('Checking the flags needed to use pthreads')
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
# (none): in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -lpthreads: AIX (must check this before -lpthread)
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
# -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
# -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads)
# -pthreads: Solaris/GCC
# -mthreads: MinGW32/GCC, Lynx/GCC
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
# doesn't hurt to check since this sometimes defines pthreads too;
# also defines -D_REENTRANT)
# ... -mt is also the pthreads flag for HP/aCC
# -lpthread: GNU Linux, etc.
# --thread-safe: KAI C++
if Utils.unversioned_sys_platform() == 'sunos':
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
# a function called by this macro, so we could check for that, but
# who knows whether they'll stub that too in a future libc.) So,
# we'll just look for -pthreads and -lpthread first:
boost_pthread_flags = ['-pthreads', '-lpthread', '-mt', '-pthread']
else:
boost_pthread_flags = ['', '-lpthreads', '-Kthread', '-kthread', '-llthread', '-pthread',
'-pthreads', '-mthreads', '-lpthread', '--thread-safe', '-mt']
for boost_pthread_flag in boost_pthread_flags:
try:
self.env.stash()
self.env['CXXFLAGS_%s' % var] += [boost_pthread_flag]
self.env['LINKFLAGS_%s' % var] += [boost_pthread_flag]
self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False, quiet=True)
self.end_msg(boost_pthread_flag)
return
except self.errors.ConfigurationError:
self.env.revert()
self.end_msg('none')
@conf
def check_boost(self, *k, **kw):
@@ -285,7 +396,10 @@ def check_boost(self, *k, **kw):
if not self.env['CXX']:
self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
params = {'lib': k and k[0] or kw.get('lib', None)}
params = {
'lib': k and k[0] or kw.get('lib', None),
'stlib': kw.get('stlib', None)
}
for key, value in self.options.__dict__.items():
if not key.startswith('boost_'):
continue
@@ -294,48 +408,70 @@ def check_boost(self, *k, **kw):
var = kw.get('uselib_store', 'BOOST')
if not self.env.DONE_FIND_BOOST_COMMON:
self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
if self.env.DPKG_ARCHITECTURE:
deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
self.start_msg('Checking boost includes')
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
versions = self.boost_get_version(inc)
self.env.BOOST_VERSION = versions[0]
self.env.BOOST_VERSION_NUMBER = int(versions[1])
self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
self.end_msg('%d.%d.%d' % (int(versions[1]) / 100000,
int(versions[1]) / 100 % 1000,
int(versions[1]) % 100))
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
if not params['lib']:
self.env.DONE_FIND_BOOST_COMMON = True
if not params['lib'] and not params['stlib']:
return
if 'static' in kw or 'static' in params:
Logs.warn('boost: static parameter is deprecated, use stlib instead.')
self.start_msg('Checking boost libs')
suffix = params.get('static', None) and 'ST' or ''
path, libs = self.boost_get_libs(**params)
self.env['%sLIBPATH_%s' % (suffix, var)] = [path]
self.env['%sLIB_%s' % (suffix, var)] = libs
self.end_msg('ok')
path, libs, stlibs = self.boost_get_libs(**params)
self.env['LIBPATH_%s' % var] = [path]
self.env['STLIBPATH_%s' % var] = [path]
self.env['LIB_%s' % var] = libs
self.env['STLIB_%s' % var] = stlibs
self.end_msg(' '.join(libs + stlibs))
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % path)
Logs.pprint('CYAN', ' libs : %s' % libs)
Logs.pprint('CYAN', ' shared libs : %s' % libs)
Logs.pprint('CYAN', ' static libs : %s' % stlibs)
def has_shlib(lib):
return params['lib'] and lib in params['lib']
def has_stlib(lib):
return params['stlib'] and lib in params['stlib']
def has_lib(lib):
return has_shlib(lib) or has_stlib(lib)
if has_lib('thread'):
# not inside try_link to make check visible in the output
self._check_pthread_flag(k, kw)
def try_link():
if 'system' in params['lib']:
self.check_cxx(
fragment=BOOST_SYSTEM_CODE,
use=var,
execute=False,
)
if 'thread' in params['lib']:
self.check_cxx(
fragment=BOOST_THREAD_CODE,
use=var,
execute=False,
)
if has_lib('system'):
self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
if has_lib('thread'):
self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
if has_lib('log') or has_lib('log_setup'):
if not has_lib('thread'):
self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
if has_shlib('log') or has_shlib('log_setup'):
self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
if has_lib('log_setup'):
self.check_cxx(fragment=BOOST_LOG_SETUP_CODE, use=var, execute=False)
else:
self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
if params.get('linkage_autodetect', False):
self.start_msg("Attempting to detect boost linkage flags")
self.start_msg('Attempting to detect boost linkage flags')
toolset = self.boost_get_toolset(kw.get('toolset', ''))
if toolset in ['vc']:
if toolset in ('vc',):
# disable auto-linking feature, causing error LNK1181
# because the code wants to be linked against
self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
@@ -355,27 +491,43 @@ def check_boost(self, *k, **kw):
# we attempt to play with some known-to-work CXXFLAGS combinations
for cxxflags in (['/MD', '/EHsc'], []):
self.env.stash()
self.env["CXXFLAGS_%s" % var] += cxxflags
self.env['CXXFLAGS_%s' % var] += cxxflags
try:
try_link()
self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
e = None
self.end_msg('ok: winning cxxflags combination: %s' % (self.env['CXXFLAGS_%s' % var]))
exc = None
break
except Errors.ConfigurationError as exc:
except Errors.ConfigurationError as e:
self.env.revert()
e = exc
exc = e
if e is not None:
self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e)
if exc is not None:
self.end_msg('Could not auto-detect boost linking flags combination, you may report it to boost.py author', ex=exc)
self.fatal('The configuration failed')
else:
self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
self.end_msg('Boost linkage flags auto-detection not implemented (needed ?) for this toolchain')
self.fatal('The configuration failed')
else:
self.start_msg('Checking for boost linkage')
try:
try_link()
except Errors.ConfigurationError as e:
self.end_msg("Could not link against boost libraries using supplied options")
self.end_msg('Could not link against boost libraries using supplied options', 'YELLOW')
self.fatal('The configuration failed')
self.end_msg('ok')
@feature('cxx')
@after_method('apply_link')
def install_boost(self):
if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'):
return
install_boost.done = True
inst_to = getattr(self, 'install_path', '${BINDIR}')
for lib in self.env.LIB_BOOST:
try:
file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST)
self.bld.install_files(inst_to, self.bld.root.find_node(file))
except:
continue
install_boost.done = False
+128 -64
View File
@@ -1,47 +1,69 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
from waflib import Logs, Configure, Utils
from waflib import Configure, Logs, Utils
def options(opt):
opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
help='''Compile in debugging mode without optimizations (-O0 or -Og)''')
opt.add_option('--debug', '--with-debug', action='store_true', default=False,
help='Compile in debugging mode with minimal optimizations (-O0 or -Og)')
def configure(conf):
cxx = conf.env['CXX_NAME'] # CXX_NAME represents generic name of the compiler
conf.start_msg('Checking C++ compiler version')
cxx = conf.env.CXX_NAME # generic name of the compiler
ccver = tuple(int(i) for i in conf.env.CC_VERSION)
ccverstr = '.'.join(conf.env.CC_VERSION)
errmsg = ''
warnmsg = ''
if cxx == 'gcc':
flags = GccFlags()
if ccver < (5, 3, 0):
errmsg = ('The version of gcc you are using is too old.\n'
'The minimum supported gcc version is 5.3.0.')
conf.flags = GccFlags()
elif cxx == 'clang':
flags = ClangFlags()
if ccver < (3, 6, 0):
errmsg = ('The version of clang you are using is too old.\n'
'The minimum supported clang version is 3.6.0.')
conf.flags = ClangFlags()
else:
flags = CompilerFlags()
Logs.warn('The code has not been yet tested with %s compiler' % cxx)
warnmsg = 'Note: %s compiler is unsupported' % cxx
conf.flags = CompilerFlags()
areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
if errmsg:
conf.end_msg(ccverstr, color='RED')
conf.fatal(errmsg)
elif warnmsg:
conf.end_msg(ccverstr, color='YELLOW')
Logs.warn(warnmsg)
else:
conf.end_msg(ccverstr)
# General flags will alway be applied (e.g., selecting C++11 mode)
generalFlags = flags.getGeneralFlags(conf)
conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
# General flags are always applied (e.g., selecting C++ language standard)
generalFlags = conf.flags.getGeneralFlags(conf)
conf.add_supported_cxxflags(generalFlags['CXXFLAGS'])
conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
conf.env.DEFINES += generalFlags['DEFINES']
# Debug or optimization CXXFLAGS and LINKFLAGS will be applied only if the
@Configure.conf
def check_compiler_flags(conf):
# Debug or optimized CXXFLAGS and LINKFLAGS are applied only if the
# corresponding environment variables are not set.
# DEFINES will be always applied
# DEFINES are always applied.
if conf.options.debug:
extraFlags = flags.getDebugFlags(conf)
if areCustomCxxflagsPresent:
extraFlags = conf.flags.getDebugFlags(conf)
if conf.areCustomCxxflagsPresent:
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
if len(missingFlags) > 0:
Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
% " ".join(conf.env.CXXFLAGS))
Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
if missingFlags:
Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"'
% ' '.join(conf.env.CXXFLAGS))
Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags))
else:
extraFlags = flags.getOptimizedFlags(conf)
extraFlags = conf.flags.getOptimizedFlags(conf)
if not areCustomCxxflagsPresent:
if not conf.areCustomCxxflagsPresent:
conf.add_supported_cxxflags(extraFlags['CXXFLAGS'])
conf.add_supported_cxxflags(extraFlags['LINKFLAGS'])
conf.add_supported_linkflags(extraFlags['LINKFLAGS'])
conf.env.DEFINES += extraFlags['DEFINES']
@@ -56,12 +78,13 @@ def add_supported_cxxflags(self, cxxflags):
self.start_msg('Checking supported CXXFLAGS')
supportedFlags = []
for flag in cxxflags:
if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False):
supportedFlags += [flag]
for flags in cxxflags:
flags = Utils.to_list(flags)
if self.check_cxx(cxxflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
self.end_msg(' '.join(supportedFlags))
self.env.CXXFLAGS = supportedFlags + self.env.CXXFLAGS
self.env.prepend_value('CXXFLAGS', supportedFlags)
@Configure.conf
def add_supported_linkflags(self, linkflags):
@@ -74,79 +97,120 @@ def add_supported_linkflags(self, linkflags):
self.start_msg('Checking supported LINKFLAGS')
supportedFlags = []
for flag in linkflags:
if self.check_cxx(linkflags=['-Werror', flag], mandatory=False):
supportedFlags += [flag]
for flags in linkflags:
flags = Utils.to_list(flags)
if self.check_cxx(linkflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
self.end_msg(' '.join(supportedFlags))
self.env.LINKFLAGS = supportedFlags + self.env.LINKFLAGS
self.env.prepend_value('LINKFLAGS', supportedFlags)
class CompilerFlags(object):
def getCompilerVersion(self, conf):
return tuple(int(i) for i in conf.env.CC_VERSION)
def getGeneralFlags(self, conf):
"""Get dict {'CXXFLAGS':[...], LINKFLAGS:[...], DEFINES:[...]} that are always needed"""
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
def getDebugFlags(self, conf):
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in debug mode"""
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in debug mode"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['_DEBUG']}
def getOptimizedFlags(self, conf):
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in optimized mode"""
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in optimized mode"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['NDEBUG']}
class GccBasicFlags(CompilerFlags):
"""This class defines base flags that work for gcc and clang compiler"""
"""
This class defines basic flags that work for both gcc and clang compilers
"""
def getGeneralFlags(self, conf):
flags = super(GccBasicFlags, self).getGeneralFlags(conf)
flags['CXXFLAGS'] += ['-std=c++14']
if Utils.unversioned_sys_platform() == 'linux':
flags['LINKFLAGS'] += ['-fuse-ld=gold']
elif Utils.unversioned_sys_platform() == 'freebsd':
flags['LINKFLAGS'] += ['-fuse-ld=lld']
return flags
def getDebugFlags(self, conf):
flags = super(GccBasicFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Wall',
'-O0',
flags['CXXFLAGS'] += ['-O0',
'-Og', # gcc >= 4.8, clang >= 4.0
'-g3',
'-pedantic',
'-Wall',
'-Wextra',
'-Werror',
'-Wnon-virtual-dtor',
'-Wno-error=deprecated-declarations', # Bug #3795
'-Wno-error=maybe-uninitialized', # Bug #1615
'-Wno-unused-parameter',
]
flags['LINKFLAGS'] += ['-Wl,-O1']
return flags
def getOptimizedFlags(self, conf):
flags = super(GccBasicFlags, self).getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-Wall', '-O2', '-g']
flags['CXXFLAGS'] += ['-O2',
'-g',
'-pedantic',
'-Wall',
'-Wextra',
'-Wnon-virtual-dtor',
'-Wno-unused-parameter',
]
flags['LINKFLAGS'] += ['-Wl,-O1']
return flags
class GccFlags(GccBasicFlags):
def getGeneralFlags(self, conf):
flags = super(GccFlags, self).getGeneralFlags(conf)
version = tuple(int(i) for i in conf.env['CC_VERSION'])
if version < (4, 6, 0):
conf.fatal('The version of gcc you are using (%s) is too old.\n' %
'.'.join(conf.env['CC_VERSION']) +
'The minimum supported gcc version is 4.6.0.')
elif version < (4, 7, 0):
flags['CXXFLAGS'] += ['-std=c++0x']
else:
flags['CXXFLAGS'] += ['-std=c++11']
if version < (4, 8, 0):
flags['DEFINES'] += ['_GLIBCXX_USE_NANOSLEEP'] # Bug #2499
return flags
def getDebugFlags(self, conf):
flags = super(GccFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Og', # gcc >= 4.8
'-fdiagnostics-color', # gcc >= 4.9
]
flags['CXXFLAGS'] += ['-fdiagnostics-color']
return flags
def getOptimizedFlags(self, conf):
flags = super(GccFlags, self).getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-fdiagnostics-color']
return flags
class ClangFlags(GccBasicFlags):
def getGeneralFlags(self, conf):
flags = super(ClangFlags, self).getGeneralFlags(conf)
flags['CXXFLAGS'] += ['-std=c++11',
'-Wno-error=unneeded-internal-declaration', # Bug #1588
'-Wno-error=deprecated-register',
]
if Utils.unversioned_sys_platform() == "darwin":
flags['CXXFLAGS'] += ['-stdlib=libc++']
flags['LINKFLAGS'] += ['-stdlib=libc++']
if Utils.unversioned_sys_platform() == 'darwin' and self.getCompilerVersion(conf) >= (9, 0, 0):
# Bug #4296
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew
['-isystem', '/opt/local/include']] # for MacPorts
if Utils.unversioned_sys_platform() == 'freebsd':
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include']] # Bug #4790
return flags
def getDebugFlags(self, conf):
flags = super(ClangFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-fcolor-diagnostics']
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
'-Wextra-semi',
'-Wundefined-func-template',
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
]
version = self.getCompilerVersion(conf)
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
if version < (6, 0, 0):
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
return flags
def getOptimizedFlags(self, conf):
flags = super(ClangFlags, self).getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-fcolor-diagnostics',
'-Wextra-semi',
'-Wundefined-func-template',
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
]
version = self.getCompilerVersion(conf)
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
if version < (6, 0, 0):
flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
return flags
Vendored
+10 -9
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# encoding: ISO8859-1
# Thomas Nagy, 2005-2015
# encoding: latin-1
# Thomas Nagy, 2005-2018
#
"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -32,12 +32,13 @@ POSSIBILITY OF SUCH DAMAGE.
import os, sys, inspect
VERSION="1.8.5"
REVISION="d178df7a9bb732db109001d6b461550f"
VERSION="2.0.14"
REVISION="a8a9afc5d151494252697f8fa4ba3fbc"
GIT="353ffefa21e6f8795469d118d8059aa16ef49109"
INSTALL=''
C1='#8'
C2='#.'
C3='#)'
C1='#.'
C2='#+'
C3='#&'
cwd = os.getcwd()
join = os.path.join
@@ -164,5 +165,5 @@ if __name__ == '__main__':
Scripting.waf_entry_point(cwd, VERSION, wafdir)
#==>
#BZh91AY&SY�ê¹Ü&ëÿÿÿ¼@ÿÿÿÿÿÿÿÿÿÿÿ††"¦T€�#)a2€€Xaìœ÷^k¸@#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)úæDÚ±ÜÅÓe_Z»l2Øi—m[7×Üî]ÜZ+Ù©.šµ­Oœî£Ý“©ŒÖZµÛ�¯u§Ëï«î\&}½tÅ+¸Ê#)u{»ÞnG¶�=ö:k“ž¯[�]WN�óǘÖmÜÏç.ç[™ê½é )æß_;wàßmíÙ^½Ý°�lZúqO¯¾À#)#)(#.#)|ì#)ø[k#)›íJh#)=Í ÷·˜#8=·i`îoG#×¹Nu¨h#)è‡_wµ»z:#.ÀF„…#8ÐôtrÐÛMRQR•A@HØ÷u).Å2”€¢[möõéîƒG¾Ïª¯¥ó5ß=0×½Üë{Ý.½¸ U; {iÓNۦͯ»Ü¥[Ucé]Íñïz×o}콫l·zÏ6ëÝíÍU¾ïZ÷�¬ï7ÝÞ÷±îGÓ,×»ëº|k>îæÎå{ëï�}·²›˜oOvlôåîáÕèÓ#)³Hè==5œÏq7½{“A #.÷½Õë)$�S{Üí¯]#8Hª¡(Ðê#.ìª[ZÒ[w½íaîÚYÙï jw½åïy÷½÷YØ;4^޺ȣçgÖù÷Þ÷Ç·�j›;½*›m«í&�lk;zï½ïyö­÷¾ï> +îø®Ùç×YãÖP(•Z/®8fbÞ}·**½›¾÷Ýög7Û¶{¾½æ6½ÞóÛÞ÷xÍu×ß{ïTK7}y¹é•Ø0v�oc{Éßkصzœk½Ö=2)ÉäzR™{¡máíݽõ¨C®s;æ^ï¼Û}›»Ìo5íÙÎûºtú=Ǻ-÷4¯[›ÞÛÙ^ÓŸwïg®Þ_Ö#)/yož}óß^Ýä>>ñzõæH#)*#8],û‡v#8õ«·LvJ•—Y´z7›Óצƒ¹ŽMu†ôgi2íp²öìòöØiPyÏ»ëÑï€#)Ïw-º#):÷·>Û½­»æúûÇ�ðN{»îæÞ÷¾º÷±öÎ÷!ö©ç:!m®’»rF†ŸÓßo�}ÝßZZëŽÃzï{ÞUÏmžû>-ëîîÝo¤CÚûîÓîÞ§Û7@ïUãÒZÑåÛ×;uÑ>Û‘î½ßKÙç[¾Û·Ó»/wݾËËqî�Ìo¡äï-ôWÛŸ,ë/\è,Ù#)wÛ¦Žëg4­Vï^Ã:nƒ_A�vð¾‹{è[{ Së}æç½‡|D¯«'Ýí¯¯}×'¯p½Áëîõ÷žçzÃ×omÛï¹}ÛÓ_fï½w¾öï·Ý{o=ì7{gÝÜŸos›¸è)ô ök¡Ð®÷:wd>¨=ápiAáÇ]N»³à#)6Ç£F€#8.»#8ëL#)�³‘¶Ùï‹îîhk@�f(VÎû+ï°ïPi÷7�]aõêûÎô½¾÷Þûtû^¹»¶ç§½½ØÑ‹—k—gX:áÜßovkOuÝ·S›=wF²¥s³§Û½ïª÷{ãÞ¼A÷Êou‡WÌùÓu…ìÃFŸ}îñ³mtÛ¹²·wܾíî½wozî z}zûH¢ù×YÓÅ]ÞZòõ#8úJÞW|%4‚#)#) #)€ÈÉ„ÈÄÓDIž© ýHh#.#.#)h4õ¦�!44h&I²˜¨S&ž¡å h#)#)@#)#)�Hˆ"b#)@CFBIú&¦žÕ6¦i¨4&� ž i #)#)#)#)ž©I4�4SÙ1&TòOÓ*~¨ý(1Bi£@h=OP#)Qê #)#)#)#)"HA#)@#)L€ 1h#8{%?Jm&§é¤™¦š@SCM4šˆ‚#)�@L&“$Ê7¢šdýIêzM4õ š0ƒM#)#)#)#)ÿöùoã¶Ú—HÄÿh“mÖ\ýͶ§Lš)oŽÛWtdF ‘Yb¡ ’Š x¬ÕíöT­(_„~R;Å~hrßó¡MaDÕÆ*j0÷ICâï=ÞíL«2²ÎÆŸ�‡‰?±ew V䢠®Œ@ €]»>¾÷…ãpŽR[›†d&œªEdã&2MÓUËÌ&7¸fYní1sud©<+x¬JÁ0«#)ø»"ï âˆÅ<“zɭ²ÔÒIcþw„;þvCÅ‚Vmb’뮪ÓmmªÄ‚Æ+  È "*]T"´"  Ìˆ#)ˆ!!ˆ¢6 #b ¤ ¸!D#)Ê7Š¡Q¤µ HŒŠ–‚ ¨�*Ûl�H Ĥ34ĈLˆhÆm3DIMH¥Œ‰’”S¶’¡©’K#.hÚ•’ƒ‰@“4M”-“+2‚*‰cBi…(,i#&ÄZ1DRJT¦j‰ e¤‚¤�LI5´š¡`̳cKR1AI(¦‘#LØ´j5J­6ª”“Y,L™&HÔ[MRµŒÓ Ùšf©,™M¶%M±1³T’jadQ$Ô[25#5£R²iš#8)(ÐRZH-¥RC610BÁDÍ)‰¦Ä0M”Ø&H†3€…L“"Qad¶H)bY,‰"R‘I))b“$DÆJRmBZ‚Ìj"¡‹#8(¥ `E€ÉDšFQ1‹&Sh¤™i ¤‰ Å‘¤Œ’¥S0Ö�©¤Q6“I›©6,h’#.�R$¢¢¢ ØÒRÍŒI©1‘‘ 2#4�&Y˜ÉY”ÀЕ‰’¤ØB@’M4´“&‹)L6ˆÓH£B(…) e Ò$ÍRÍ,¥”†“K$Ù¦Q 5,RY‘±£+$ÌI"‹@3c,�¨’È*#8Yš1´YCd£2›4IMm6#. Be1�0‘©2Rfd¥š�%•*6(˜AE&¢&$È‚JPSF€a$d†™DƒA `ÃZhf²̲,™…)#8m&ÉE²E£I2I(J,”4�`"���“,E#.’MšÌdÔc J†S4¦!!°©“DT±‹56)2‹#&$¡M’HYEI%4Á@ÆˆÚ RdÒ’f&É£&B¡�F²L¬L6‚ɲR„I,™FB)¦ƒ$e2‘–#¤¥SfŠ�£Q �L‰IZ1¶4“5‘CI�I #*4†H bZ6�JF(¬L´™š)0’ȉB¥�£I�ÆQšCeª›[h)*Š2jhÉA²’6Šd¦IŒk%¢Í4ÆS4Ód¥(µ21³lJ4*lÆR3@…#8ZýÖ·F�²´†BYFJkZ+Š� ™QLQ²Z#.S$ÕLE#.ƒK†” šHÖcc!‚¡–¡-E‘MdÈle•E¡bdÌjZYŒ’*,32š¬Ñ¦B¬�Hªm…b›(’ÊŒ¦ÛE5i6�¬ÙZÍJRša¶˜¡Lˆ±­jTIi”hŒ±´V6ÌÑT•Yš£U„Š’�¶6�‚ÉF¨Í#8¢�¨4ZƨØf¤6± ¬�¢6ÓD2”IE š(Ã5(”Ú•F£d“hƤ,j™2µ¬­i ‹Yµ,‰•5‘&fjiH¤™­RÔRÒS54©•¥R²UJ˜ÛJ™JM©¥i³“C[5™™$¬±A°jKim,…¦”hˆ Ôi(Ò!l„d B‚™&6£jH”X¦Slm)4ÑQ’M’˜P¢‘L¨‹‚ÒÌiƒMÉL˜ÖSf†4HJ,É b•š’ÀclË&YÌ!#8RÉ‹f&ÄERQ‘ Ò,Ê-LÆÌB’±¦6#.6,L1³-@¦ŠÅˆT¦Ñ�³6‹66(Њ#Ii¡"“aK-D˜¬„ÒR2›Kbš”D’lÔ¢UU31a±RšM‘´™Eš5cD†aD”JI&ÊI¡*KFR6f‘ *[,ØÚ#8ÊlÑDlblRi©&S&Š™Z‘“)hÙ)(Í‘$Á,DÆŒi”h¢²É²R†&"jHH´V#l&Å¢£Eb+M&&h’‚“H´S#)›‘X°k-4’T†£Y3#.%,Èl…hѰ†Ñ¨­“F„Ë#8ÐDE¤¶* c ()5JQ5cXÊfhB¢¤“i…ID–��ÑYkSdÔZ(ÄÊÉhiJ4¤¦‚‰*Y%IL¥(Õ±©"‹%J£ £d±¶M%E�U3Ê6RÙ T4“6H¤Ø°ÒDX±i™(fŒIƒQ)–$Z¥¦)lÄR�Eh¶*’¨d˜ÐƒMQ´m2J*@4¢““V”ZST¦Òj+cXÚÌÅdµš@V‹dÔ”X¦)@ÉA�š$&6J`у6ÄV6-£cJm´”2Ñc“QQ!Z&m–mFÑX±kI¶¥³d4²±*ŒZ)–*¦¤Ò²Œ£E(–LYR¢ÒVJɶJ6É«›JfQdÚ4)ŠJ4Z5¶Ù­i£5#.’ÄIS(Ú*5…Ði5-š²c#*ÑD[EhÖÅ¢ÛhÚ¡–Mkjš••DÙH6’cÊÂÊQd�šTEÌlII”“"!jJÓ-Sõ—ñ/±^íÏáEâþÚBÄÑZa¬ÿG#8)«L¶ýoçlá.Ñnl|;²YzÞ¼½×ú¨ÞžŸÅü]|0ÎE¸9þôè2�ŸÍô‘ížtˆ}ºN2�â´4×,†ä°RÈÄi�ŠÆ7U";W÷�¿Ÿçvøõj�ÿ�ýŸäãÇŸ÷¶V2ñÆ]QTÁK;kµ–"#Èì, ‘Ñ;f﮾ÛÙ‡èÔçn&ž–,gð®éÇX;£‚�#ÇÁÚÓä5ru½�c,“#8J˜ÛuÊãk´ðb­¡Ø£Â&9•B«²ZVJ£)†’9*Hד`ʨJQ–™BÙ«J�ªp¿åÑ�^–ö`¹¹¨Ù5f móÝx1ØÒÐMÚ¬"nÈcÿìI§{7)1 Š7y׊{;wÍÛÊ»ò(À¬Æª‰|˜¹j�1ŒùÃ)bE‘Wáýû,��µ£0#8ƒ+k´:Ul¡ d¡€§†t+û™Éq¥j©%¢YR�Ç9°þøÍ;(82Ø,‚; I§¡§vfU¤q\¢:��+…{™’l%mu÷ùyáIdÒLóÛÍæ)®ît]ÆŠææM!I­$)‚ø ÌHe€a §Jñ¹ä�²&Zd‚‚°BP” ÇMì�ó²ñG6h MMWNÁ„¤Õ2¢RiTD�ñWôÛ^óÒ÷jº–ÞÍÓCÎÜÑ‘AðùÞÞ–FDP£G¿¤U£–�Û¯fÞ^+½û©ÝGJåÉ7uØw]4Tà«yçRù]äKDkëJÍ#.„@DÙ­”­Ä dX¯ÓT�á Çó¦óÝö_Ž Mû’3–I;êc"U…È‚0 4ˆãþø#.z?ž�nÔDSS8–ZIGÛU¯mËè3o¾¦ß›æzø¨Æ±œ�á_¯W1 òPÇYO:OõáÜš§#8ãPïãK²gŸ¿rN؈z%"ýUÕÔúÖq1ŒŸ+]­ñq P튀€ „ŽôÍpÞá ê”)3OeÐ1¶ƒ~ʹ0!tZ2ékÑch¬]˜V&ë¡B6 ¼ô¼}oÇaè’¢tÖ‹6j#.�((Æç±—S+áîß·ZÄ›#.KHíþ´‚ò�öÉ í6IŒ�øúí}7tlŽƒ8ÙDË­×6e/W)QÚi{ʤç'Hq’I22VÚiýý!F1dQ>ò7î]ÔÚ,h¯̲oÍr±ªý)¨ÓéphÛÓwâêü¯ ›ýŽßƒ÷û_=ívŒrÜÖ»«¶#,Äa*ON\¯Ëëð{zÚÛÉBE–Ѐ§^u„ÂEä… ä!BKII¦ÇÙŠ" ³H#8°;\¶4¹‚ñq”oÓ5È|\i-‘6ÍAC™Å–d•6&ЛÆ£1#8E�ñhTM(í½=3FAÿHj]0“_*žÙ±ü(œ²T0ˆ‚é[Y²x°00Q!­|›S%6�#8Ò‰s»MÆB“z º÷WšM>Wد"{8ÌœµÒ‡eBS¦´¦Ì4‘º¨¶•DÓ¶ìþ^\°f¯ÎÞʲ ¤™*‘€¼+²áú$cb}¤e|¦x<C%¨öâ#.²µ¶–œe’d!¨£âFÏ'#.µÓXV˜6εåt+<{jLÀ(ò@Þúñ£'…S}õ/ÅÜÉÈæƒÛdðÝi¨g±ÃfqíDU‰ê£ºeG²•ñûañÏ#8Cê|³£ãGÔÅC¼"÷ý¾r*Q"qJ„R4(‚w8¹GÜW–ÔÄ0„Œm6aq‡–xÜþóé}×MÞá½ö2uCaÇêÌ!ýÏJäÍ2Ò &�"ô9ßW¨Þ]=ðzÓYN˜“a ˜éIwÒL±ªÆÝˆÕÊAãÆ‹%² o^ȆÊÌ‹ßPo‰è÷�i�ho7¯Ù£Y¸øÖÍûøÑsW½QNo‡ø˜ °ù—C³F+žqô¼#ßážÛ†Ï•˜¨wÛ‚Loµ·Ž2±ŠðÚjLù¬Ë´ú÷® #)Ù±Ÿ}²Z‰HJÅW¢š&È?dB|J^èš±J;jA´ÄŽØ—,Za�ù=±*øð¥Line truncated
#BZh91AY&SYžl#+‚T?ÿÿ´Ðÿÿÿÿÿÿÿÿÿÿÿ5 ‚Ä£ 0�™E€(b÷½»&T#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&}^úk™J×Ü×TÊ{°]ª­ he-ÛÛv›XÕZË{²ªKšÙ"ûrò{�}ÕݦÖC·]§v½›Í<>ûç7ÛMiÃÝ»±’ƒÕ9[.n‚´­µéFC»¸íž=o{ÐÓCßGŽdõÔ^{¯žuÛîáÉî6Å=kÞÏ{ç½÷ß“㽦¶÷´ÞS»îmìæ÷uÜp#&ô#&#&Ø'±  tz=<>O x K»fu½w´�îîïcÕÚ�pÅviM#&4 Žçuö^Ûƒ”#&ôîÀ]Ü$((m”(: $*”¢€=Ø9ID�t@ô#&j (U[Ü=x"£¾{=çZ}½ÂôžõÑŒ›½^Þn­Ul능Gl�j¥»uk]÷šžÚ^ûÝ&ƒÜÝãﺮ¼öÏowN§‰é×�ç¼T�·½½y½÷¸÷¾÷»Ý}löÛ¹[±ëÇÍ÷i·Üï¬òzåǼo^u¶ÝΪÛVÝg·§AH*H^˜==9WC×;=ì÷›nµ›»ï¼õ�O¹’‡»w¼tvIͦ%�¼å{ƒ@#&B¢”ªH4<ô÷¹ÒŠznõΨ÷°í5’}àvûÝ>=‹·C' ôÅ-mk®é}Í1 K¾°vØØ#+|îóÀ#&ÛÛpów}†Þ\ï±îßO{ï±í¼kêñ˜=î=­è“ï{ÇŠ–œ»èðuäµ­¼'¬ùðî_]Ö,whmݦíNî³�ÞÞvÓÜÜܸÝËw7»uìç¼;‚†o¯r¾Øt»¹Õ#+n¸;uï¾ûï°­ìxŒ½²·RöìÎûœšyêPO7*ÁtãçÙ¯µ®glí^Ý_n%y�1÷²\×Ù½›Å}rŽ<Ç”æ®7FqSºo/X#&]é¥ÛÞñ×ÝÖ‡z=){ž”Š(#&¨•R¥**]‘Ov@Ïa«¾û»ÚÍ;¥#+]Ôë±Ol#“»Tè¯UÃeëB\éÔöñï1Sqå·C¡u·®æ»™à#&#+½�v�#&Q½ëÞwy«^y½¬òžÛËYæ–æhÊëªîYœèÍÆå¨ly²ï`é÷ÝÏ­ö4-!Ë®\عÑwÛ�W»ŽmóÝ8ÝÍÔx *veîzv²^Íîmêyª}ì¯|4Ú´o1Ï—žÇß3#+“ºÏ{¹´›\9b¾áõÊó­»iñtäöYÒ4Æg­ P6£k=@n>¼{àíΠ«]ÆÊ®>-Òõ¦Û3Žzz÷½µ9Ïb#&@ ×¶\5kS•Þ÷»zttÍ;¶ò±ö9ó#.½é½½ŽÕM^ðæW{:ºû³7a}í÷>ï­e¨´PõÐÓ=š]Ö5²9£!ÛŒí@!Ý£s¦½çyíçßk° ÛÄ”K0¯g·wh@ÐŒ×'w·zyõO{œÝ…P V´7¯o#.÷v²€'=µ¸ÝåvËf¸Ñc#+í�ÝšÙÎ%»h;»¥@IBå×ÙJnÛ»ðw¯%»œibzÞÙ%íIæÌÎôöù{×Ä=ï�öµ¬ ö>Bö`ɦóîñìiç8heqïrÛ�Û»�έ××väúô½õfͨîîܣūÅ\nttoŠøÙÃM#&#&�#&&F†‚4Ó#!¡1iSe4hy @hmOC'ª M€A#&##A1z‘7¨À iµ<§¨õ#&P#&#&#&#&#& ˆ� ‘¡¤hi©‚iSÛU='ã*Ÿ‘=(z�êš#&Óõ@#& h#&#&#&“Õ(¢"™‰’©£ÊxÕ<£Ô4шÐ@�&i4#&#&#&#&#&$ˆ#&€@ FК4È©ìÈ2Êž&¡�#&#&#&#&MDA#&!0! Ié¢bFš6�§šSõ=(Þ¤õ=O=CG”#&2#&#&öü“ý:«]Ä�õâÛS¯×ªÒì $¯­V»tL‰²È$Q„Å#&R  §Æ ©Q#&Ú“~èü:XíüpxùËøä4JKOæÇœE§ÄL½L*x¬nã“™Æ*ÕÄå«Ì_#ýÖ{@µC€(D"-Êi#.%Jé¨Ý6å�ÜîîîÑ¢wS×}ÁrNB~"ªŠ‡¨—‰×'¬>ÍâeîâðaîÕRð"ï#.Äï…«pa‡þ\Ÿ�ÌCóMT¶™¶W+µZkZɶ¬š¶“[mÚ*ØÖ«{U¨#&%D@‘BVP´HЦe$b P$q€ˆYP‚#+ˆ*I¯ØUºm¯5kim©«º-ˆd(ªd¢(�Â0’#.Q™¨išlˆ1‚E&ÆÔDÌÔ"XÈÔ¥QM´› LÐ&‚Q’ÔÔm�ÑšK&šDh–ˆD¨Å"jR‚@#+£RÆ€4Å•6�I²Z6¢(JYiM5¢!e¤6h& £31�I�FÔdš#+)²E i�%a£K-#JZ54ÙÚVÖ[kC6$±™“2DPe“m-´ÓhRQ²“S[jm³6e¤É3A°5¦&‹%È£dH´"EEšFÑI€ÑQ …ƒb’¦šTD)ˆÁ±B‚DIb¡‘$mH™ÒÄA#+³42"b˜H†d²²Á™‰4–F"–MdØØÑ¨Ì*Eˆd²�‘¢Òš`›RdQ”I£&†Œ˜�T”iˆÒH�ScD‘b(™”´‚)˜&ƲC6"LSC3`˜X�©,K+E�JM�AjJ()"JˆI�R(˜, †C%0Œ&P™I)5fÆ�a6MILB!-)²„IKbLYfQHÙ’Q6fFÄLØ™J3df •M1$"ÊPlÔX $i¡±ˆ�JÉd�Š%HLŠi& š�*i�,hЄ“RK(Ê j4™¤mM4Q5¨, ÒYÅ’“"h&™H•3 ›J˜¨6ÄÊA! "“1�F4,�Ë ŠÙ&TÌ«1FÙKbQ2‘LB‘±e#.Êh©"Š0E$’l‘�ŒdÙ¤jf‹#)!I™˜¥‘•›L%b#ERi©“LÈ) eHY¢*lQf¥JRSE!²2c&E6�¢É¥I#.DQb¨¤“I¥6�&£H‘CHØ�Ê�4È›A£c0e�šL£cH™ 2 ”Ù)LRˆ„,Ó!-fÍ�¬–$†’ÉŒ†¨ª A"k#.D™ lf$FPjK‹,‰DтԦ”#.-L4$̤Å0Ë&ÈŒ¦ ³F™a#+ABi2‘&ÛR¶´`™BjfŒ¦F&”RLȈ­¥-�K4YŠM#(K,©³DZ™h…²ŒHb›#.Q¤aBSkö›]•5Hˆ# Fmcb¶6±Q²e3ME*I£CKHZ�„l“Qµ‘jLe"Ê`%Iȃ134Ëd¶ˆÄÉKcj) FM0‰bk1cBƤ¥¦™2eI¨66U¤h©²„VÉ–ER©Y…6lf35lX²#[&™Y¦YM¬•e²”¦™Ù%#j,SYbKHd¥¨µAUCQ«FJ‚Ь•’�ª6ŠŠ‘(Ö‰¢&HÛ"Ñ‹¨°ËFÖ6ÒdÂÁU¦QH%�ÈZdšVšÄ[6˜•Œ[$XÛIÕTÕ¬±PÈL¦jZÉ¢J‘‰šm"‹$mjU›c¦Ò©e*e–TÒ"5´ªY)ªjhØ…´$¦SYcCe’ÙYd+f˜ˆH(eF’$,Q, £"D6ƒBc¥´j„ BTPÉj+$ÓFÉ“IE‘Ùb‘M”�£dEe�H¦2™‰B’�šf�ˆ(´Zd„Fm6“F6ÆÈSÍ2$1�(°ÓFf ±�Ù1 ’f¢�S"”h,²�ª¦#&ÃF“a)S,�š‹FBŒÍ¨ÊQ³)$£ hÈR²šÄE0ÚM�I²XF‚ÉXBŒ–Š †bM,ÊlÊJYJÌ2V0‚ÍH؆5"Ôj�šÑš"¡¢¥4›#+1RÅfQj4  2ÆA¦&Ä•%I”1²šcd�¤Ëd¥5ƒlÃf’ɱšM6b%#+(ÉišÖDi¡S4@ÊXbDB#+›0D1£lÒ6(ÑY¤Ù)ˆX˜‰¤¤„‚Ñh¶£Q¨£ŒZ35†“#+$š,™¥FÅZ#.Í6K!™D#+’–RTÈ‹hÚ5�Qª$ÑBe•EŠ$Ôš£`Ɇ!aÕ)CV6ƒJi–BŠ4IL’Ñj‹b2•¶EJ*�cI‚"É¢)™BÔ¢�Ì”ISbQ6Õ«Š™Qd¨Ú0¦,Ò‹dÉXÖ´˜¤¬¦ÙÙ66†‰²JdJ‹#+��’�“D‘�²D†¢’dj̘4¨Ò›3bb)¬jŠ™Y5™BšI¨ Š(¢iµ%bÙI,l˜Œh �& ’µ"4ZYhÚj$´Z¢¬e(ÚMlˆ!Tm�IEŠE4&E23#1¦¤F#S6IšÑIbÚ5%K*É­6 1lj £cc$UE2©¥XÚ6��¶1mI˜ÊQ f²±-F+iQµ´©QJkJ3ÊB6P4h°D•M±¬Y•$Z’¶,›e&Z�ˆiŠLhÚ6ÖÙmX¤L¨TLIDb¡€D–4lSI6¦É*ÆØ¶Å¦jÚ1­e¤©¡–¶Rɶ¦¦Ù j4Õ‰£(¢#FFÒJ(6ÍI©36YQj$Ä’e$ÈŒŒFB-’Ú6fÛ1ý/ÇE¿y«ó/ç¯æ/�~�ož£—õÑŽ%`²S¢ .¡) ŠѤÙôœó¶ýï;×7ô?¡×ªaˆ2©i*�÷ß6\Sý¾ò¤4a×%qÿ³8Ä£ƒE ‡G±.)$ª $˜*ƒ‘»á±¢qýª¤èÖÿÝú­hÿÌI(R×+™|ÂF"ú9èÃü,[sƒÔ*Òl=§_§Æû:‡ÁYA‘úì;³V-;brwxñûÐÍ�IH¡²N(mÉÉcýÕ»fÍI«#.Æ£#1�$v—l‰³1¢#+�÷ÍsÉÉ£®ÉÞwHLoyw¯U{/åœîY=ן•Ög5r Ö¡LD&¯h™TìÆ—2�J”… "E„‰¡7»n¦(WHÈ{ôër¯uÚ†_Vå‘•ësIY AL^,0˜ª·¹qÊÿÞ²Ãü¬wpÍ1‚‹#»B”Ãw^M5Åøz¹IlF1IüévPîx=1Z‰ÚôlEÃ#.m#.E“¿–IŸâô’lÍÏ�1´ÐØžj¤ÏxþÍËÅücÔ±9;¡l#.Pˆa4¬W‰íÿUuÑ–ÌwOe sfIxÝÉM %kìQæó¹,3ã¼î¼£åÑwÊæÝ,†¢®mÓÎãFÅDüEŒ%¤#.)žê âŸ-<ÒSÊú¹ØÜä?¤ÝjñË›�óÚ!,;÷Ì ÷´òeˆŒÛ1é§dR k~§�«åðø|ª®RmÝsñÆ#+®Ó�Ç„‘†õ(ÊÂ5¶£Pq5×+¼îÆå+—2Q—]ÒHç2åko/:ÿjÿë5J&©B±H:Tˆ°À…43»leÓ'–¬X+ꢔ}Óòq¦6§âôĆ_j’ïÞë—Õ¯½óíàj'½¯ç+Ðd«Õ€¸IK��õõâÐ1Ñ÷èa¾[cüÆL�ÑuBØYöT®»Ü¾ÑúøýÌŽ¢ö]ëµÉ"ƒ2š‹R*(Q‹ƒ‰fbã­•–ñÑ…8ƒ“«Uíâj3»á¯S6Òê3–+â|là̳2±{yëxAï¡{)�TRŸŸ;ôsÊú>„ìÝ­Ó“_*…$E�¤#.d9 #b;StÎ�AI£F…y&,¥:²Úl�…^”<t,¶e‹)�IÑ¥@"8Ï;ÇÍøâ§Ur‘zëFÉ‚ª�'Ó‹¸1‘�&ÓÉ÷2…}á«ÑÖDØä5<óüµ~{zŹÓé:Ã2b—Ýë�*(Yè{è,C|ÖØ•«Ñ±‚`©ÐKåÏ–óÞžã e>I{ù;Uí¥`óeká]S ¥(TA@·rɨÞ6®m¯õ©ï%~›©›YB¼((b±ùø~Û¹¢) ”È ®½õþG›^¶‘1ŒJj)>�Ê0›q#& È8ÅÙë°#.3lïf™Ë® EÍsQ[�ù·¾ÞD ¥Y*7rÆ¢¿j[¯—cóuÆ6Å ¾ç_?OwŠ|÷tuÌlZ6M¾×áoÔK~G@Cb|3Òìaõdöïš`4¾L‹"#J8Àã­IhýÕ\Ê "1‰šÖÍYö¤˜IJÏÌìü½mÙC#Y6+ðwU³µÐ´’¹ïeá¢$H´‚Áa«l—AHÒPŤ‡Ò'mHµ§…C.‡ª�¥ÊIuV”ŠíßV²7ð«SÃJ]ü+)ÉË/Në,°ŠŒ8P¦Ê8VpãÆ(øWňd´(ýñFŽí¥¶–šµö¥.ê ÆÏHE÷°�»P¬U‰Õ'›-b#ÉK£¥9!G„�Ãú�ú F½!}×Å:ñ°+<Ÿ#+tñ&÷ã�X¸„Këþ¸|3½D9z§~`cí!Line truncated
#<==
+2
View File
@@ -61,6 +61,8 @@ def configure(conf):
if 'gcc' in (conf.env.CXX_NAME, conf.env.CC_NAME):
conf.env.append_value('SHLIB_MARKER', '-Wl,--no-as-needed')
conf.check_compiler_flags()
if conf.options.logging:
conf.define('NS3_LOG_ENABLE', 1)
conf.define('NS3_ASSERT_ENABLE', 1)