X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=site_scons%2Fsenfutil.py;h=f32325444dc96b97aa6f13530d28b84101475eee;hb=84f14a42f9993e186c7897ce0db021300e0a2d48;hp=7a2eb9868c9b57f848f2ce3123b064ba96b5e243;hpb=d8d169a9fa7f5633171ea83362b0deaaf5bd337e;p=senf.git diff --git a/site_scons/senfutil.py b/site_scons/senfutil.py index 7a2eb98..f323254 100644 --- a/site_scons/senfutil.py +++ b/site_scons/senfutil.py @@ -114,11 +114,14 @@ Special command line parameters: env.Help(vars.GenerateHelpText(env)) try : unknv = vars.UnknownVariables() except AttributeError: unknv = vars.UnknownOptions() + env.SetDefault(ARGUMENT_VARIABLES = {}) for k,v in unknv.iteritems(): if k.endswith('+'): env.Append(**{k[:-1]: v}) + env.Append(ARGUMENT_VARIABLES = {k[:-1]:v}) else: env.Replace(**{k: v}) + env.Append(ARGUMENT_VARIABLES = {k:v}) ########################################################################### @@ -257,20 +260,86 @@ def Glob(env, exclude=[], subdirs=[]): return (sources, testSources) -def Configure(env): +@senfconf.Test +def CheckSTLCopyN(context): + context.Message("Checking for 'copy_n' implementation... ") + versions = [ ('', 'std::copy_n', 'STD'), + ('', '__gnu_cxx::copy_n', 'GNUCXX') ] + for include, name, define in versions: + ret = context.TryCompile("#include %s\n" + "int main(int,char**) { int *a,*b; %s(a,0,b); }\n" + % (include, name), + ".cc") + if ret: + context.Result(name) + context.sconf.Define("HAVE_%s_COPYN" % define, + 1, + "Define one of " + + ", ".join(("HAVE_%s_COPYN" % elt[2] for elt in versions))) + return ret + + context.Result(False) + return False + + +@senfconf.Test +def CheckTempBufferStrategy(context): + context.Message("Checking for optimal temporary buffer strategy... ") + + def check(): + # locals + ret = context.TryCompile("void test(int n){int a[n];}",".cc") + if ret: return "locals" + + # alloca + ret = context.TryCompile("#include \n" + "void test(int a){void *b(alloca(a));}" + ".cc") + if ret: return "alloca" + + # fallback: new + return "new" + + ret = check() + context.Result(ret) + context.sconf.Define("SENF_BUFFER_USE_%s" % ret.upper(), + 1, + "Define one of SENF_BUFFER_USE_LOCALS, SENF_BUFFER_USE_ALLOCA, " + "SENF_BUFFER_USE_NEW") + return ret + + +def Fail(msg): + SCons.Util.display("scons: *** %s" % msg) + Exit(1) + + +def Configure(env, customChecks=None): conf = env.Configure(clean=False, help=False, custom_tests=senfconf.Tests(), config_h="#/senf/autoconf.hh") - env.SetDefault( - BOOST_VERSION = conf.CheckBoostVersion(), - BOOST_VARIANT = conf.CheckBoostVariants( '', 'mt' ), - NEED_BOOST_EXT = not conf.CheckCXXHeader("boost/bimap.hpp"), - HAVE_BOOST_SPIRIT_INCLUDE_CLASSIC_HPP = conf.CheckCXXHeader( - "boost/spirit/include/classic.hpp"), - ) - conf.Finish() + # Boost + if not conf.CheckBoostVersion(): + Fail("Boost includes not found") + if not conf.env['ARGUMENT_VARIABLES'].has_key('BOOST_VARIANT'): conf.CheckBoostVariants( '', 'mt' ) + conf.env.Replace(NEED_BOOST_EXT = not conf.CheckCXXHeader("boost/bimap.hpp")) + conf.CheckCXXHeader("boost/spirit/include/classic.hpp") + + # Compiler support + conf.CheckTempBufferStrategy() + + # Standard library stuff + if not conf.CheckSTLCopyN(): + Fail("No 'copy_n' implementation found") + conf.CheckFunc("timerfd_create") + + # User checks + if customChecks: + customChecks(conf) + + conf.Finish() tagfiles = None