-# Build command for running nanopb generator
-import os.path
-def nanopb_targets(target, source, env):
- basename = os.path.splitext(str(source[0]))[0]
- target.append(basename + '.pb.h')
- return target, source
-
-nanopb_file_builder = Builder(action = '$NANOPB_GENERATOR $NANOPB_FLAGS $SOURCE',
- suffix = '.pb.c',
- src_suffix = '.pb',
- emitter = nanopb_targets)
-env.Append(BUILDERS = {'Nanopb': nanopb_file_builder})
-env.SetDefault(NANOPB_GENERATOR = 'python ' + env.GetBuildPath("#../generator/nanopb_generator.py"))
-
-# Combined method to run both protoc and nanopb generator
-def run_protoc_and_nanopb(env, source):
- b1 = env.Proto(source)
- b2 = env.Nanopb(source)
- return b1 + b2
-env.AddMethod(run_protoc_and_nanopb, "NanopbProto")
-
-# Build command that runs a test program and saves the output
-def run_test_actions(source, target, env, for_signature):
- cmd = str(source[0]) # Name of binary
- if len(source) > 1:
- cmd += ' <' + str(source[1]) # Input file
- cmd += ' >' + str(target[0])
- return cmd
-
-run_test_builder = Builder(generator = run_test_actions,
- suffix = '.output')
-env.Append(BUILDERS = {'RunTest': run_test_builder})
-
-# Build command that decodes a message using protoc
-def decode_actions(source, target, env, for_signature):
- dirs = ' '.join(['-I' + env.GetBuildPath(d) for d in env['PROTOCPATH']])
- return '$PROTOC $PROTOCFLAGS %s --decode=%s %s <%s >%s' % (dirs, env['MESSAGE'], source[1], source[0], target[0])
-
-decode_builder = Builder(generator = decode_actions,
- suffix = '.decoded')
-env.Append(BUILDERS = {'Decode': decode_builder})
-
-# Build command that asserts that two files be equal
-def compare_files(target, source, env):
- data1 = open(str(source[0]), 'rb').read()
- data2 = open(str(source[1]), 'rb').read()
- if data1 == data2:
-# open(str(target[0]), 'w').write('OK')
- return 0
+# Add the builders defined in site_init.py
+add_nanopb_builders(env)
+
+# Path to the files shared by tests, and to the nanopb core.
+env.Append(CPPPATH = ["#../", "$COMMON"])
+
+# Path for finding nanopb.proto
+env.Append(PROTOCPATH = '#../generator')
+
+# Check the compilation environment, unless we are just cleaning up.
+if not env.GetOption('clean'):
+ def check_ccflags(context, flags, linkflags = ''):
+ '''Check if given CCFLAGS are supported'''
+ context.Message('Checking support for CCFLAGS="%s"... ' % flags)
+ oldflags = context.env['CCFLAGS']
+ oldlinkflags = context.env['CCFLAGS']
+ context.env.Append(CCFLAGS = flags)
+ context.env.Append(LINKFLAGS = linkflags)
+ result = context.TryCompile("int main() {return 0;}", '.c')
+ context.env.Replace(CCFLAGS = oldflags)
+ context.env.Replace(LINKFLAGS = oldlinkflags)
+ context.Result(result)
+ return result
+
+ conf = Configure(env, custom_tests = {'CheckCCFLAGS': check_ccflags})
+
+ # If the platform doesn't support C99, use our own header file instead.
+ stdbool = conf.CheckCHeader('stdbool.h')
+ stdint = conf.CheckCHeader('stdint.h')
+ stddef = conf.CheckCHeader('stddef.h')
+ string = conf.CheckCHeader('string.h')
+ stdlib = conf.CheckCHeader('stdlib.h')
+ if not stdbool or not stdint or not stddef or not string:
+ conf.env.Append(CPPDEFINES = {'PB_SYSTEM_HEADER': '\\"pb_syshdr.h\\"'})
+ conf.env.Append(CPPPATH = "#../extra")
+ conf.env.Append(SYSHDR = '\\"pb_syshdr.h\\"')
+
+ if stdbool: conf.env.Append(CPPDEFINES = {'HAVE_STDBOOL_H': 1})
+ if stdint: conf.env.Append(CPPDEFINES = {'HAVE_STDINT_H': 1})
+ if stddef: conf.env.Append(CPPDEFINES = {'HAVE_STDDEF_H': 1})
+ if string: conf.env.Append(CPPDEFINES = {'HAVE_STRING_H': 1})
+ if stdlib: conf.env.Append(CPPDEFINES = {'HAVE_STDLIB_H': 1})
+
+ # Check if we can use pkg-config to find protobuf include path
+ status, output = conf.TryAction('pkg-config protobuf --variable=includedir > $TARGET')
+ if status:
+ conf.env.Append(PROTOCPATH = output.strip())