From 0bbcb7b367998063637ee35c5d13716492cbf6a3 Mon Sep 17 00:00:00 2001 From: Petteri Aimonen Date: Tue, 10 Sep 2013 20:54:29 +0300 Subject: [PATCH] Compiler options for GCC, clang and tcc --- tests/SConstruct | 67 +++++++++++++++++++++++++++++++++++++++++++------ tests/common/SConscript | 7 ++++-- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/tests/SConstruct b/tests/SConstruct index 8bbb31d1..92cb0c62 100644 --- a/tests/SConstruct +++ b/tests/SConstruct @@ -1,5 +1,26 @@ +Help(''' +Type 'scons' to build and run all the available test cases. +It will automatically detect your platform and C compiler and +build appropriately. + +You can modify the behavious using following options: +CC Name of C compiler +CXX Name of C++ compiler +CCFLAGS Flags to pass to the C compiler +CXXFLAGS Flags to pass to the C++ compiler + +For example, for a clang build, use: +scons CC=clang CXX=clang++ +''') + import os -env = Environment(ENV = {'PATH': os.environ['PATH']}) +env = Environment(ENV = os.environ) + +# Allow overriding the compiler with scons CC=??? +if 'CC' in ARGUMENTS: env.Replace(CC = ARGUMENTS['CC']) +if 'CXX' in ARGUMENTS: env.Replace(CXX = ARGUMENTS['CXX']) +if 'CFLAGS' in ARGUMENTS: env.Append(CCFLAGS = ARGUMENTS['CFLAGS']) +if 'CXXFLAGS' in ARGUMENTS: env.Append(CCFLAGS = ARGUMENTS['CXXFLAGS']) # Add the builders defined in site_init.py add_nanopb_builders(env) @@ -34,22 +55,54 @@ if not env.GetOption('clean'): conf.env.Append(PROTOCPATH = output.strip()) else: conf.env.Append(PROTOCPATH = '/usr/include') - + + # Check if libmudflap is available (only with GCC) + if 'gcc' in env['CC']: + if conf.CheckLib('mudflap'): + conf.env.Append(CCFLAGS = '-fmudflap') + conf.env.Append(LINKFLAGS = '-lmudflap -fmudflap') + # End the config stuff env = conf.Finish() # Initialize the CCFLAGS according to the compiler -if 'cl' in env['CC']: +if 'gcc' in env['CC']: + # GNU Compiler Collection + + # Debug info, warnings as errors + env.Append(CFLAGS = '-ansi -g -O0 -Wall -Werror --coverage -fstack-protector-all') + env.Append(LINKFLAGS = '--coverage') + + # More strict checks on the nanopb core + env.Append(CORECFLAGS = '-pedantic -Wextra -Wcast-qual -Wlogical-op -Wconversion') +elif 'clang' in env['CC']: + # CLang + env.Append(CFLAGS = '-ansi -g -O0 -Wall -Werror') + env.Append(CORECFLAGS = '-pedantic -Wextra -Wcast-qual -Wconversion') +elif 'cl' in env['CC']: # Microsoft Visual C++ # Debug info on, warning level 2 for tests, warnings as errors - env.Append(CCFLAGS = '/Zi /W2 /WX') + env.Append(CFLAGS = '/Zi /W2 /WX') env.Append(LINKFLAGS = '/DEBUG') - # PB_RETURN_ERROR triggers C4127 because of while(0) - env.Append(CCFLAGS = '/wd4127') - + # More strict checks on the nanopb core + env.Append(CORECFLAGS = '/W4 /Za') + # PB_RETURN_ERROR triggers C4127 because of while(0) + env.Append(CFLAGS = '/wd4127') +elif 'tcc' in env['CC']: + # Tiny C Compiler + env.Append(CFLAGS = '-Wall -Werror -g') + +env.SetDefault(CORECFLAGS = '') + +if 'clang++' in env['CXX']: + env.Append(CXXFLAGS = '-g -O0 -Wall -Werror -Wextra -Wno-missing-field-initializers') +elif 'g++' in env['CXX']: + env.Append(CXXFLAGS = '-g -O0 -Wall -Werror -Wextra -Wno-missing-field-initializers') +elif 'cl' in env['CXX']: + env.Append(CXXFLAGS = '/Zi /W2 /WX') # Now include the SConscript files from all subdirectories SConscript(Glob('*/SConscript'), exports = 'env') diff --git a/tests/common/SConscript b/tests/common/SConscript index ef3cdcaa..8130c85a 100644 --- a/tests/common/SConscript +++ b/tests/common/SConscript @@ -9,6 +9,9 @@ env.NanopbProto("unittestproto") env.NanopbProto("person") # Binaries of the pb_decode.c and pb_encode.c -env.Object("pb_decode.o", "#../pb_decode.c") -env.Object("pb_encode.o", "#../pb_encode.c") +# These are built using more strict warning flags. +strict = env.Clone() +strict.Append(CFLAGS = strict['CORECFLAGS']) +strict.Object("pb_decode.o", "#../pb_decode.c") +strict.Object("pb_encode.o", "#../pb_encode.c") -- 2.16.6