help='Build systemc tests')
from gem5_scons import Transform, error, warning, summarize_warnings
+import gem5_scons
########################################################################
#
# compiler we're using.
main['TCMALLOC_CCFLAGS'] = []
+# Platform-specific configuration. Note again that we assume that all
+# builds under a given build root run on the same host platform.
+conf = gem5_scons.Configure(main)
+
CXX_version = readCommand([main['CXX'],'--version'], exception=False)
CXX_V = readCommand([main['CXX'],'-V'], exception=False)
main.Append(CCFLAGS=['-I/usr/local/include'])
main.Append(CXXFLAGS=['-I/usr/local/include'])
- # On Mac OS X/Darwin the default linker doesn't support the
- # option --as-needed
- if sys.platform != "darwin":
- main.Append(LINKFLAGS='-Wl,--as-needed')
+ conf.CheckLinkFlag('-Wl,--as-needed')
if GetOption('gold_linker'):
main.Append(LINKFLAGS='-fuse-ld=gold')
# interchangeably.
'-Wno-mismatched-tags',
])
- if sys.platform != "darwin" and \
- compareVersions(clang_version, "10.0") >= 0:
- main.Append(CCFLAGS=['-Wno-c99-designator'])
-
- if compareVersions(clang_version, "8.0") >= 0:
- main.Append(CCFLAGS=['-Wno-defaulted-function-deleted'])
+ conf.CheckCxxFlag('-Wno-c99-designator')
+ conf.CheckCxxFlag('-Wno-defaulted-function-deleted')
main.Append(TCMALLOC_CCFLAGS=['-fno-builtin'])
main.Append(CCFLAGS=["-Wno-uninitialized"])
-have_pkg_config = readCommand(['pkg-config', '--version'], exception='')
+have_pkg_config = main.Detect('pkg-config')
# Check for the protobuf compiler
+main['HAVE_PROTOC'] = False
+protoc_version = []
try:
- main['HAVE_PROTOC'] = True
protoc_version = readCommand([main['PROTOC'], '--version']).split()
-
- # First two words should be "libprotoc x.y.z"
- if len(protoc_version) < 2 or protoc_version[0] != 'libprotoc':
- warning('Protocol buffer compiler (protoc) not found.\n'
- 'Please install protobuf-compiler for tracing support.')
- main['HAVE_PROTOC'] = False
- else:
- # Based on the availability of the compress stream wrappers,
- # require 2.1.0
- min_protoc_version = '2.1.0'
- if compareVersions(protoc_version[1], min_protoc_version) < 0:
- warning('protoc version', min_protoc_version,
- 'or newer required.\n'
- 'Installed version:', protoc_version[1])
- main['HAVE_PROTOC'] = False
- else:
- # Attempt to determine the appropriate include path and
- # library path using pkg-config, that means we also need to
- # check for pkg-config. Note that it is possible to use
- # protobuf without the involvement of pkg-config. Later on we
- # check go a library config check and at that point the test
- # will fail if libprotobuf cannot be found.
- if have_pkg_config:
- try:
- # Attempt to establish what linking flags to add for
- # protobuf
- # using pkg-config
- main.ParseConfig(
- 'pkg-config --cflags --libs-only-L protobuf')
- except:
- warning('pkg-config could not get protobuf flags.')
except Exception as e:
warning('While checking protoc version:', str(e))
- main['HAVE_PROTOC'] = False
-
-# Check for 'timeout' from GNU coreutils. If present, regressions will
-# be run with a time limit. We require version 8.13 since we rely on
-# support for the '--foreground' option.
-if sys.platform.startswith('freebsd'):
- timeout_lines = readCommand(['gtimeout', '--version'],
- exception='').splitlines()
-else:
- timeout_lines = readCommand(['timeout', '--version'],
- exception='').splitlines()
-# Get the first line and tokenize it
-timeout_version = timeout_lines[0].split() if timeout_lines else []
-main['TIMEOUT'] = timeout_version and \
- compareVersions(timeout_version[-1], '8.13') >= 0
-
-def CheckCxxFlag(context, flag):
- context.Message("Checking for compiler %s support... " % flag)
- last_cxxflags = context.env['CXXFLAGS']
- context.env.Append(CXXFLAGS=[flag])
- ret = context.TryCompile('', '.cc')
- context.env['CXXFLAGS'] = last_cxxflags
- context.Result(ret)
- return ret
-
-def CheckLinkFlag(context, flag):
- context.Message("Checking for linker %s support... " % flag)
- last_linkflags = context.env['LINKFLAGS']
- context.env.Append(LINKFLAGS=[flag])
- ret = context.TryLink('int main(int, char *[]) { return 0; }', '.cc')
- context.env['LINKFLAGS'] = last_linkflags
- context.Result(ret)
- return ret
-
-# Add a custom Check function to test for structure members.
-def CheckMember(context, include, decl, member, include_quotes="<>"):
- context.Message("Checking for member %s in %s..." %
- (member, decl))
- text = """
-#include %(header)s
-int main(){
- %(decl)s test;
- (void)test.%(member)s;
- return 0;
-};
-""" % { "header" : include_quotes[0] + include + include_quotes[1],
- "decl" : decl,
- "member" : member,
- }
-
- ret = context.TryCompile(text, extension=".cc")
- context.Result(ret)
- return ret
-
-def CheckPythonLib(context):
- context.Message('Checking Python version... ')
- ret = context.TryRun(r"""
-#include <pybind11/embed.h>
-
-int
-main(int argc, char **argv) {
- pybind11::scoped_interpreter guard{};
- pybind11::exec(
- "import sys\n"
- "vi = sys.version_info\n"
- "sys.stdout.write('%i.%i.%i' % (vi.major, vi.minor, vi.micro));\n");
- return 0;
-}
- """, extension=".cc")
- context.Result(ret[1] if ret[0] == 1 else 0)
- if ret[0] == 0:
- return None
- else:
- return tuple(map(int, ret[1].split(".")))
-# Platform-specific configuration. Note again that we assume that all
-# builds under a given build root run on the same host platform.
-conf = Configure(main,
- conf_dir = joinpath(build_root, '.scons_config'),
- log_file = joinpath(build_root, 'scons_config.log'),
- custom_tests = {
- 'CheckMember' : CheckMember,
- 'CheckPythonLib' : CheckPythonLib,
- 'CheckCxxFlag' : CheckCxxFlag,
- 'CheckLinkFlag' : CheckLinkFlag,
- })
-
-# Check if we should compile a 64 bit binary on Mac OS X/Darwin
-try:
- import platform
- uname = platform.uname()
- if uname[0] == 'Darwin' and compareVersions(uname[2], '9.0.0') >= 0:
- if int(readCommand('sysctl -n hw.cpu64bit_capable')[0]):
- main.Append(CCFLAGS=['-arch', 'x86_64'])
- main.Append(CFLAGS=['-arch', 'x86_64'])
- main.Append(LINKFLAGS=['-arch', 'x86_64'])
- main.Append(ASFLAGS=['-arch', 'x86_64'])
-except:
- pass
-
-# Recent versions of scons substitute a "Null" object for Configure()
-# when configuration isn't necessary, e.g., if the "--help" option is
-# present. Unfortuantely this Null object always returns false,
-# breaking all our configuration checks. We replace it with our own
-# more optimistic null object that returns True instead.
-if not conf:
- def NullCheck(*args, **kwargs):
- return True
+# Based on the availability of the compress stream wrappers, require 2.1.0.
+min_protoc_version = '2.1.0'
+
+# First two words should be "libprotoc x.y.z"
+if len(protoc_version) < 2 or protoc_version[0] != 'libprotoc':
+ warning('Protocol buffer compiler (protoc) not found.\n'
+ 'Please install protobuf-compiler for tracing support.')
+elif compareVersions(protoc_version[1], min_protoc_version) < 0:
+ warning('protoc version', min_protoc_version, 'or newer required.\n'
+ 'Installed version:', protoc_version[1])
+else:
+ # Attempt to determine the appropriate include path and
+ # library path using pkg-config, that means we also need to
+ # check for pkg-config. Note that it is possible to use
+ # protobuf without the involvement of pkg-config. Later on we
+ # check go a library config check and at that point the test
+ # will fail if libprotobuf cannot be found.
+ if have_pkg_config:
+ conf.CheckPkgConfig('protobuf', '--cflags', '--libs-only-L')
+ main['HAVE_PROTOC'] = True
- class NullConf:
- def __init__(self, env):
- self.env = env
- def Finish(self):
- return self.env
- def __getattr__(self, mname):
- return NullCheck
- conf = NullConf(main)
# Cache build files in the supplied directory.
if main['M5_BUILD_CACHE']:
CacheDir(main['M5_BUILD_CACHE'])
if not GetOption('no_compress_debug'):
- if conf.CheckCxxFlag('-gz'):
- main.Append(CXXFLAGS=['-gz'])
- else:
+ if not conf.CheckCxxFlag('-gz'):
warning("Can't enable object file debug section compression")
- if conf.CheckLinkFlag('-gz'):
- main.Append(LINKFLAGS=['-gz'], SHLINKFLAGS=['-gz'])
- else:
+ if not conf.CheckLinkFlag('-gz'):
warning("Can't enable executable debug section compression")
main['USE_PYTHON'] = not GetOption('without_python')
# Check for librt.
have_posix_clock = \
- conf.CheckLibWithHeader(None, 'time.h', 'C',
- 'clock_nanosleep(0,0,NULL,NULL);') or \
- conf.CheckLibWithHeader('rt', 'time.h', 'C',
+ conf.CheckLibWithHeader([None, 'rt'], 'time.h', 'C',
'clock_nanosleep(0,0,NULL,NULL);')
+if not have_posix_clock:
+ warning("Can't find library for POSIX clocks.")
have_posix_timers = \
conf.CheckLibWithHeader([None, 'rt'], [ 'time.h', 'signal.h' ], 'C',
"on Ubuntu or RedHat).")
-# Detect back trace implementations. The last implementation in the
-# list will be used by default.
-backtrace_impls = [ "none" ]
-
-backtrace_checker = 'char temp;' + \
- ' backtrace_symbols_fd((void*)&temp, 0, 0);'
-if conf.CheckLibWithHeader(None, 'execinfo.h', 'C', backtrace_checker):
- backtrace_impls.append("glibc")
-elif conf.CheckLibWithHeader('execinfo', 'execinfo.h', 'C',
- backtrace_checker):
- # NetBSD and FreeBSD need libexecinfo.
- backtrace_impls.append("glibc")
- main.Append(LIBS=['execinfo'])
-
-if backtrace_impls[-1] == "none":
- default_backtrace_impl = "none"
+if conf.CheckLibWithHeader([None, 'execinfo'], 'execinfo.h', 'C',
+ 'char temp; backtrace_symbols_fd((void *)&temp, 0, 0);'):
+ main['BACKTRACE_IMPL'] = 'glibc'
+else:
+ main['BACKTRACE_IMPL'] = 'none'
warning("No suitable back trace implementation found.")
-if not have_posix_clock:
- warning("Can't find library for POSIX clocks.")
-
# Check for <fenv.h> (C99 FP environment control)
have_fenv = conf.CheckHeader('fenv.h', '<>')
if not have_fenv:
main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember(
'linux/perf_event.h', 'struct perf_event_attr', 'exclude_host')
-def check_hdf5():
- return \
- conf.CheckLibWithHeader('hdf5', 'hdf5.h', 'C',
- 'H5Fcreate("", 0, 0, 0);') and \
- conf.CheckLibWithHeader('hdf5_cpp', 'H5Cpp.h', 'C++',
- 'H5::H5File("", 0);')
-
-def check_hdf5_pkg(name):
- print("Checking for %s using pkg-config..." % name, end="")
- if not have_pkg_config:
- print(" pkg-config not found")
- return False
-
- try:
- main.ParseConfig('pkg-config --cflags-only-I --libs-only-L %s' % name)
- print(" yes")
- return True
- except:
- print(" no")
- return False
-
# Check if there is a pkg-config configuration for hdf5. If we find
# it, setup the environment to enable linking and header inclusion. We
# don't actually try to include any headers or link with hdf5 at this
# stage.
-if not check_hdf5_pkg('hdf5-serial'):
- check_hdf5_pkg('hdf5')
+if have_pkg_config:
+ conf.CheckPkgConfig(['hdf5-serial', 'hdf5'],
+ '--cflags-only-I', '--libs-only-L')
# Check if the HDF5 libraries can be found. This check respects the
# include path and library path provided by pkg-config. We perform
# this check even if there isn't a pkg-config configuration for hdf5
# since some installations don't use pkg-config.
-have_hdf5 = check_hdf5()
+have_hdf5 = \
+ conf.CheckLibWithHeader('hdf5', 'hdf5.h', 'C',
+ 'H5Fcreate("", 0, 0, 0);') and \
+ conf.CheckLibWithHeader('hdf5_cpp', 'H5Cpp.h', 'C++',
+ 'H5::H5File("", 0);')
if not have_hdf5:
- print("Warning: Couldn't find any HDF5 C++ libraries. Disabling")
- print(" HDF5 support.")
+ warning("Couldn't find any HDF5 C++ libraries. Disabling HDF5 support.")
######################################################################
#
BoolVariable('BUILD_GPU', 'Build the compute-GPU model', False),
EnumVariable('PROTOCOL', 'Coherence protocol for Ruby', 'None',
all_protocols),
- EnumVariable('BACKTRACE_IMPL', 'Post-mortem dump implementation',
- backtrace_impls[-1], backtrace_impls),
('NUMBER_BITS_PER_SET', 'Max elements in set (default 64)',
64),
BoolVariable('USE_HDF5', 'Enable the HDF5 support', have_hdf5),