From fcf765daf3ccfef9255518c85cd8bedab3b772bf Mon Sep 17 00:00:00 2001 From: akmhoque Date: Sat, 1 Feb 2014 23:46:17 -0600 Subject: [PATCH] Adding waf make script --- nlsr_lsdb.cpp | 39 ++++- send_to_machines.sh | 7 + waf | Bin 0 -> 91096 bytes waf-tools/boost.py | 373 ++++++++++++++++++++++++++++++++++++++++++++ waf-tools/boost.pyc | Bin 0 -> 13169 bytes waf-tools/ndnx.py | 160 +++++++++++++++++++ waf-tools/ndnx.pyc | Bin 0 -> 5764 bytes wscript | 60 +++++++ 8 files changed, 637 insertions(+), 2 deletions(-) create mode 100755 send_to_machines.sh create mode 100755 waf create mode 100644 waf-tools/boost.py create mode 100644 waf-tools/boost.pyc create mode 100644 waf-tools/ndnx.py create mode 100644 waf-tools/ndnx.pyc create mode 100644 wscript diff --git a/nlsr_lsdb.cpp b/nlsr_lsdb.cpp index f62d12b..b4cbe91 100644 --- a/nlsr_lsdb.cpp +++ b/nlsr_lsdb.cpp @@ -62,9 +62,11 @@ Lsdb::getNameLsa(string key) nameLsdb.end(), bind(nameLsaCompareByKey, _1, key)); - if( it != nameLsdb.end()){ + if( it != nameLsdb.end()) + { return (*it); } + } @@ -78,12 +80,14 @@ Lsdb::installNameLsa(NameLsa &nlsa) // add name LSA addNameLsa(nlsa); // update NPT and FIB + // if its not own LSA } else { // check for newer name LSA NameLsa oldNameLsa=getNameLsa(nlsa.getLsaKey()); // Discard or Update Name lsa, NPT, FIB + // if its not own LSA } return true; @@ -106,6 +110,14 @@ Lsdb::addNameLsa(NameLsa &nlsa) bool Lsdb::removeNameLsa(string& key) { + std::list::iterator it = std::find_if( nameLsdb.begin(), + nameLsdb.end(), + bind(nameLsaCompareByKey, _1, key)); + if ( it != nameLsdb.end() ) + { + nameLsdb.erase(it); + return true; + } return false; } @@ -157,6 +169,7 @@ Lsdb::buildAndInstallOwnCorLsa(nlsr& pnlsr){ //cout<::iterator it = std::find_if( corLsdb.begin(), + corLsdb.end(), + bind(corLsaCompareByKey, _1, key)); + if ( it != corLsdb.end() ) + { + corLsdb.erase(it); + return true; + } + return false; } @@ -266,6 +290,9 @@ Lsdb::scheduledAdjLsaBuild(nlsr& pnlsr) else { //remove if there is any adj lsa in LSDB + string key=pnlsr.getConfParameter().getRouterPrefix()+"/2"; + removeAdjLsa(key); + // Remove alll fib entries as per NPT } pnlsr.setAdjBuildCount(pnlsr.getAdjBuildCount()-adjBuildCount); } @@ -308,7 +335,6 @@ Lsdb::getAdjLsa(string key) if( it != adjLsdb.end()){ return (*it); } - } bool @@ -349,6 +375,15 @@ Lsdb::buildAndInstallOwnAdjLsa(nlsr& pnlsr) bool Lsdb::removeAdjLsa(string& key) { + std::list::iterator it = std::find_if( adjLsdb.begin(), + adjLsdb.end(), + bind(adjLsaCompareByKey, _1, key)); + if ( it != adjLsdb.end() ) + { + adjLsdb.erase(it); + return true; + } + return false; } diff --git a/send_to_machines.sh b/send_to_machines.sh new file mode 100755 index 0000000..25e7c88 --- /dev/null +++ b/send_to_machines.sh @@ -0,0 +1,7 @@ +#scp -r NLSR0.0/* ndnuser@pollux.cs.memphis.edu:/NLSR_TEST/NLSR0.0/ +#scp -r NLSR0.0/* ndnuser@maia.cs.memphis.edu:/NLSR_TEST/NLSR0.0/ +#scp -r NLSR0.0/* ndnuser@altair.cs.memphis.edu:/NLSR_TEST/NLSR0.0/ + +rsync -a -r --progress *.*pp ndnuser@pollux.cs.memphis.edu:/home/ndnuser/NLSR_CPP/ +rsync -a -r --progress *.*pp ndnuser@altair.cs.memphis.edu:/home/ndnuser/NLSR_CPP/ +rsync -a -r --progress *.*pp ndnuser@maia.cs.memphis.edu:/home/ndnuser/NLSR_CPP/ diff --git a/waf b/waf new file mode 100755 index 0000000000000000000000000000000000000000..f916f715a84e6e1f56ff2b80ec37c691278ce231 GIT binary patch literal 91096 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ⅇ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 m2E6sw_|*CSqeCyd_I=+VRKNZ%, 2008 +# modified by Bjoern Michaelsen, 2008 +# modified by Luca Fossati, 2008 +# rewritten for waf 1.5.1, Thomas Nagy, 2008 +# rewritten for waf 1.6.2, Sylvain Rouquette, 2011 + +''' + +This is an extra tool, not bundled with the default waf binary. +To add the boost tool to the waf file: +$ ./waf-light --tools=compat15,boost + or, if you have waf >= 1.6.2 +$ ./waf update --files=boost + +When using this tool, the wscript will look like: + + def options(opt): + opt.load('compiler_cxx boost') + + def configure(conf): + conf.load('compiler_cxx boost') + conf.check_boost(lib='system filesystem') + + def build(bld): + bld(source='main.cpp', target='app', use='BOOST') + +Options are generated, in order to specify the location of boost includes/libraries. +The `check_boost` configuration function allows to specify the used boost libraries. +It can also provide default arguments to the --boost-static and --boost-mt command-line arguments. +Everything will be packaged together in a BOOST component that you can use. + +When using MSVC, a lot of compilation flags need to match your BOOST build configuration: + - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined. + Errors: C4530 + - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC + So before calling `conf.check_boost` you might want to disabling by adding: + conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB'] + Errors: + - boost might also be compiled with /MT, which links the runtime statically. + If you have problems with redefined symbols, + self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] + self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc'] +Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases. + +''' + +import sys +import re +from waflib import Utils, Logs, Errors +from waflib.Configure import conf + +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'] +BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include', '/usr/local/ndn/include'] +BOOST_VERSION_FILE = 'boost/version.hpp' +BOOST_VERSION_CODE = ''' +#include +#include +int main() { std::cout << BOOST_LIB_VERSION << std::endl; } +''' + +# toolsets from {boost_dir}/tools/build/v2/tools/common.jam +PLATFORM = Utils.unversioned_sys_platform() +detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il' +detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang' +detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc' +BOOST_TOOLSETS = { + 'borland': 'bcb', + 'clang': detect_clang, + 'como': 'como', + 'cw': 'cw', + 'darwin': 'xgcc', + 'edg': 'edg', + 'g++': detect_mingw, + 'gcc': detect_mingw, + 'icpc': detect_intel, + 'intel': detect_intel, + 'kcc': 'kcc', + 'kylix': 'bck', + 'mipspro': 'mp', + 'mingw': 'mgw', + 'msvc': 'vc', + 'qcc': 'qcc', + 'sun': 'sw', + 'sunc++': 'sw', + 'tru64cxx': 'tru', + 'vacpp': 'xlc' +} + + +def options(opt): + opt = opt.add_option_group('Boost Options') + + opt.add_option('--boost-includes', type='string', + default='', dest='boost_includes', + help='''path to the boost includes root (~boost root) + e.g. /path/to/boost_1_47_0''') + opt.add_option('--boost-libs', type='string', + default='', dest='boost_libs', + help='''path to the directory where the boost libs are + e.g. /path/to/boost_1_47_0/stage/lib''') + opt.add_option('--boost-static', action='store_true', + default=False, dest='boost_static', + help='link with static boost libraries (.lib/.a)') + opt.add_option('--boost-mt', action='store_true', + default=False, dest='boost_mt', + help='select multi-threaded libraries') + opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', + help='''select libraries with tags (dgsyp, d for debug), + see doc Boost, Getting Started, chapter 6.1''') + opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect', + help="auto-detect boost linkage options (don't get used to it / might break other stuff)") + opt.add_option('--boost-toolset', type='string', + default='', dest='boost_toolset', + help='force a toolset e.g. msvc, vc90, \ + gcc, mingw, mgw45 (default: auto)') + py_version = '%d%d' % (sys.version_info[0], sys.version_info[1]) + opt.add_option('--boost-python', type='string', + default=py_version, dest='boost_python', + help='select the lib python with this version \ + (default: %s)' % py_version) + + +@conf +def __boost_get_version_file(self, d): + dnode = self.root.find_dir(d) + if dnode: + return dnode.find_node(BOOST_VERSION_FILE) + return None + +@conf +def boost_get_version(self, d): + """silently retrieve the boost version number""" + node = self.__boost_get_version_file(d) + if node: + try: + txt = node.read() + except (OSError, IOError): + Logs.error("Could not read the file %r" % node.abspath()) + else: + re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M) + m = re_but.search(txt) + if m: + return m.group(1) + return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True) + +@conf +def boost_get_includes(self, *k, **kw): + includes = k and k[0] or kw.get('includes', None) + if includes and self.__boost_get_version_file(includes): + return includes + for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES: + if self.__boost_get_version_file(d): + return d + if includes: + self.end_msg('headers not found in %s' % includes) + self.fatal('The configuration failed') + else: + self.end_msg('headers not found, please provide a --boost-includes argument (see help)') + self.fatal('The configuration failed') + + +@conf +def boost_get_toolset(self, cc): + toolset = cc + if not cc: + build_platform = Utils.unversioned_sys_platform() + if build_platform in BOOST_TOOLSETS: + cc = build_platform + else: + cc = self.env.CXX_NAME + if cc in BOOST_TOOLSETS: + toolset = BOOST_TOOLSETS[cc] + return isinstance(toolset, str) and toolset or toolset(self.env) + + +@conf +def __boost_get_libs_path(self, *k, **kw): + ''' return the lib path and all the files in it ''' + if 'files' in kw: + return self.root.find_dir('.'), Utils.to_list(kw['files']) + libs = k and k[0] or kw.get('libs', None) + if libs: + path = self.root.find_dir(libs) + files = path.ant_glob('*boost_*') + if not libs or not files: + for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS: + path = self.root.find_dir(d) + if path: + files = path.ant_glob('*boost_*') + if files: + break + path = self.root.find_dir(d + '64') + if path: + files = path.ant_glob('*boost_*') + if files: + break + if not path: + if libs: + self.end_msg('libs not found in %s' % libs) + self.fatal('The configuration failed') + else: + self.end_msg('libs not found, please provide a --boost-libs argument (see help)') + self.fatal('The configuration failed') + + self.to_log('Found the boost path in %r with the libraries:' % path) + for x in files: + self.to_log(' %r' % x) + return path, files + +@conf +def boost_get_libs(self, *k, **kw): + ''' + return the lib path and the required libs + according to the parameters + ''' + path, files = self.__boost_get_libs_path(**kw) + t = [] + if kw.get('mt', False): + t.append('mt') + if kw.get('abi', None): + t.append(kw['abi']) + tags = t and '(-%s)+' % '-'.join(t) or '' + toolset = self.boost_get_toolset(kw.get('toolset', '')) + toolset_pat = '(-%s[0-9]{0,3})+' % toolset + version = '(-%s)+' % self.env.BOOST_VERSION + + def find_lib(re_lib, files): + for file in files: + if re_lib.search(file.name): + self.to_log('Found boost lib %s' % file) + return file + return None + + def format_lib_name(name): + if name.startswith('lib') and self.env.CC_NAME != 'msvc': + name = name[3:] + return name[:name.rfind('.')] + + libs = [] + for lib in Utils.to_list(k and k[0] or kw.get('lib', None)): + py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' + # Trying libraries, from most strict match to least one + for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version), + 'boost_%s%s%s%s' % (lib, tags, py, version), + 'boost_%s%s%s' % (lib, tags, version), + # Give up trying to find the right version + 'boost_%s%s%s%s' % (lib, toolset_pat, tags, py), + 'boost_%s%s%s' % (lib, tags, py), + 'boost_%s%s' % (lib, tags)]: + self.to_log('Trying pattern %s' % pattern) + file = find_lib(re.compile(pattern), files) + if file: + libs.append(format_lib_name(file.name)) + break + else: + self.end_msg('lib %s not found in %s' % (lib, path.abspath())) + self.fatal('The configuration failed') + + return path.abspath(), libs + + +@conf +def check_boost(self, *k, **kw): + """ + Initialize boost libraries to be used. + + Keywords: you can pass the same parameters as with the command line (without "--boost-"). + Note that the command line has the priority, and should preferably be used. + """ + if not self.env['CXX']: + self.fatal('load a c++ compiler first, conf.load("compiler_cxx")') + + params = {'lib': k and k[0] or kw.get('lib', None)} + for key, value in self.options.__dict__.items(): + if not key.startswith('boost_'): + continue + key = key[len('boost_'):] + params[key] = value and value or kw.get(key, '') + + var = kw.get('uselib_store', 'BOOST') + + self.start_msg('Checking boost includes') + self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params) + self.env.BOOST_VERSION = self.boost_get_version(inc) + self.end_msg(self.env.BOOST_VERSION) + if Logs.verbose: + Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var]) + + if not params['lib']: + return + self.start_msg('Checking boost libs') + suffix = params.get('static', None) and 'ST' or '' + path, libs = self.boost_get_libs(**params) + self.env['%sLIBPATH_%s' % (suffix, var)] = [path] + self.env['%sLIB_%s' % (suffix, var)] = libs + self.end_msg('ok') + if Logs.verbose: + Logs.pprint('CYAN', ' path : %s' % path) + Logs.pprint('CYAN', ' libs : %s' % libs) + + + def try_link(): + if 'system' in params['lib']: + self.check_cxx( + fragment="\n".join([ + '#include ', + 'int main() { boost::system::error_code c; }', + ]), + use=var, + execute=False, + ) + if 'thread' in params['lib']: + self.check_cxx( + fragment="\n".join([ + '#include ', + 'int main() { boost::thread t; }', + ]), + use=var, + execute=False, + ) + + if params.get('linkage_autodetect', False): + self.start_msg("Attempting to detect boost linkage flags") + toolset = self.boost_get_toolset(kw.get('toolset', '')) + if toolset in ['vc']: + # disable auto-linking feature, causing error LNK1181 + # because the code wants to be linked against + self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] + + # if no dlls are present, we guess the .lib files are not stubs + has_dlls = False + for x in Utils.listdir(path): + if x.endswith(self.env.cxxshlib_PATTERN % ''): + has_dlls = True + break + if not has_dlls: + self.env['STLIBPATH_%s' % var] = [path] + self.env['STLIB_%s' % var] = libs + del self.env['LIB_%s' % var] + del self.env['LIBPATH_%s' % var] + + # we attempt to play with some known-to-work CXXFLAGS combinations + for cxxflags in (['/MD', '/EHsc'], []): + self.env.stash() + self.env["CXXFLAGS_%s" % var] += cxxflags + try: + try_link() + self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var])) + e = None + break + except Errors.ConfigurationError as exc: + self.env.revert() + e = exc + + if e is not None: + self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e) + self.fatal('The configuration failed') + else: + self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain") + self.fatal('The configuration failed') + else: + self.start_msg('Checking for boost linkage') + try: + try_link() + except Errors.ConfigurationError as e: + self.end_msg("Could not link against boost libraries using supplied options") + self.fatal('The configuration failed') + self.end_msg('ok') + diff --git a/waf-tools/boost.pyc b/waf-tools/boost.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1ee3d3438a3bad5db529830d9a979cf1ed722ce GIT binary patch literal 13169 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 OaR~p9pBOuF{r>=^-QqX^ literal 0 HcmV?d00001 diff --git a/waf-tools/ndnx.py b/waf-tools/ndnx.py new file mode 100644 index 0000000..fccad90 --- /dev/null +++ b/waf-tools/ndnx.py @@ -0,0 +1,160 @@ +#! /usr/bin/env python +# encoding: utf-8 + +''' + +When using this tool, the wscript will look like: + + def options(opt): + opt.tool_options('ndnx') + + def configure(conf): + conf.load('compiler_c ndnx') + + def build(bld): + bld(source='main.cpp', target='app', use='NDNX') + +Options are generated, in order to specify the location of ndnx includes/libraries. + + +''' +import sys, re +from waflib import Utils, Logs, Errors, Options, ConfigSet +from waflib.Configure import conf + +NDNX_DIR=['/usr','/usr/local','/opt/local','/sw'] +NDNX_VERSION_FILE='ndn/ndn.h' +NDNX_VERSION_CODE=''' +#include +#include +int main() { printf ("%d.%d.%d", ((NDN_API_VERSION/100000) % 100), ((NDN_API_VERSION/1000) % 100), (NDN_API_VERSION % 1000)); return 0; } +''' + +@conf +def __ndnx_get_version_file(self,dir): + # Logs.pprint ('CYAN', ' + %s/%s/%s' % (dir, 'include', NDNX_VERSION_FILE)) + try: + return self.root.find_dir(dir).find_node('%s/%s' % ('include', NDNX_VERSION_FILE)) + except: + return None +@conf +def ndnx_get_version(self,dir): + val=self.check_cc(fragment=NDNX_VERSION_CODE,includes=['%s/%s' % (dir, 'include')],execute=True,define_ret = True, mandatory=True) + return val +@conf +def ndnx_get_root(self,*k,**kw): + root=Options.options.ndnx_dir or (k and k[0]) or kw.get('path',None) + + if root: + if self.__ndnx_get_version_file(root): + return root + self.fatal('NDNx not found in %s'%root) + + for dir in NDNX_DIR: + if self.__ndnx_get_version_file(dir): + return dir + self.fatal('NDNx not found, please provide a --ndnx argument (see help)') + +@conf +def check_openssl(self,*k,**kw): + root = k and k[0] or kw.get('path',None) or Options.options.openssl + mandatory = kw.get('mandatory', True) + var = kw.get('var', 'SSL') + + CODE = """ +#include +#include + +int main(int argc, char **argv) { + (void)argc; + printf ("%s", argv[0]); + + return 0; +} +""" + if root: + testApp = self.check_cc (lib=['ssl', 'crypto'], + header_name='openssl/crypto.h', + define_name='HAVE_%s' % var, + uselib_store=var, + mandatory = mandatory, + cflags="-I%s/include" % root, + linkflags="-L%s/lib" % root, + execute = True, fragment = CODE, define_ret = True) + else: + testApp = libcrypto = self.check_cc (lib=['ssl', 'crypto'], + header_name='openssl/crypto.h', + define_name='HAVE_%s' % var, + uselib_store=var, + mandatory = mandatory, + execute = True, fragment = CODE, define_ret = True) + + if not testApp: + return + + self.start_msg ('Checking if selected openssl matches NDNx') + + ndn_var = kw.get('ndn_var', "NDNX") + if Utils.unversioned_sys_platform () == "darwin": + def otool (binary): + p = Utils.subprocess.Popen (['/usr/bin/otool', '-L', binary], + stdout = Utils.subprocess.PIPE, ) + for line in p.communicate()[0].split ('\n'): + if re.match ('.*/libcrypto\..*', line): + return line + + selected_crypto = otool (testApp) + ndnd_crypto = otool ('%s/bin/ndnd' % self.env['%s_ROOT' % ndn_var]) + + if ndnd_crypto != selected_crypto: + self.fatal ("Selected openssl does not match used to compile NDNx (%s != %s)" % + (selected_crypto.strip (), ndnd_crypto.strip ())) + self.end_msg (True) + + elif Utils.unversioned_sys_platform () == "linux" or Utils.unversioned_sys_platform () == "freebsd": + def ldd (binary): + p = Utils.subprocess.Popen (['/usr/bin/ldd', binary], + stdout = Utils.subprocess.PIPE, ) + for line in p.communicate()[0].split ('\n'): + if re.match ('libcrypto\..*', line): + return line + + selected_crypto = ldd (testApp) + ndnd_crypto = ldd ('%s/bin/ndnd' % self.env['%s_ROOT' % ndn_var]) + + if ndnd_crypto != selected_crypto: + self.fatal ("Selected openssl does not match used to compile NDNx (%s != %s)" % + (selected_crypto.strip (), ndnd_crypto.strip ())) + self.end_msg (True) + else: + self.end_msg ("Don't know how to check", 'YELLOW') + +@conf +def check_ndnx(self,*k,**kw): + if not self.env['CC']: + self.fatal('load a c compiler first, conf.load("compiler_c")') + + var=kw.get('uselib_store', 'NDNX') + self.start_msg('Checking for NDNx') + root = self.ndnx_get_root(*k,**kw); + self.env.NDNX_VERSION=self.ndnx_get_version(root) + + self.env['INCLUDES_%s' % var]= '%s/%s' % (root, "include"); + self.env['LIB_%s' % var] = "ndn" + self.env['LIBPATH_%s' % var] = '%s/%s' % (root, "lib") + + self.env['%s_ROOT' % var] = root + + self.end_msg("%s in %s " % (self.env.NDNX_VERSION, root)) + if Logs.verbose: + Logs.pprint('CYAN',' NDNx include : %s'%self.env['INCLUDES_%s' % var]) + Logs.pprint('CYAN',' NDNx lib : %s'%self.env['LIB_%s' % var]) + Logs.pprint('CYAN',' NDNx libpath : %s'%self.env['LIBPATH_%s' % var]) + +def options(opt): + """ + NDNx options + """ + ndnopt = opt.add_option_group("NDNx Options") + ndnopt.add_option('--ndnx',type='string',default=None,dest='ndnx_dir',help='''path to where NDNx is installed, e.g. /usr/local''') + ndnopt.add_option('--openssl',type='string',default='',dest='openssl',help='''path to openssl, should be the same NDNx is compiled against''') diff --git a/waf-tools/ndnx.pyc b/waf-tools/ndnx.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80fa8fe0889e913c146f675c017385c920110fed GIT binary patch literal 5764 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 literal 0 HcmV?d00001 diff --git a/wscript b/wscript new file mode 100644 index 0000000..e9c4c34 --- /dev/null +++ b/wscript @@ -0,0 +1,60 @@ +# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- + +from waflib import Build, Logs, Utils, Task, TaskGen, Configure + +def options(opt): + opt.load('compiler_c compiler_cxx gnu_dirs c_osx') + opt.load('boost', tooldir=['.waf-tools']) + + opt = opt.add_option_group('Options') + opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''') + +def configure(conf): + conf.load("compiler_cxx boost gnu_dirs") + + if conf.options.debug: + conf.define ('_DEBUG', 1) + flags = ['-O0', + '-Wall', + # '-Werror', + '-Wno-unused-variable', + '-g3', + '-Wno-unused-private-field', # only clang supports + '-fcolor-diagnostics', # only clang supports + '-Qunused-arguments', # only clang supports + '-Wno-tautological-compare', # suppress warnings from CryptoPP + '-Wno-unused-function', # another annoying warning from CryptoPP + + '-Wno-deprecated-declarations', + ] + + conf.add_supported_cxxflags (cxxflags = flags) + else: + flags = ['-O3', '-g', '-Wno-tautological-compare', '-Wno-unused-function', '-Wno-deprecated-declarations'] + conf.add_supported_cxxflags (cxxflags = flags) + + conf.check_cfg(package='libndn-cpp-dev', args=['--cflags', '--libs'], uselib_store='NDN_CPP', mandatory=True) + +def build (bld): + bld ( + features=['cxx', 'cxxprogram'], + target="nlsr", + source = bld.path.ant_glob('*.cpp'), + use = 'NDN_CPP', + ) + +@Configure.conf +def add_supported_cxxflags(self, cxxflags): + """ + Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable + """ + self.start_msg('Checking allowed flags for c++ compiler') + + supportedFlags = [] + for flag in cxxflags: + if self.check_cxx (cxxflags=[flag], mandatory=False): + supportedFlags += [flag] + + self.end_msg (' '.join (supportedFlags)) + self.env.CXXFLAGS += supportedFlags +