89ef0c2b8fd26e4cd4a4583a599ad1982412f8e7
[senf.git] / site_scons / senfconf.py
1 # from __future__ import with_statement
2
3 _configTests = {}
4
5 # Fix for SCons 0.97 compatibility
6 import SCons.SConf
7 try: SCons.SConf.SConfBase.Define
8 except AttributeError:
9     import string
10     def Define(self, name, value = None, comment = None):
11         lines = []
12         if comment:
13             comment_str = "/* %s */" % comment
14             lines.append(comment_str)
15         if value is not None:
16             define_str = "#define %s %s" % (name, value)
17         else:
18             define_str = "#define %s" % name
19         lines.append(define_str)
20         lines.append('')
21         self.config_h_text = self.config_h_text + string.join(lines, '\n')
22     SCons.SConf.SConfBase.Define = Define
23
24
25 def Tests():
26     global _configTests
27     return _configTests
28
29 def Test(func):
30     global _configTests
31     _configTests[func.__name__] = func
32     return func
33
34 # class TemporaryContext:
35 #     def __init__(self, context):
36 #         self._context = context
37 #         self._env = self._context.env.Clone()
38
39 #     def __enter__(self):
40 #         return None
41
42 #     def __exit__(self,*args):
43 #         self._context.env.Replace(**self._env.Dictionary())
44 #         return False
45
46 @Test
47 def CheckBoostVersion(context):
48     context.Message( "Checking boost version... " )
49     ret = context.TryRun("#include <boost/version.hpp>\n"
50                          "#include <iostream>\n"
51                          "int main(int, char **) { std::cout << BOOST_LIB_VERSION << std::endl; }",
52                          ".cc")[-1].strip()
53     if not ret:
54         context.Result("no boost includes found")
55         context.env.Replace( BOOST_VERSION = '' )
56         return None
57     else:
58         context.Result(ret)
59         context.env.Replace( BOOST_VERSION = ret )
60         return ret
61
62 @Test
63 def CheckBoostVariants(context, *variants):
64     useVariant = None
65 #    with TemporaryContext(context):
66     try:
67         _env = context.env.Clone()
68         for variant in variants:
69             if variant : variantStr = "'%s'" % variant
70             else       : variantStr = "default"
71             context.Message( "Checking boost %s variant... " % variantStr )
72             context.env.Replace( BOOST_VARIANT=variant )
73             context.env.Append( _LIBFLAGS = ' -Wl,-Bstatic -l$BOOSTTESTLIB  -Wl,-Bdynamic' )
74             ret = context.TryLink("#define BOOST_AUTO_TEST_MAIN\n"
75                                   "#include <boost/test/auto_unit_test.hpp>\n"
76                                   "#include <boost/test/test_tools.hpp>\n"
77                                   "BOOST_AUTO_TEST_CASE(test) { BOOST_CHECK(true); }\n",
78                                   ".cc")
79             context.Result( ret )
80             if ret and useVariant is None:
81                 useVariant = variant
82     finally:
83         context.env.Replace(**_env.Dictionary())
84     if useVariant is not None and not context.env.GetOption('no_progress'):
85         print  "Using %s boost variant." % (
86             useVariant and "'%s'" % useVariant or "default")
87     context.env.Replace( BOOST_VARIANT = useVariant )
88     return useVariant