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
+398 -177

No files matched your search

+3 -1
View File
@@ -1,6 +1,8 @@
.waf-1* .waf-1*
.waf3-1* .waf3-1*
.waf-2*
.waf3-2*
.DS* .DS*
.lock* .lock*
build/ build/
*.pyc *.pyc
+254 -102
View File
@@ -30,15 +30,15 @@ When using this tool, the wscript will look like:
Options are generated, in order to specify the location of boost includes/libraries. 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. 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. 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: 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. - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
Errors: C4530 Errors: C4530
- boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC - 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'] conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
Errors: Errors:
- boost might also be compiled with /MT, which links the runtime statically. - boost might also be compiled with /MT, which links the runtime statically.
If you have problems with redefined symbols, If you have problems with redefined symbols,
@@ -52,27 +52,60 @@ import sys
import re import re
from waflib import Utils, Logs, Errors from waflib import Utils, Logs, Errors
from waflib.Configure import conf 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_FILE = 'boost/version.hpp'
BOOST_VERSION_CODE = ''' BOOST_VERSION_CODE = '''
#include <iostream> #include <iostream>
#include <boost/version.hpp> #include <boost/version.hpp>
int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; } int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
''' '''
BOOST_SYSTEM_CODE = '''
BOOST_ERROR_CODE = '''
#include <boost/system/error_code.hpp> #include <boost/system/error_code.hpp>
int main() { boost::system::error_code c; } 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 = ''' BOOST_THREAD_CODE = '''
#include <boost/thread.hpp> #include <boost/thread.hpp>
int main() { boost::thread t; } 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 # toolsets from {boost_dir}/tools/build/v2/tools/common.jam
PLATFORM = Utils.unversioned_sys_platform() PLATFORM = Utils.unversioned_sys_platform()
detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il' detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
@@ -104,34 +137,37 @@ BOOST_TOOLSETS = {
def options(opt): def options(opt):
opt = opt.add_option_group('Boost Options') opt = opt.add_option_group('Boost Options')
opt.add_option('--boost-includes', type='string', opt.add_option('--boost-includes', type='string',
default='', dest='boost_includes', 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', opt.add_option('--boost-libs', type='string',
default='', dest='boost_libs', default='', dest='boost_libs',
help='''path to the directory where the boost libs are, e.g., /path/to/boost_1_55_0/stage/lib''') help='''path to the directory where the boost libs are,
opt.add_option('--boost-static', action='store_true', e.g., path/to/boost_1_55_0/stage/lib''')
default=False, dest='boost_static',
help='link with static boost libraries (.lib/.a)')
opt.add_option('--boost-mt', action='store_true', opt.add_option('--boost-mt', action='store_true',
default=False, dest='boost_mt', default=False, dest='boost_mt',
help='select multi-threaded libraries') help='select multi-threaded libraries')
opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', 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''') help='''select libraries with tags (gd for debug, static is automatically added),
opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect', 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)") help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
opt.add_option('--boost-toolset', type='string', opt.add_option('--boost-toolset', type='string',
default='', dest='boost_toolset', 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]) py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
opt.add_option('--boost-python', type='string', opt.add_option('--boost-python', type='string',
default=py_version, dest='boost_python', 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 @conf
def __boost_get_version_file(self, d): def __boost_get_version_file(self, d):
if not d:
return None
dnode = self.root.find_dir(d) dnode = self.root.find_dir(d)
if dnode: if dnode:
return dnode.find_node(BOOST_VERSION_FILE) return dnode.find_node(BOOST_VERSION_FILE)
@@ -144,33 +180,30 @@ def boost_get_version(self, d):
if node: if node:
try: try:
txt = node.read() txt = node.read()
except (OSError, IOError): except EnvironmentError:
Logs.error("Could not read the file %r" % node.abspath()) Logs.error('Could not read the file %r' % node.abspath())
else: 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) 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) m2 = re_but2.search(txt)
if m1 and m2: if m1 and m2:
return (m1.group(1), m2.group(1)) 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 @conf
def boost_get_includes(self, *k, **kw): def boost_get_includes(self, *k, **kw):
includes = k and k[0] or kw.get('includes', None) includes = k and k[0] or kw.get('includes', None)
if includes and self.__boost_get_version_file(includes): if includes and self.__boost_get_version_file(includes):
return 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): if self.__boost_get_version_file(d):
return d return d
if includes: 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') self.fatal('The configuration failed')
else: 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') self.fatal('The configuration failed')
@@ -198,7 +231,9 @@ def __boost_get_libs_path(self, *k, **kw):
path = self.root.find_dir(libs) path = self.root.find_dir(libs)
files = path.ant_glob('*boost_*') files = path.ant_glob('*boost_*')
if not libs or not files: 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) path = self.root.find_dir(d)
if path: if path:
files = path.ant_glob('*boost_*') files = path.ant_glob('*boost_*')
@@ -211,10 +246,10 @@ def __boost_get_libs_path(self, *k, **kw):
break break
if not path: if not path:
if libs: 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') self.fatal('The configuration failed')
else: 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.fatal('The configuration failed')
self.to_log('Found the boost path in %r with the libraries:' % path) 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 according to the parameters
''' '''
path, files = self.__boost_get_libs_path(**kw) path, files = self.__boost_get_libs_path(**kw)
t = [] files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
if kw.get('mt', False):
t.append('mt')
if kw.get('abi', None):
t.append(kw['abi'])
tags = t and '(-%s)+' % '-'.join(t) or ''
toolset = self.boost_get_toolset(kw.get('toolset', '')) toolset = self.boost_get_toolset(kw.get('toolset', ''))
toolset_pat = '(-%s[0-9]{0,3})+' % toolset toolset_pat = '(-%s[0-9]{0,3})' % toolset
version = '(-%s)+' % self.env.BOOST_VERSION version = '-%s' % self.env.BOOST_VERSION
def find_lib(re_lib, files): def find_lib(re_lib, files):
for file in files: for file in files:
@@ -251,28 +281,109 @@ def boost_get_libs(self, *k, **kw):
name = name[3:] name = name[3:]
return name[:name.rfind('.')] return name[:name.rfind('.')]
libs = [] def match_libs(lib_names, is_static):
for lib in Utils.to_list(k and k[0] or kw.get('lib', None)): libs = []
py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' lib_names = Utils.to_list(lib_names)
# Trying libraries, from most strict match to least one if not lib_names:
for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version), return libs
'boost_%s%s%s%s' % (lib, tags, py, version), t = []
'boost_%s%s%s' % (lib, tags, version), if kw.get('mt', False):
# Give up trying to find the right version t.append('-mt')
'boost_%s%s%s%s' % (lib, toolset_pat, tags, py), if kw.get('abi', None):
'boost_%s%s%s' % (lib, tags, py), t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
'boost_%s%s' % (lib, tags)]: elif is_static:
self.to_log('Trying pattern %s' % pattern) t.append('-s')
file = find_lib(re.compile(pattern), files) tags_pat = t and ''.join(t) or ''
if file: ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
libs.append(format_lib_name(file.name)) ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
break
else:
self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
self.fatal('The configuration failed')
return path.abspath(), libs 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, 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, 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()), 'YELLOW')
self.fatal('The configuration failed')
return 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 @conf
def check_boost(self, *k, **kw): def check_boost(self, *k, **kw):
@@ -285,7 +396,10 @@ def check_boost(self, *k, **kw):
if not self.env['CXX']: if not self.env['CXX']:
self.fatal('load a c++ compiler first, conf.load("compiler_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(): for key, value in self.options.__dict__.items():
if not key.startswith('boost_'): if not key.startswith('boost_'):
continue continue
@@ -294,48 +408,70 @@ def check_boost(self, *k, **kw):
var = kw.get('uselib_store', 'BOOST') var = kw.get('uselib_store', 'BOOST')
self.start_msg('Checking boost includes') if not self.env.DONE_FIND_BOOST_COMMON:
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params) self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
versions = self.boost_get_version(inc) if self.env.DPKG_ARCHITECTURE:
self.env.BOOST_VERSION = versions[0] deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
self.env.BOOST_VERSION_NUMBER = int(versions[1]) BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
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.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,
int(versions[1]) / 100 % 1000,
int(versions[1]) % 100))
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
self.env.DONE_FIND_BOOST_COMMON = True
if not params['lib'] and not params['stlib']:
return 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') self.start_msg('Checking boost libs')
suffix = params.get('static', None) and 'ST' or '' path, libs, stlibs = self.boost_get_libs(**params)
path, libs = self.boost_get_libs(**params) self.env['LIBPATH_%s' % var] = [path]
self.env['%sLIBPATH_%s' % (suffix, var)] = [path] self.env['STLIBPATH_%s' % var] = [path]
self.env['%sLIB_%s' % (suffix, var)] = libs self.env['LIB_%s' % var] = libs
self.end_msg('ok') self.env['STLIB_%s' % var] = stlibs
self.end_msg(' '.join(libs + stlibs))
if Logs.verbose: if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % path) 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(): def try_link():
if 'system' in params['lib']: if has_lib('system'):
self.check_cxx( self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
fragment=BOOST_SYSTEM_CODE, if has_lib('thread'):
use=var, self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
execute=False, if has_lib('log') or has_lib('log_setup'):
) if not has_lib('thread'):
if 'thread' in params['lib']: self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
self.check_cxx( if has_shlib('log') or has_shlib('log_setup'):
fragment=BOOST_THREAD_CODE, self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
use=var, if has_lib('log_setup'):
execute=False, 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): 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', '')) toolset = self.boost_get_toolset(kw.get('toolset', ''))
if toolset in ['vc']: if toolset in ('vc',):
# disable auto-linking feature, causing error LNK1181 # disable auto-linking feature, causing error LNK1181
# because the code wants to be linked against # because the code wants to be linked against
self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] 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 # we attempt to play with some known-to-work CXXFLAGS combinations
for cxxflags in (['/MD', '/EHsc'], []): for cxxflags in (['/MD', '/EHsc'], []):
self.env.stash() self.env.stash()
self.env["CXXFLAGS_%s" % var] += cxxflags self.env['CXXFLAGS_%s' % var] += cxxflags
try: try:
try_link() try_link()
self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var])) self.end_msg('ok: winning cxxflags combination: %s' % (self.env['CXXFLAGS_%s' % var]))
e = None exc = None
break break
except Errors.ConfigurationError as exc: except Errors.ConfigurationError as e:
self.env.revert() self.env.revert()
e = exc exc = e
if e is not None: 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=e) 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') self.fatal('The configuration failed')
else: 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') self.fatal('The configuration failed')
else: else:
self.start_msg('Checking for boost linkage') self.start_msg('Checking for boost linkage')
try: try:
try_link() try_link()
except Errors.ConfigurationError as e: 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.fatal('The configuration failed')
self.end_msg('ok') 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
+129 -65
View File
@@ -1,47 +1,69 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- # -*- 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): def options(opt):
opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug', opt.add_option('--debug', '--with-debug', action='store_true', default=False,
help='''Compile in debugging mode without optimizations (-O0 or -Og)''') help='Compile in debugging mode with minimal optimizations (-O0 or -Og)')
def configure(conf): 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': 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': 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: else:
flags = CompilerFlags() warnmsg = 'Note: %s compiler is unsupported' % cxx
Logs.warn('The code has not been yet tested with %s compiler' % 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) conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
generalFlags = flags.getGeneralFlags(conf)
# 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_cxxflags(generalFlags['CXXFLAGS'])
conf.add_supported_linkflags(generalFlags['LINKFLAGS']) conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
conf.env.DEFINES += generalFlags['DEFINES'] 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. # corresponding environment variables are not set.
# DEFINES will be always applied # DEFINES are always applied.
if conf.options.debug: if conf.options.debug:
extraFlags = flags.getDebugFlags(conf) extraFlags = conf.flags.getDebugFlags(conf)
if conf.areCustomCxxflagsPresent:
if areCustomCxxflagsPresent:
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS] missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
if len(missingFlags) > 0: if missingFlags:
Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'" Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"'
% " ".join(conf.env.CXXFLAGS)) % ' '.join(conf.env.CXXFLAGS))
Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags)) Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags))
else: 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['CXXFLAGS'])
conf.add_supported_cxxflags(extraFlags['LINKFLAGS']) conf.add_supported_linkflags(extraFlags['LINKFLAGS'])
conf.env.DEFINES += extraFlags['DEFINES'] conf.env.DEFINES += extraFlags['DEFINES']
@@ -56,12 +78,13 @@ def add_supported_cxxflags(self, cxxflags):
self.start_msg('Checking supported CXXFLAGS') self.start_msg('Checking supported CXXFLAGS')
supportedFlags = [] supportedFlags = []
for flag in cxxflags: for flags in cxxflags:
if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False): flags = Utils.to_list(flags)
supportedFlags += [flag] if self.check_cxx(cxxflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
self.end_msg(' '.join(supportedFlags)) self.end_msg(' '.join(supportedFlags))
self.env.CXXFLAGS = supportedFlags + self.env.CXXFLAGS self.env.prepend_value('CXXFLAGS', supportedFlags)
@Configure.conf @Configure.conf
def add_supported_linkflags(self, linkflags): def add_supported_linkflags(self, linkflags):
@@ -74,79 +97,120 @@ def add_supported_linkflags(self, linkflags):
self.start_msg('Checking supported LINKFLAGS') self.start_msg('Checking supported LINKFLAGS')
supportedFlags = [] supportedFlags = []
for flag in linkflags: for flags in linkflags:
if self.check_cxx(linkflags=['-Werror', flag], mandatory=False): flags = Utils.to_list(flags)
supportedFlags += [flag] if self.check_cxx(linkflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
self.end_msg(' '.join(supportedFlags)) self.end_msg(' '.join(supportedFlags))
self.env.LINKFLAGS = supportedFlags + self.env.LINKFLAGS self.env.prepend_value('LINKFLAGS', supportedFlags)
class CompilerFlags(object): class CompilerFlags(object):
def getCompilerVersion(self, conf):
return tuple(int(i) for i in conf.env.CC_VERSION)
def getGeneralFlags(self, conf): 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': []} return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
def getDebugFlags(self, conf): 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']} return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['_DEBUG']}
def getOptimizedFlags(self, conf): 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']} return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['NDEBUG']}
class GccBasicFlags(CompilerFlags): 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): def getDebugFlags(self, conf):
flags = super(GccBasicFlags, self).getDebugFlags(conf) flags = super(GccBasicFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Wall', flags['CXXFLAGS'] += ['-O0',
'-O0', '-Og', # gcc >= 4.8, clang >= 4.0
'-g3', '-g3',
'-pedantic',
'-Wall',
'-Wextra',
'-Werror',
'-Wnon-virtual-dtor',
'-Wno-error=deprecated-declarations', # Bug #3795
'-Wno-error=maybe-uninitialized', # Bug #1615 '-Wno-error=maybe-uninitialized', # Bug #1615
] '-Wno-unused-parameter',
]
flags['LINKFLAGS'] += ['-Wl,-O1']
return flags return flags
def getOptimizedFlags(self, conf): def getOptimizedFlags(self, conf):
flags = super(GccBasicFlags, self).getOptimizedFlags(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 return flags
class GccFlags(GccBasicFlags): 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): def getDebugFlags(self, conf):
flags = super(GccFlags, self).getDebugFlags(conf) flags = super(GccFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Og', # gcc >= 4.8 flags['CXXFLAGS'] += ['-fdiagnostics-color']
'-fdiagnostics-color', # gcc >= 4.9 return flags
]
def getOptimizedFlags(self, conf):
flags = super(GccFlags, self).getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-fdiagnostics-color']
return flags return flags
class ClangFlags(GccBasicFlags): class ClangFlags(GccBasicFlags):
def getGeneralFlags(self, conf): def getGeneralFlags(self, conf):
flags = super(ClangFlags, self).getGeneralFlags(conf) flags = super(ClangFlags, self).getGeneralFlags(conf)
flags['CXXFLAGS'] += ['-std=c++11', if Utils.unversioned_sys_platform() == 'darwin' and self.getCompilerVersion(conf) >= (9, 0, 0):
'-Wno-error=unneeded-internal-declaration', # Bug #1588 # Bug #4296
'-Wno-error=deprecated-register', flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew
] ['-isystem', '/opt/local/include']] # for MacPorts
if Utils.unversioned_sys_platform() == "darwin": if Utils.unversioned_sys_platform() == 'freebsd':
flags['CXXFLAGS'] += ['-stdlib=libc++'] flags['CXXFLAGS'] += [['-isystem', '/usr/local/include']] # Bug #4790
flags['LINKFLAGS'] += ['-stdlib=libc++']
return flags return flags
def getDebugFlags(self, conf): def getDebugFlags(self, conf):
flags = super(ClangFlags, self).getDebugFlags(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 return flags
Vendored
+10 -9
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# encoding: ISO8859-1 # encoding: latin-1
# Thomas Nagy, 2005-2015 # Thomas Nagy, 2005-2018
#
""" """
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@@ -32,12 +32,13 @@ POSSIBILITY OF SUCH DAMAGE.
import os, sys, inspect import os, sys, inspect
VERSION="1.8.5" VERSION="2.0.14"
REVISION="d178df7a9bb732db109001d6b461550f" REVISION="a8a9afc5d151494252697f8fa4ba3fbc"
GIT="353ffefa21e6f8795469d118d8059aa16ef49109"
INSTALL='' INSTALL=''
C1='#8' C1='#.'
C2='#.' C2='#+'
C3='#)' C3='#&'
cwd = os.getcwd() cwd = os.getcwd()
join = os.path.join join = os.path.join
@@ -164,5 +165,5 @@ if __name__ == '__main__':
Scripting.waf_entry_point(cwd, VERSION, wafdir) 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): if 'gcc' in (conf.env.CXX_NAME, conf.env.CC_NAME):
conf.env.append_value('SHLIB_MARKER', '-Wl,--no-as-needed') conf.env.append_value('SHLIB_MARKER', '-Wl,--no-as-needed')
conf.check_compiler_flags()
if conf.options.logging: if conf.options.logging:
conf.define('NS3_LOG_ENABLE', 1) conf.define('NS3_LOG_ENABLE', 1)
conf.define('NS3_ASSERT_ENABLE', 1) conf.define('NS3_ASSERT_ENABLE', 1)