Update build environment
This commit is contained in:
1 parent
437f29d7e7
commit
cc9f2fa712
5 files changed
+398
-177
No files matched your search
+3
-1
@@ -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
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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Û¦Žëg4Vï^Ã: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Ø´j5J6ª”“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„dB‚™&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}½ÂôžõÑŒ›½^ÞnUl능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ÆgP6£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Ú1e¤©¡–¶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å‘•ësIYAL^,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é§dRk~§�«åðø|ª®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
|
||||||
#<==
|
#<==
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user