Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1 | # -*- mode:python -*- |
| 2 | |
Ciro Santilli | ae7dd92 | 2020-01-15 16:11:30 +0000 | [diff] [blame] | 3 | # Copyright (c) 2013, 2015-2020 ARM Limited |
Andreas Hansson | 3ede4dc | 2013-07-18 08:29:28 -0400 | [diff] [blame] | 4 | # All rights reserved. |
| 5 | # |
| 6 | # The license below extends only to copyright in the software and shall |
| 7 | # not be construed as granting a license to any other intellectual |
| 8 | # property including but not limited to intellectual property relating |
| 9 | # to a hardware implementation of the functionality of the software |
| 10 | # licensed hereunder. You may use the software subject to the license |
| 11 | # terms below provided that you ensure that this notice is replicated |
| 12 | # unmodified and in its entirety in all distributions of the software, |
| 13 | # modified or unmodified, in source code or in binary form. |
| 14 | # |
Steve Reinhardt | d650f41 | 2011-01-07 21:50:13 -0800 | [diff] [blame] | 15 | # Copyright (c) 2011 Advanced Micro Devices, Inc. |
Nathan Binkert | 312fbb1 | 2009-02-11 16:58:51 -0800 | [diff] [blame] | 16 | # Copyright (c) 2009 The Hewlett-Packard Development Company |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 17 | # Copyright (c) 2004-2005 The Regents of The University of Michigan |
| 18 | # All rights reserved. |
| 19 | # |
| 20 | # Redistribution and use in source and binary forms, with or without |
| 21 | # modification, are permitted provided that the following conditions are |
| 22 | # met: redistributions of source code must retain the above copyright |
| 23 | # notice, this list of conditions and the following disclaimer; |
| 24 | # redistributions in binary form must reproduce the above copyright |
| 25 | # notice, this list of conditions and the following disclaimer in the |
| 26 | # documentation and/or other materials provided with the distribution; |
| 27 | # neither the name of the copyright holders nor the names of its |
| 28 | # contributors may be used to endorse or promote products derived from |
| 29 | # this software without specific prior written permission. |
| 30 | # |
| 31 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 32 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 33 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 34 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 35 | # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 36 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 37 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 38 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 39 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 40 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 41 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 42 | |
| 43 | ################################################### |
| 44 | # |
| 45 | # SCons top-level build description (SConstruct) file. |
| 46 | # |
Steve Reinhardt | f71a5c5 | 2012-03-02 13:53:52 -0800 | [diff] [blame] | 47 | # While in this directory ('gem5'), just type 'scons' to build the default |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 48 | # configuration (see below), or type 'scons build/<CONFIG>/<binary>' |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 49 | # to build some other configuration (e.g., 'build/X86/gem5.opt' for |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 50 | # the optimized full-system version). |
| 51 | # |
Steve Reinhardt | f71a5c5 | 2012-03-02 13:53:52 -0800 | [diff] [blame] | 52 | # You can build gem5 in a different directory as long as there is a |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 53 | # 'build/<CONFIG>' somewhere along the target path. The build system |
Steve Reinhardt | 7efd0ea | 2006-06-17 09:26:08 -0400 | [diff] [blame] | 54 | # expects that all configs under the same build directory are being |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 55 | # built for the same host system. |
| 56 | # |
| 57 | # Examples: |
Steve Reinhardt | 7efd0ea | 2006-06-17 09:26:08 -0400 | [diff] [blame] | 58 | # |
| 59 | # The following two commands are equivalent. The '-u' option tells |
| 60 | # scons to search up the directory tree for this SConstruct file. |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 61 | # % cd <path-to-src>/gem5 ; scons build/X86/gem5.debug |
| 62 | # % cd <path-to-src>/gem5/build/X86; scons -u gem5.debug |
Steve Reinhardt | 7efd0ea | 2006-06-17 09:26:08 -0400 | [diff] [blame] | 63 | # |
| 64 | # The following two commands are equivalent and demonstrate building |
| 65 | # in a directory outside of the source tree. The '-C' option tells |
| 66 | # scons to chdir to the specified directory to find this SConstruct |
| 67 | # file. |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 68 | # % cd <path-to-src>/gem5 ; scons /local/foo/build/X86/gem5.debug |
| 69 | # % cd /local/foo/build/X86; scons -C <path-to-src>/gem5 gem5.debug |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 70 | # |
| 71 | # You can use 'scons -H' to print scons options. If you're in this |
Steve Reinhardt | f71a5c5 | 2012-03-02 13:53:52 -0800 | [diff] [blame] | 72 | # 'gem5' directory (or use -u or -C to tell scons where to find this |
| 73 | # file), you can use 'scons -h' to print all the gem5-specific build |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 74 | # options as well. |
| 75 | # |
| 76 | ################################################### |
| 77 | |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 78 | from __future__ import print_function |
| 79 | |
Nathan Binkert | 9a8cb7d | 2009-09-22 15:24:16 -0700 | [diff] [blame] | 80 | # Global Python includes |
Gabe Black | 1c59559 | 2020-03-26 04:48:53 -0700 | [diff] [blame] | 81 | import atexit |
Curtis Dunham | fe27f93 | 2014-05-09 18:58:47 -0400 | [diff] [blame] | 82 | import itertools |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 83 | import os |
Ali Saidi | d9d79ce | 2008-04-07 23:40:23 -0400 | [diff] [blame] | 84 | import re |
Andreas Sandberg | 7277def | 2016-03-30 15:29:42 +0100 | [diff] [blame] | 85 | import shutil |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 86 | import subprocess |
| 87 | import sys |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 88 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 89 | from os import mkdir, environ |
| 90 | from os.path import abspath, basename, dirname, expanduser, normpath |
| 91 | from os.path import exists, isdir, isfile |
| 92 | from os.path import join as joinpath, split as splitpath |
Andrea Mondelli | ad9a233 | 2019-01-10 10:33:13 -0500 | [diff] [blame] | 93 | from re import match |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 94 | |
Nathan Binkert | 9a8cb7d | 2009-09-22 15:24:16 -0700 | [diff] [blame] | 95 | # SCons includes |
Steve Reinhardt | 785eb13 | 2007-11-16 20:10:33 -0800 | [diff] [blame] | 96 | import SCons |
Nathan Binkert | 312fbb1 | 2009-02-11 16:58:51 -0800 | [diff] [blame] | 97 | import SCons.Node |
Gabe Black | 91195ae | 2019-03-12 05:00:41 -0700 | [diff] [blame] | 98 | import SCons.Node.FS |
Steve Reinhardt | 785eb13 | 2007-11-16 20:10:33 -0800 | [diff] [blame] | 99 | |
Jason Lowe-Power | 0bc5d77 | 2020-05-06 17:38:41 -0700 | [diff] [blame] | 100 | from m5.util import compareVersions, readCommand, readCommandWithReturn |
Ali Saidi | d9d79ce | 2008-04-07 23:40:23 -0400 | [diff] [blame] | 101 | |
Gabe Black | 08ab457 | 2020-08-03 21:38:55 -0700 | [diff] [blame] | 102 | AddOption('--colors', dest='use_colors', action='store_true', |
| 103 | help="Add color to abbreviated scons output") |
| 104 | AddOption('--no-colors', dest='use_colors', action='store_false', |
| 105 | help="Don't add color to abbreviated scons output") |
| 106 | AddOption('--with-cxx-config', action='store_true', |
| 107 | help="Build with support for C++-based configuration") |
| 108 | AddOption('--default', |
| 109 | help='Override which build_opts file to use for defaults') |
| 110 | AddOption('--ignore-style', action='store_true', |
| 111 | help='Disable style checking hooks') |
| 112 | AddOption('--gold-linker', action='store_true', help='Use the gold linker') |
| 113 | AddOption('--no-lto', action='store_true', |
| 114 | help='Disable Link-Time Optimization for fast') |
| 115 | AddOption('--force-lto', action='store_true', |
| 116 | help='Use Link-Time Optimization instead of partial linking' + |
| 117 | ' when the compiler doesn\'t support using them together.') |
| 118 | AddOption('--verbose', action='store_true', |
| 119 | help='Print full tool command lines') |
| 120 | AddOption('--without-python', action='store_true', |
| 121 | help='Build without Python configuration support') |
| 122 | AddOption('--without-tcmalloc', action='store_true', |
| 123 | help='Disable linking against tcmalloc') |
| 124 | AddOption('--with-ubsan', action='store_true', |
| 125 | help='Build with Undefined Behavior Sanitizer if available') |
| 126 | AddOption('--with-asan', action='store_true', |
| 127 | help='Build with Address Sanitizer if available') |
| 128 | AddOption('--with-systemc-tests', action='store_true', |
| 129 | help='Build systemc tests') |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 130 | |
Gabe Black | 1c59559 | 2020-03-26 04:48:53 -0700 | [diff] [blame] | 131 | from gem5_scons import Transform, error, warning, summarize_warnings |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 132 | |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 133 | if GetOption('no_lto') and GetOption('force_lto'): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 134 | error('--no-lto and --force-lto are mutually exclusive') |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 135 | |
Nathan Binkert | 312fbb1 | 2009-02-11 16:58:51 -0800 | [diff] [blame] | 136 | ######################################################################## |
| 137 | # |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 138 | # Set up the main build environment. |
Nathan Binkert | 312fbb1 | 2009-02-11 16:58:51 -0800 | [diff] [blame] | 139 | # |
| 140 | ######################################################################## |
Stan Czerniawski | c255374 | 2013-10-17 10:20:45 -0500 | [diff] [blame] | 141 | |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 142 | main = Environment(tools=['default', 'git']) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 143 | |
Gabe Black | 49cf9fd | 2017-11-08 19:59:04 -0800 | [diff] [blame] | 144 | from gem5_scons.util import get_termcap |
| 145 | termcap = get_termcap() |
| 146 | |
Andreas Hansson | 166afc4 | 2012-09-21 10:11:22 -0400 | [diff] [blame] | 147 | main_dict_keys = main.Dictionary().keys() |
| 148 | |
| 149 | # Check that we have a C/C++ compiler |
| 150 | if not ('CC' in main_dict_keys and 'CXX' in main_dict_keys): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 151 | error("No C++ compiler installed (package g++ on Ubuntu and RedHat)") |
Andreas Hansson | 166afc4 | 2012-09-21 10:11:22 -0400 | [diff] [blame] | 152 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 153 | ################################################### |
| 154 | # |
| 155 | # Figure out which configurations to set up based on the path(s) of |
| 156 | # the target(s). |
| 157 | # |
| 158 | ################################################### |
| 159 | |
| 160 | # Find default configuration & binary. |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 161 | Default(environ.get('M5_DEFAULT_BINARY', 'build/ARM/gem5.debug')) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 162 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 163 | # helper function: find last occurrence of element in list |
| 164 | def rfind(l, elt, offs = -1): |
| 165 | for i in range(len(l)+offs, 0, -1): |
| 166 | if l[i] == elt: |
| 167 | return i |
Gabe Black | a39c8db | 2019-12-02 17:52:44 -0800 | [diff] [blame] | 168 | raise ValueError("element not found") |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 169 | |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 170 | # Take a list of paths (or SCons Nodes) and return a list with all |
| 171 | # paths made absolute and ~-expanded. Paths will be interpreted |
| 172 | # relative to the launch directory unless a different root is provided |
| 173 | def makePathListAbsolute(path_list, root=GetLaunchDir()): |
| 174 | return [abspath(joinpath(root, expanduser(str(p)))) |
| 175 | for p in path_list] |
| 176 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 177 | # Each target must have 'build' in the interior of the path; the |
| 178 | # directory below this will determine the build parameters. For |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 179 | # example, for target 'foo/bar/build/X86/arch/x86/blah.do' we |
| 180 | # recognize that X86 specifies the configuration because it |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 181 | # follow 'build' in the build path. |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 182 | |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 183 | # The funky assignment to "[:]" is needed to replace the list contents |
| 184 | # in place rather than reassign the symbol to a new list, which |
| 185 | # doesn't work (obviously!). |
| 186 | BUILD_TARGETS[:] = makePathListAbsolute(BUILD_TARGETS) |
Steve Reinhardt | 51e3688 | 2006-12-04 09:09:36 -0800 | [diff] [blame] | 187 | |
Steve Reinhardt | a7c95f7 | 2006-05-22 21:51:59 -0400 | [diff] [blame] | 188 | # Generate a list of the unique build roots and configs that the |
| 189 | # collected targets reference. |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 190 | variant_paths = [] |
Steve Reinhardt | 20051d4 | 2006-05-22 22:37:56 -0400 | [diff] [blame] | 191 | build_root = None |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 192 | for t in BUILD_TARGETS: |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 193 | path_dirs = t.split('/') |
| 194 | try: |
| 195 | build_top = rfind(path_dirs, 'build', -2) |
| 196 | except: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 197 | error("No non-leaf 'build' dir found on target path.", t) |
Steve Reinhardt | 6ae75ac | 2006-12-04 08:55:06 -0800 | [diff] [blame] | 198 | this_build_root = joinpath('/',*path_dirs[:build_top+1]) |
Steve Reinhardt | 20051d4 | 2006-05-22 22:37:56 -0400 | [diff] [blame] | 199 | if not build_root: |
| 200 | build_root = this_build_root |
| 201 | else: |
| 202 | if this_build_root != build_root: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 203 | error("build targets not under same build root\n" |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 204 | " %s\n %s" % (build_root, this_build_root)) |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 205 | variant_path = joinpath('/',*path_dirs[:build_top+2]) |
| 206 | if variant_path not in variant_paths: |
| 207 | variant_paths.append(variant_path) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 208 | |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 209 | # Make sure build_root exists (might not if this is the first build there) |
| 210 | if not isdir(build_root): |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 211 | mkdir(build_root) |
Ali Saidi | d4767f4 | 2010-11-15 14:04:04 -0600 | [diff] [blame] | 212 | main['BUILDROOT'] = build_root |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 213 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 214 | Export('main') |
Ali Saidi | 0193476 | 2007-05-30 17:08:12 -0400 | [diff] [blame] | 215 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 216 | main.SConsignFile(joinpath(build_root, "sconsign")) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 217 | |
Steve Reinhardt | 29e34a7 | 2006-06-09 23:01:31 -0400 | [diff] [blame] | 218 | # Default duplicate option is to use hard links, but this messes up |
| 219 | # when you use emacs to edit a file in the target dir, as emacs moves |
| 220 | # file to file~ then copies to file, breaking the link. Symbolic |
| 221 | # (soft) links work better. |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 222 | main.SetOption('duplicate', 'soft-copy') |
Steve Reinhardt | 29e34a7 | 2006-06-09 23:01:31 -0400 | [diff] [blame] | 223 | |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 224 | # |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 225 | # Set up global sticky variables... these are common to an entire build |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 226 | # tree (not specific to a particular build like X86) |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 227 | # |
| 228 | |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 229 | global_vars_file = joinpath(build_root, 'variables.global') |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 230 | |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 231 | global_vars = Variables(global_vars_file, args=ARGUMENTS) |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 232 | |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 233 | global_vars.AddVariables( |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 234 | ('CC', 'C compiler', environ.get('CC', main['CC'])), |
| 235 | ('CXX', 'C++ compiler', environ.get('CXX', main['CXX'])), |
Ciro Santilli | ec50225 | 2019-05-21 13:19:24 +0100 | [diff] [blame] | 236 | ('CCFLAGS_EXTRA', 'Extra C and C++ compiler flags', ''), |
| 237 | ('LDFLAGS_EXTRA', 'Extra linker flags', ''), |
Giacomo Travaglini | a1b6471 | 2020-06-04 12:45:52 +0100 | [diff] [blame] | 238 | ('MARSHAL_CCFLAGS_EXTRA', 'Extra C and C++ marshal compiler flags', ''), |
| 239 | ('MARSHAL_LDFLAGS_EXTRA', 'Extra marshal linker flags', ''), |
Andreas Sandberg | a3c81f9 | 2019-01-25 11:14:29 +0000 | [diff] [blame] | 240 | ('PYTHON_CONFIG', 'Python config binary to use', |
Andreas Sandberg | 4af8481 | 2020-10-23 10:49:43 +0100 | [diff] [blame] | 241 | [ 'python3-config', 'python-config'] |
Bobby R. Bruce | 5eb9cdd | 2020-09-28 11:23:38 -0700 | [diff] [blame] | 242 | ), |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 243 | ('PROTOC', 'protoc tool', environ.get('PROTOC', 'protoc')), |
Ali Saidi | bee4d45 | 2008-04-07 23:40:24 -0400 | [diff] [blame] | 244 | ('BATCH', 'Use batch pool for build and tests', False), |
| 245 | ('BATCH_CMD', 'Batch pool submission command name', 'qdo'), |
Ali Saidi | 5fcf442 | 2010-11-08 13:58:24 -0600 | [diff] [blame] | 246 | ('M5_BUILD_CACHE', 'Cache built objects in this directory', False), |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 247 | ('EXTRAS', 'Add extra directories to the compilation', '') |
Nathan Binkert | cf6b4ef | 2009-05-11 10:38:46 -0700 | [diff] [blame] | 248 | ) |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 249 | |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 250 | # Update main environment with values from ARGUMENTS & global_vars_file |
| 251 | global_vars.Update(main) |
Gabe Black | 08ab457 | 2020-08-03 21:38:55 -0700 | [diff] [blame] | 252 | Help(''' |
| 253 | Global build variables: |
| 254 | {help} |
| 255 | '''.format(help=global_vars.GenerateHelpText(main)), append=True) |
Gabe Black | de904a6 | 2010-01-17 02:22:30 -0800 | [diff] [blame] | 256 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 257 | # Save sticky variable settings back to current variables file |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 258 | global_vars.Save(global_vars_file, main) |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 259 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 260 | # Parse EXTRAS variable to build list of all directories where we're |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 261 | # look for sources etc. This list is exported as extras_dir_list. |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 262 | base_dir = Dir('#src').abspath |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 263 | if main['EXTRAS']: |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 264 | extras_dir_list = makePathListAbsolute(main['EXTRAS'].split(':')) |
Nathan Binkert | 4d64d76 | 2008-11-10 11:51:18 -0800 | [diff] [blame] | 265 | else: |
| 266 | extras_dir_list = [] |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 267 | |
Nathan Binkert | 4d64d76 | 2008-11-10 11:51:18 -0800 | [diff] [blame] | 268 | Export('base_dir') |
| 269 | Export('extras_dir_list') |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 270 | |
Nathan Binkert | a102f84 | 2009-03-17 12:49:03 -0700 | [diff] [blame] | 271 | # the ext directory should be on the #includes path |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 272 | main.Append(CPPPATH=[Dir('ext')]) |
Nathan Binkert | a102f84 | 2009-03-17 12:49:03 -0700 | [diff] [blame] | 273 | |
Andreas Sandberg | f2d0adf | 2017-07-27 15:08:05 +0100 | [diff] [blame] | 274 | # Add shared top-level headers |
| 275 | main.Prepend(CPPPATH=Dir('include')) |
| 276 | |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 277 | if GetOption('verbose'): |
Ali Saidi | d4767f4 | 2010-11-15 14:04:04 -0600 | [diff] [blame] | 278 | def MakeAction(action, string, *args, **kwargs): |
| 279 | return Action(action, *args, **kwargs) |
| 280 | else: |
| 281 | MakeAction = Action |
Steve Reinhardt | d650f41 | 2011-01-07 21:50:13 -0800 | [diff] [blame] | 282 | main['CCCOMSTR'] = Transform("CC") |
| 283 | main['CXXCOMSTR'] = Transform("CXX") |
| 284 | main['ASCOMSTR'] = Transform("AS") |
Steve Reinhardt | d650f41 | 2011-01-07 21:50:13 -0800 | [diff] [blame] | 285 | main['ARCOMSTR'] = Transform("AR", 0) |
| 286 | main['LINKCOMSTR'] = Transform("LINK", 0) |
Gabe Black | 334b1e5 | 2017-04-28 03:49:24 -0700 | [diff] [blame] | 287 | main['SHLINKCOMSTR'] = Transform("SHLINK", 0) |
Steve Reinhardt | d650f41 | 2011-01-07 21:50:13 -0800 | [diff] [blame] | 288 | main['RANLIBCOMSTR'] = Transform("RANLIB", 0) |
| 289 | main['M4COMSTR'] = Transform("M4") |
| 290 | main['SHCCCOMSTR'] = Transform("SHCC") |
| 291 | main['SHCXXCOMSTR'] = Transform("SHCXX") |
Ali Saidi | d4767f4 | 2010-11-15 14:04:04 -0600 | [diff] [blame] | 292 | Export('MakeAction') |
| 293 | |
Andreas Hansson | d1f3a3b | 2012-09-14 12:13:22 -0400 | [diff] [blame] | 294 | # Initialize the Link-Time Optimization (LTO) flags |
| 295 | main['LTO_CCFLAGS'] = [] |
| 296 | main['LTO_LDFLAGS'] = [] |
| 297 | |
Andreas Sandberg | 468ad10 | 2013-03-18 10:57:26 +0100 | [diff] [blame] | 298 | # According to the readme, tcmalloc works best if the compiler doesn't |
| 299 | # assume that we're using the builtin malloc and friends. These flags |
| 300 | # are compiler-specific, so we need to set them after we detect which |
| 301 | # compiler we're using. |
| 302 | main['TCMALLOC_CCFLAGS'] = [] |
| 303 | |
Nathan Binkert | 9a8cb7d | 2009-09-22 15:24:16 -0700 | [diff] [blame] | 304 | CXX_version = readCommand([main['CXX'],'--version'], exception=False) |
| 305 | CXX_V = readCommand([main['CXX'],'-V'], exception=False) |
Nathan Binkert | 312fbb1 | 2009-02-11 16:58:51 -0800 | [diff] [blame] | 306 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 307 | main['GCC'] = CXX_version and CXX_version.find('g++') >= 0 |
Andreas Hansson | b6aa6d5 | 2012-04-14 05:43:31 -0400 | [diff] [blame] | 308 | main['CLANG'] = CXX_version and CXX_version.find('clang') >= 0 |
Andreas Hansson | 2213023 | 2013-01-07 13:05:39 -0500 | [diff] [blame] | 309 | if main['GCC'] + main['CLANG'] > 1: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 310 | error('Two compilers enabled at once?') |
Ali Saidi | 63fdabf | 2007-01-26 18:48:51 -0500 | [diff] [blame] | 311 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 312 | # Set up default C++ compiler flags |
Andreas Hansson | 08a5fd3 | 2013-02-19 05:56:07 -0500 | [diff] [blame] | 313 | if main['GCC'] or main['CLANG']: |
| 314 | # As gcc and clang share many flags, do the common parts here |
| 315 | main.Append(CCFLAGS=['-pipe']) |
| 316 | main.Append(CCFLAGS=['-fno-strict-aliasing']) |
Andreas Hansson | 12eb034 | 2016-01-11 05:52:20 -0500 | [diff] [blame] | 317 | # Enable -Wall and -Wextra and then disable the few warnings that |
| 318 | # we consistently violate |
| 319 | main.Append(CCFLAGS=['-Wall', '-Wundef', '-Wextra', |
| 320 | '-Wno-sign-compare', '-Wno-unused-parameter']) |
Gabe Black | dcffee0 | 2020-09-17 22:33:37 -0700 | [diff] [blame] | 321 | # We always compile using C++14 |
| 322 | main.Append(CXXFLAGS=['-std=c++14']) |
Bjoern A. Zeeb | e07f0c5 | 2017-02-09 19:00:00 -0500 | [diff] [blame] | 323 | if sys.platform.startswith('freebsd'): |
| 324 | main.Append(CCFLAGS=['-I/usr/local/include']) |
| 325 | main.Append(CXXFLAGS=['-I/usr/local/include']) |
Gabe Black | 4576541 | 2017-04-28 03:57:09 -0700 | [diff] [blame] | 326 | |
Nikos Nikoleris | 25620a7 | 2020-04-23 20:07:51 +0100 | [diff] [blame] | 327 | # On Mac OS X/Darwin the default linker doesn't support the |
| 328 | # option --as-needed |
| 329 | if sys.platform != "darwin": |
| 330 | main.Append(LINKFLAGS='-Wl,--as-needed') |
Gabe Black | 4576541 | 2017-04-28 03:57:09 -0700 | [diff] [blame] | 331 | main['FILTER_PSHLINKFLAGS'] = lambda x: str(x).replace(' -shared', '') |
| 332 | main['PSHLINKFLAGS'] = main.subst('${FILTER_PSHLINKFLAGS(SHLINKFLAGS)}') |
Ciro Santilli | fafe4e8 | 2018-11-07 00:00:00 +0000 | [diff] [blame] | 333 | if GetOption('gold_linker'): |
| 334 | main.Append(LINKFLAGS='-fuse-ld=gold') |
Ciro Santilli | ae7dd92 | 2020-01-15 16:11:30 +0000 | [diff] [blame] | 335 | main['PLINKFLAGS'] = main.get('LINKFLAGS') |
Gabe Black | 32fd890 | 2017-05-03 00:37:19 -0700 | [diff] [blame] | 336 | shared_partial_flags = ['-r', '-nostdlib'] |
Gabe Black | 4576541 | 2017-04-28 03:57:09 -0700 | [diff] [blame] | 337 | main.Append(PSHLINKFLAGS=shared_partial_flags) |
| 338 | main.Append(PLINKFLAGS=shared_partial_flags) |
Gabe Black | 08d6088 | 2017-11-20 18:26:29 -0800 | [diff] [blame] | 339 | |
Bobby R. Bruce | c0ae17c | 2020-09-30 20:53:14 -0700 | [diff] [blame] | 340 | # Treat warnings as errors but white list some warnings that we |
| 341 | # want to allow (e.g., deprecation warnings). |
| 342 | main.Append(CCFLAGS=['-Werror', |
| 343 | '-Wno-error=deprecated-declarations', |
| 344 | '-Wno-error=deprecated', |
| 345 | ]) |
Andreas Hansson | 08a5fd3 | 2013-02-19 05:56:07 -0500 | [diff] [blame] | 346 | else: |
Gabe Black | 38e4603 | 2020-02-07 17:27:02 -0800 | [diff] [blame] | 347 | error('\n'.join(( |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 348 | "Don't know what compiler options to use for your compiler.", |
| 349 | "compiler: " + main['CXX'], |
| 350 | "version: " + CXX_version.replace('\n', '<nl>') if |
| 351 | CXX_version else 'COMMAND NOT FOUND!', |
| 352 | "If you're trying to use a compiler other than GCC", |
| 353 | "or clang, there appears to be something wrong with your", |
| 354 | "environment.", |
| 355 | "", |
| 356 | "If you are trying to use a compiler other than those listed", |
| 357 | "above you will need to ease fix SConstruct and ", |
Gabe Black | 38e4603 | 2020-02-07 17:27:02 -0800 | [diff] [blame] | 358 | "src/SConscript to support that compiler."))) |
Andreas Hansson | 08a5fd3 | 2013-02-19 05:56:07 -0500 | [diff] [blame] | 359 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 360 | if main['GCC']: |
Andreas Hansson | 406891c | 2013-01-07 13:05:39 -0500 | [diff] [blame] | 361 | gcc_version = readCommand([main['CXX'], '-dumpversion'], exception=False) |
Bobby R. Bruce | a1a2edd | 2020-08-28 18:28:23 -0700 | [diff] [blame] | 362 | if compareVersions(gcc_version, "5") < 0: |
| 363 | error('gcc version 5 or newer required.\n' |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 364 | 'Installed version:', gcc_version) |
Andreas Hansson | 406891c | 2013-01-07 13:05:39 -0500 | [diff] [blame] | 365 | Exit(1) |
| 366 | |
| 367 | main['GCC_VERSION'] = gcc_version |
Andreas Hansson | 406891c | 2013-01-07 13:05:39 -0500 | [diff] [blame] | 368 | |
Bobby R. Bruce | a1a2edd | 2020-08-28 18:28:23 -0700 | [diff] [blame] | 369 | # Incremental linking with LTO is currently broken in gcc versions |
| 370 | # 4.9 and above. A version where everything works completely hasn't |
| 371 | # yet been identified. |
| 372 | # |
| 373 | # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67548 |
| 374 | main['BROKEN_INCREMENTAL_LTO'] = True |
| 375 | |
Bobby R. Bruce | 6a54bb7 | 2020-05-18 10:09:52 -0700 | [diff] [blame] | 376 | if compareVersions(gcc_version, '6.0') >= 0: |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 377 | # gcc versions 6.0 and greater accept an -flinker-output flag which |
| 378 | # selects what type of output the linker should generate. This is |
| 379 | # necessary for incremental lto to work, but is also broken in |
Bobby R. Bruce | 6a54bb7 | 2020-05-18 10:09:52 -0700 | [diff] [blame] | 380 | # current versions of gcc. It may not be necessary in future |
| 381 | # versions. We add it here since it might be, and as a reminder that |
| 382 | # it exists. It's excluded if lto is being forced. |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 383 | # |
| 384 | # https://gcc.gnu.org/gcc-6/changes.html |
| 385 | # https://gcc.gnu.org/ml/gcc-patches/2015-11/msg03161.html |
| 386 | # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69866 |
Bobby R. Bruce | 6a54bb7 | 2020-05-18 10:09:52 -0700 | [diff] [blame] | 387 | if not GetOption('force_lto'): |
| 388 | main.Append(PSHLINKFLAGS='-flinker-output=rel') |
| 389 | main.Append(PLINKFLAGS='-flinker-output=rel') |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 390 | |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 391 | disable_lto = GetOption('no_lto') |
| 392 | if not disable_lto and main.get('BROKEN_INCREMENTAL_LTO', False) and \ |
| 393 | not GetOption('force_lto'): |
Gabe Black | ec236a5 | 2020-03-26 03:47:38 -0700 | [diff] [blame] | 394 | warning('Your compiler doesn\'t support incremental linking and lto ' |
| 395 | 'at the same time, so lto is being disabled. To force lto on ' |
| 396 | 'anyway, use the --force-lto option. That will disable ' |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 397 | 'partial linking.') |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 398 | disable_lto = True |
| 399 | |
Andreas Hansson | fdb965f | 2014-06-10 17:44:39 -0400 | [diff] [blame] | 400 | # Add the appropriate Link-Time Optimization (LTO) flags |
| 401 | # unless LTO is explicitly turned off. Note that these flags |
| 402 | # are only used by the fast target. |
Gabe Black | 670436b | 2017-06-05 22:23:18 -0700 | [diff] [blame] | 403 | if not disable_lto: |
Andreas Hansson | fdb965f | 2014-06-10 17:44:39 -0400 | [diff] [blame] | 404 | # Pass the LTO flag when compiling to produce GIMPLE |
| 405 | # output, we merely create the flags here and only append |
Andreas Hansson | deb2200 | 2014-09-27 09:08:34 -0400 | [diff] [blame] | 406 | # them later |
Andreas Hansson | fdb965f | 2014-06-10 17:44:39 -0400 | [diff] [blame] | 407 | main['LTO_CCFLAGS'] = ['-flto=%d' % GetOption('num_jobs')] |
Andreas Hansson | d1f3a3b | 2012-09-14 12:13:22 -0400 | [diff] [blame] | 408 | |
Andreas Hansson | fdb965f | 2014-06-10 17:44:39 -0400 | [diff] [blame] | 409 | # Use the same amount of jobs for LTO as we are running |
Andreas Hansson | deb2200 | 2014-09-27 09:08:34 -0400 | [diff] [blame] | 410 | # scons with |
| 411 | main['LTO_LDFLAGS'] = ['-flto=%d' % GetOption('num_jobs')] |
Andreas Hansson | d1f3a3b | 2012-09-14 12:13:22 -0400 | [diff] [blame] | 412 | |
Andreas Sandberg | 468ad10 | 2013-03-18 10:57:26 +0100 | [diff] [blame] | 413 | main.Append(TCMALLOC_CCFLAGS=['-fno-builtin-malloc', '-fno-builtin-calloc', |
| 414 | '-fno-builtin-realloc', '-fno-builtin-free']) |
| 415 | |
Koan-Sin Tan | 7d4f187 | 2012-01-31 12:05:52 -0500 | [diff] [blame] | 416 | elif main['CLANG']: |
| 417 | clang_version_re = re.compile(".* version (\d+\.\d+)") |
Mitch Hayenga | 7084e31 | 2014-03-07 15:56:23 -0500 | [diff] [blame] | 418 | clang_version_match = clang_version_re.search(CXX_version) |
Koan-Sin Tan | 7d4f187 | 2012-01-31 12:05:52 -0500 | [diff] [blame] | 419 | if (clang_version_match): |
| 420 | clang_version = clang_version_match.groups()[0] |
Gabe Black | a83316e | 2020-09-17 22:31:50 -0700 | [diff] [blame] | 421 | if compareVersions(clang_version, "3.9") < 0: |
| 422 | error('clang version 3.9 or newer required.\n' |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 423 | 'Installed version:', clang_version) |
Koan-Sin Tan | 7d4f187 | 2012-01-31 12:05:52 -0500 | [diff] [blame] | 424 | else: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 425 | error('Unable to determine clang version.') |
Koan-Sin Tan | 7d4f187 | 2012-01-31 12:05:52 -0500 | [diff] [blame] | 426 | |
Andreas Hansson | 12eb034 | 2016-01-11 05:52:20 -0500 | [diff] [blame] | 427 | # clang has a few additional warnings that we disable, extraneous |
Andreas Hansson | 08a5fd3 | 2013-02-19 05:56:07 -0500 | [diff] [blame] | 428 | # parantheses are allowed due to Ruby's printing of the AST, |
| 429 | # finally self assignments are allowed as the generated CPU code |
| 430 | # is relying on this |
Andreas Hansson | 12eb034 | 2016-01-11 05:52:20 -0500 | [diff] [blame] | 431 | main.Append(CCFLAGS=['-Wno-parentheses', |
Andreas Sandberg | 6b90821 | 2014-08-13 06:57:28 -0400 | [diff] [blame] | 432 | '-Wno-self-assign', |
| 433 | # Some versions of libstdc++ (4.8?) seem to |
| 434 | # use struct hash and class hash |
| 435 | # interchangeably. |
| 436 | '-Wno-mismatched-tags', |
| 437 | ]) |
Nikos Nikoleris | 6bd0a39 | 2020-08-31 08:19:09 +0300 | [diff] [blame] | 438 | if sys.platform != "darwin" and \ |
| 439 | compareVersions(clang_version, "10.0") >= 0: |
Gabe Black | 92711fe | 2020-02-09 20:03:58 -0800 | [diff] [blame] | 440 | main.Append(CCFLAGS=['-Wno-c99-designator']) |
Andreas Hansson | 08a5fd3 | 2013-02-19 05:56:07 -0500 | [diff] [blame] | 441 | |
Bobby R. Bruce | 1f292ed | 2020-05-26 15:11:59 -0700 | [diff] [blame] | 442 | if compareVersions(clang_version, "8.0") >= 0: |
| 443 | main.Append(CCFLAGS=['-Wno-defaulted-function-deleted']) |
| 444 | |
Andreas Sandberg | 468ad10 | 2013-03-18 10:57:26 +0100 | [diff] [blame] | 445 | main.Append(TCMALLOC_CCFLAGS=['-fno-builtin']) |
| 446 | |
Andreas Hansson | 406891c | 2013-01-07 13:05:39 -0500 | [diff] [blame] | 447 | # On Mac OS X/Darwin we need to also use libc++ (part of XCode) as |
Andreas Hansson | fdf6f6c | 2013-09-04 13:22:54 -0400 | [diff] [blame] | 448 | # opposed to libstdc++, as the later is dated. |
| 449 | if sys.platform == "darwin": |
| 450 | main.Append(CXXFLAGS=['-stdlib=libc++']) |
| 451 | main.Append(LIBS=['c++']) |
Andreas Hansson | b6aa6d5 | 2012-04-14 05:43:31 -0400 | [diff] [blame] | 452 | |
Bjoern A. Zeeb | e07f0c5 | 2017-02-09 19:00:00 -0500 | [diff] [blame] | 453 | # On FreeBSD we need libthr. |
| 454 | if sys.platform.startswith('freebsd'): |
| 455 | main.Append(LIBS=['thr']) |
| 456 | |
Nikos Nikoleris | 8f5b7e7 | 2019-12-20 12:41:40 +0000 | [diff] [blame] | 457 | # Add sanitizers flags |
| 458 | sanitizers=[] |
| 459 | if GetOption('with_ubsan'): |
Bobby R. Bruce | a1a2edd | 2020-08-28 18:28:23 -0700 | [diff] [blame] | 460 | sanitizers.append('undefined') |
Nikos Nikoleris | 8f5b7e7 | 2019-12-20 12:41:40 +0000 | [diff] [blame] | 461 | if GetOption('with_asan'): |
Bobby R. Bruce | a1a2edd | 2020-08-28 18:28:23 -0700 | [diff] [blame] | 462 | # Available for gcc >= 5 or llvm >= 3.1 both a requirement |
Nikos Nikoleris | 8f5b7e7 | 2019-12-20 12:41:40 +0000 | [diff] [blame] | 463 | # by the build system |
| 464 | sanitizers.append('address') |
Gabe Black | b5a3c0d | 2020-03-26 03:20:41 -0700 | [diff] [blame] | 465 | suppressions_file = Dir('util').File('lsan-suppressions').get_abspath() |
| 466 | suppressions_opt = 'suppressions=%s' % suppressions_file |
| 467 | main['ENV']['LSAN_OPTIONS'] = ':'.join([suppressions_opt, |
| 468 | 'print_suppressions=0']) |
| 469 | print() |
| 470 | warning('To suppress false positive leaks, set the LSAN_OPTIONS ' |
| 471 | 'environment variable to "%s" when running gem5' % |
| 472 | suppressions_opt) |
| 473 | warning('LSAN_OPTIONS=suppressions=%s' % suppressions_opt) |
| 474 | print() |
Nikos Nikoleris | 8f5b7e7 | 2019-12-20 12:41:40 +0000 | [diff] [blame] | 475 | if sanitizers: |
| 476 | sanitizers = ','.join(sanitizers) |
| 477 | if main['GCC'] or main['CLANG']: |
| 478 | main.Append(CCFLAGS=['-fsanitize=%s' % sanitizers, |
Earl Ou | a1e5fcc | 2018-09-07 15:16:53 +0800 | [diff] [blame] | 479 | '-fno-omit-frame-pointer'], |
Nikos Nikoleris | 8f5b7e7 | 2019-12-20 12:41:40 +0000 | [diff] [blame] | 480 | LINKFLAGS='-fsanitize=%s' % sanitizers) |
| 481 | else: |
| 482 | warning("Don't know how to enable %s sanitizer(s) for your " |
| 483 | "compiler." % sanitizers) |
Gabe Black | 316ef3d | 2017-11-20 18:21:19 -0800 | [diff] [blame] | 484 | |
Nathan Binkert | 7311fd7 | 2009-05-11 10:38:46 -0700 | [diff] [blame] | 485 | # Set up common yacc/bison flags (needed for Ruby) |
| 486 | main['YACCFLAGS'] = '-d' |
| 487 | main['YACCHXXFILESUFFIX'] = '.hh' |
| 488 | |
Ali Saidi | bee4d45 | 2008-04-07 23:40:24 -0400 | [diff] [blame] | 489 | # Do this after we save setting back, or else we'll tack on an |
| 490 | # extra 'qdo' every time we run scons. |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 491 | if main['BATCH']: |
| 492 | main['CC'] = main['BATCH_CMD'] + ' ' + main['CC'] |
| 493 | main['CXX'] = main['BATCH_CMD'] + ' ' + main['CXX'] |
| 494 | main['AS'] = main['BATCH_CMD'] + ' ' + main['AS'] |
| 495 | main['AR'] = main['BATCH_CMD'] + ' ' + main['AR'] |
| 496 | main['RANLIB'] = main['BATCH_CMD'] + ' ' + main['RANLIB'] |
Ali Saidi | bee4d45 | 2008-04-07 23:40:24 -0400 | [diff] [blame] | 497 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 498 | if sys.platform == 'cygwin': |
| 499 | # cygwin has some header file issues... |
Gabe Black | 14b27fc | 2010-11-09 11:03:40 -0800 | [diff] [blame] | 500 | main.Append(CCFLAGS=["-Wno-uninitialized"]) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 501 | |
Andreas Sandberg | 51d38a4 | 2016-04-22 22:26:56 +0100 | [diff] [blame] | 502 | |
| 503 | have_pkg_config = readCommand(['pkg-config', '--version'], exception='') |
| 504 | |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 505 | # Check for the protobuf compiler |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 506 | try: |
| 507 | main['HAVE_PROTOC'] = True |
| 508 | protoc_version = readCommand([main['PROTOC'], '--version']).split() |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 509 | |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 510 | # First two words should be "libprotoc x.y.z" |
| 511 | if len(protoc_version) < 2 or protoc_version[0] != 'libprotoc': |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 512 | warning('Protocol buffer compiler (protoc) not found.\n' |
| 513 | 'Please install protobuf-compiler for tracing support.') |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 514 | main['HAVE_PROTOC'] = False |
Andreas Hansson | 62544f9 | 2013-01-21 09:20:18 -0500 | [diff] [blame] | 515 | else: |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 516 | # Based on the availability of the compress stream wrappers, |
| 517 | # require 2.1.0 |
| 518 | min_protoc_version = '2.1.0' |
| 519 | if compareVersions(protoc_version[1], min_protoc_version) < 0: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 520 | warning('protoc version', min_protoc_version, |
| 521 | 'or newer required.\n' |
| 522 | 'Installed version:', protoc_version[1]) |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 523 | main['HAVE_PROTOC'] = False |
| 524 | else: |
| 525 | # Attempt to determine the appropriate include path and |
| 526 | # library path using pkg-config, that means we also need to |
| 527 | # check for pkg-config. Note that it is possible to use |
| 528 | # protobuf without the involvement of pkg-config. Later on we |
| 529 | # check go a library config check and at that point the test |
| 530 | # will fail if libprotobuf cannot be found. |
| 531 | if have_pkg_config: |
| 532 | try: |
| 533 | # Attempt to establish what linking flags to add for |
| 534 | # protobuf |
| 535 | # using pkg-config |
| 536 | main.ParseConfig( |
| 537 | 'pkg-config --cflags --libs-only-L protobuf') |
| 538 | except: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 539 | warning('pkg-config could not get protobuf flags.') |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 540 | except Exception as e: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 541 | warning('While checking protoc version:', str(e)) |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 542 | main['HAVE_PROTOC'] = False |
Steve Reinhardt | 29e34a7 | 2006-06-09 23:01:31 -0400 | [diff] [blame] | 543 | |
Andreas Hansson | eed0795 | 2015-03-02 04:00:29 -0500 | [diff] [blame] | 544 | # Check for 'timeout' from GNU coreutils. If present, regressions will |
| 545 | # be run with a time limit. We require version 8.13 since we rely on |
| 546 | # support for the '--foreground' option. |
Bjoern A. Zeeb | e07f0c5 | 2017-02-09 19:00:00 -0500 | [diff] [blame] | 547 | if sys.platform.startswith('freebsd'): |
| 548 | timeout_lines = readCommand(['gtimeout', '--version'], |
| 549 | exception='').splitlines() |
| 550 | else: |
| 551 | timeout_lines = readCommand(['timeout', '--version'], |
| 552 | exception='').splitlines() |
Andreas Hansson | eed0795 | 2015-03-02 04:00:29 -0500 | [diff] [blame] | 553 | # Get the first line and tokenize it |
| 554 | timeout_version = timeout_lines[0].split() if timeout_lines else [] |
| 555 | main['TIMEOUT'] = timeout_version and \ |
| 556 | compareVersions(timeout_version[-1], '8.13') >= 0 |
Curtis Dunham | e553ca6 | 2014-08-25 14:32:00 -0500 | [diff] [blame] | 557 | |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 558 | # Add a custom Check function to test for structure members. |
| 559 | def CheckMember(context, include, decl, member, include_quotes="<>"): |
| 560 | context.Message("Checking for member %s in %s..." % |
| 561 | (member, decl)) |
| 562 | text = """ |
| 563 | #include %(header)s |
| 564 | int main(){ |
| 565 | %(decl)s test; |
| 566 | (void)test.%(member)s; |
| 567 | return 0; |
| 568 | }; |
| 569 | """ % { "header" : include_quotes[0] + include + include_quotes[1], |
| 570 | "decl" : decl, |
| 571 | "member" : member, |
| 572 | } |
| 573 | |
| 574 | ret = context.TryCompile(text, extension=".cc") |
| 575 | context.Result(ret) |
| 576 | return ret |
| 577 | |
Andreas Sandberg | bc2e123 | 2020-10-21 17:41:56 +0100 | [diff] [blame] | 578 | def CheckPythonLib(context): |
| 579 | context.Message('Checking Python version... ') |
| 580 | ret = context.TryRun(r""" |
| 581 | #include <pybind11/embed.h> |
| 582 | |
| 583 | int |
| 584 | main(int argc, char **argv) { |
| 585 | pybind11::scoped_interpreter guard{}; |
| 586 | pybind11::exec( |
| 587 | "import sys\n" |
| 588 | "vi = sys.version_info\n" |
| 589 | "sys.stdout.write('%i.%i.%i' % (vi.major, vi.minor, vi.micro));\n"); |
| 590 | return 0; |
| 591 | } |
| 592 | """, extension=".cc") |
| 593 | context.Result(ret[1] if ret[0] == 1 else 0) |
| 594 | if ret[0] == 0: |
| 595 | return None |
| 596 | else: |
| 597 | return tuple(map(int, ret[1].split("."))) |
| 598 | |
Steve Reinhardt | 20051d4 | 2006-05-22 22:37:56 -0400 | [diff] [blame] | 599 | # Platform-specific configuration. Note again that we assume that all |
| 600 | # builds under a given build root run on the same host platform. |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 601 | conf = Configure(main, |
Steve Reinhardt | 6ae75ac | 2006-12-04 08:55:06 -0800 | [diff] [blame] | 602 | conf_dir = joinpath(build_root, '.scons_config'), |
Nathan Binkert | ede89c2 | 2008-08-03 18:19:54 -0700 | [diff] [blame] | 603 | log_file = joinpath(build_root, 'scons_config.log'), |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 604 | custom_tests = { |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 605 | 'CheckMember' : CheckMember, |
Andreas Sandberg | bc2e123 | 2020-10-21 17:41:56 +0100 | [diff] [blame] | 606 | 'CheckPythonLib' : CheckPythonLib, |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 607 | }) |
Nathan Binkert | ede89c2 | 2008-08-03 18:19:54 -0700 | [diff] [blame] | 608 | |
Ali Saidi | c01421a | 2007-11-08 17:45:58 -0500 | [diff] [blame] | 609 | # Check if we should compile a 64 bit binary on Mac OS X/Darwin |
| 610 | try: |
| 611 | import platform |
| 612 | uname = platform.uname() |
Nathan Binkert | 9a8cb7d | 2009-09-22 15:24:16 -0700 | [diff] [blame] | 613 | if uname[0] == 'Darwin' and compareVersions(uname[2], '9.0.0') >= 0: |
| 614 | if int(readCommand('sysctl -n hw.cpu64bit_capable')[0]): |
Ali Saidi | 5c6f4a0 | 2010-11-19 18:00:59 -0600 | [diff] [blame] | 615 | main.Append(CCFLAGS=['-arch', 'x86_64']) |
| 616 | main.Append(CFLAGS=['-arch', 'x86_64']) |
| 617 | main.Append(LINKFLAGS=['-arch', 'x86_64']) |
| 618 | main.Append(ASFLAGS=['-arch', 'x86_64']) |
Ali Saidi | c01421a | 2007-11-08 17:45:58 -0500 | [diff] [blame] | 619 | except: |
| 620 | pass |
| 621 | |
Steve Reinhardt | 67b46d0 | 2007-11-01 14:28:59 -0700 | [diff] [blame] | 622 | # Recent versions of scons substitute a "Null" object for Configure() |
| 623 | # when configuration isn't necessary, e.g., if the "--help" option is |
| 624 | # present. Unfortuantely this Null object always returns false, |
| 625 | # breaking all our configuration checks. We replace it with our own |
| 626 | # more optimistic null object that returns True instead. |
| 627 | if not conf: |
| 628 | def NullCheck(*args, **kwargs): |
| 629 | return True |
| 630 | |
| 631 | class NullConf: |
| 632 | def __init__(self, env): |
| 633 | self.env = env |
| 634 | def Finish(self): |
| 635 | return self.env |
| 636 | def __getattr__(self, mname): |
| 637 | return NullCheck |
| 638 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 639 | conf = NullConf(main) |
Steve Reinhardt | 67b46d0 | 2007-11-01 14:28:59 -0700 | [diff] [blame] | 640 | |
Ali Saidi | 5fcf442 | 2010-11-08 13:58:24 -0600 | [diff] [blame] | 641 | # Cache build files in the supplied directory. |
| 642 | if main['M5_BUILD_CACHE']: |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 643 | print('Using build cache located at', main['M5_BUILD_CACHE']) |
Ali Saidi | 5fcf442 | 2010-11-08 13:58:24 -0600 | [diff] [blame] | 644 | CacheDir(main['M5_BUILD_CACHE']) |
| 645 | |
Andreas Sandberg | 60e6e78 | 2017-02-27 13:17:51 +0000 | [diff] [blame] | 646 | main['USE_PYTHON'] = not GetOption('without_python') |
| 647 | if main['USE_PYTHON']: |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 648 | # Find Python include and library directories for embedding the |
| 649 | # interpreter. We rely on python-config to resolve the appropriate |
| 650 | # includes and linker flags. ParseConfig does not seem to understand |
| 651 | # the more exotic linker flags such as -Xlinker and -export-dynamic so |
| 652 | # we add them explicitly below. If you want to link in an alternate |
| 653 | # version of python, see above for instructions on how to invoke |
| 654 | # scons with the appropriate PATH set. |
Andreas Sandberg | a3c81f9 | 2019-01-25 11:14:29 +0000 | [diff] [blame] | 655 | |
Gabe Black | 55ae5a8 | 2020-03-26 03:38:14 -0700 | [diff] [blame] | 656 | python_config = main.Detect(main['PYTHON_CONFIG']) |
Andreas Sandberg | a3c81f9 | 2019-01-25 11:14:29 +0000 | [diff] [blame] | 657 | if python_config is None: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 658 | error("Can't find a suitable python-config, tried %s" % \ |
Andreas Sandberg | a3c81f9 | 2019-01-25 11:14:29 +0000 | [diff] [blame] | 659 | main['PYTHON_CONFIG']) |
Andreas Sandberg | a3c81f9 | 2019-01-25 11:14:29 +0000 | [diff] [blame] | 660 | |
| 661 | print("Info: Using Python config: %s" % (python_config, )) |
Bobby R. Bruce | 8177930 | 2020-09-28 11:56:19 -0700 | [diff] [blame] | 662 | |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 663 | py_includes = readCommand([python_config, '--includes'], |
| 664 | exception='').split() |
Giacomo Travaglini | 10b4842 | 2020-03-02 14:30:25 +0000 | [diff] [blame] | 665 | py_includes = list(filter( |
| 666 | lambda s: match(r'.*\/include\/.*',s), py_includes)) |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 667 | # Strip the -I from the include folders before adding them to the |
| 668 | # CPPPATH |
Giacomo Travaglini | 10b4842 | 2020-03-02 14:30:25 +0000 | [diff] [blame] | 669 | py_includes = list(map( |
| 670 | lambda s: s[2:] if s.startswith('-I') else s, py_includes)) |
Andrea Mondelli | ad9a233 | 2019-01-10 10:33:13 -0500 | [diff] [blame] | 671 | main.Append(CPPPATH=py_includes) |
Andreas Hansson | 3ede4dc | 2013-07-18 08:29:28 -0400 | [diff] [blame] | 672 | |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 673 | # Read the linker flags and split them into libraries and other link |
| 674 | # flags. The libraries are added later through the call the CheckLib. |
Jason Lowe-Power | 0bc5d77 | 2020-05-06 17:38:41 -0700 | [diff] [blame] | 675 | # Note: starting in Python 3.8 the --embed flag is required to get the |
| 676 | # -lpython3.8 linker flag |
| 677 | retcode, cmd_stdout = readCommandWithReturn( |
| 678 | [python_config, '--ldflags', '--embed'], exception='') |
| 679 | if retcode != 0: |
| 680 | # If --embed isn't detected then we're running python <3.8 |
| 681 | retcode, cmd_stdout = readCommandWithReturn( |
| 682 | [python_config, '--ldflags'], exception='') |
| 683 | |
| 684 | # Checking retcode again |
| 685 | if retcode != 0: |
| 686 | error("Failing on python-config --ldflags command") |
| 687 | |
| 688 | py_ld_flags = cmd_stdout.split() |
| 689 | |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 690 | py_libs = [] |
| 691 | for lib in py_ld_flags: |
| 692 | if not lib.startswith('-l'): |
| 693 | main.Append(LINKFLAGS=[lib]) |
| 694 | else: |
| 695 | lib = lib[2:] |
| 696 | if lib not in py_libs: |
| 697 | py_libs.append(lib) |
Ali Saidi | 5fcf442 | 2010-11-08 13:58:24 -0600 | [diff] [blame] | 698 | |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 699 | # verify that this stuff works |
| 700 | if not conf.CheckHeader('Python.h', '<>'): |
Gabe Black | a39c8db | 2019-12-02 17:52:44 -0800 | [diff] [blame] | 701 | error("Check failed for Python.h header in", |
| 702 | ' '.join(py_includes), "\n" |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 703 | "Two possible reasons:\n" |
| 704 | "1. Python headers are not installed (You can install the " |
| 705 | "package python-dev on Ubuntu and RedHat)\n" |
| 706 | "2. SCons is using a wrong C compiler. This can happen if " |
| 707 | "CC has the wrong value.\n" |
| 708 | "CC = %s" % main['CC']) |
Steve Reinhardt | 85436fd | 2006-10-01 01:42:18 -0400 | [diff] [blame] | 709 | |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 710 | for lib in py_libs: |
| 711 | if not conf.CheckLib(lib): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 712 | error("Can't find library %s required by python." % lib) |
Andrew Bardsley | d8502ee | 2014-10-16 05:49:32 -0400 | [diff] [blame] | 713 | |
Nikos Nikoleris | a0414b5 | 2020-04-30 17:33:13 +0100 | [diff] [blame] | 714 | main.Prepend(CPPPATH=Dir('ext/pybind11/include/')) |
| 715 | # Bare minimum environment that only includes python |
Giacomo Travaglini | a1b6471 | 2020-06-04 12:45:52 +0100 | [diff] [blame] | 716 | marshal_env = main.Clone() |
| 717 | marshal_env.Append(CCFLAGS='$MARSHAL_CCFLAGS_EXTRA') |
| 718 | marshal_env.Append(LINKFLAGS='$MARSHAL_LDFLAGS_EXTRA') |
Andreas Sandberg | bc2e123 | 2020-10-21 17:41:56 +0100 | [diff] [blame] | 719 | py_version = conf.CheckPythonLib() |
| 720 | if not py_version: |
| 721 | error("Can't find a working Python installation") |
| 722 | |
| 723 | # Found a working Python installation. Check if it meets minimum |
| 724 | # requirements. |
| 725 | if py_version[0] < 3 or \ |
| 726 | (py_version[0] == 3 and py_version[1] < 6): |
| 727 | error('Python version too old. Version 3.6 or newer is required.') |
| 728 | elif py_version[0] > 3: |
| 729 | warning('Python version too new. Python 3 expected.') |
Nikos Nikoleris | a0414b5 | 2020-04-30 17:33:13 +0100 | [diff] [blame] | 730 | |
Ali Saidi | 21cf4a4 | 2006-11-04 21:41:01 -0500 | [diff] [blame] | 731 | # On Solaris you need to use libsocket for socket ops |
Ali Saidi | 430622c | 2006-11-06 10:15:27 -0500 | [diff] [blame] | 732 | if not conf.CheckLibWithHeader(None, 'sys/socket.h', 'C++', 'accept(0,0,0);'): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 733 | if not conf.CheckLibWithHeader('socket', 'sys/socket.h', |
| 734 | 'C++', 'accept(0,0,0);'): |
| 735 | error("Can't find library with socket calls (e.g. accept()).") |
Ali Saidi | 21cf4a4 | 2006-11-04 21:41:01 -0500 | [diff] [blame] | 736 | |
Steve Reinhardt | a016e13 | 2006-08-21 18:25:33 -0400 | [diff] [blame] | 737 | # Check for zlib. If the check passes, libz will be automatically |
| 738 | # added to the LIBS environment variable. |
Ali Saidi | 63fdabf | 2007-01-26 18:48:51 -0500 | [diff] [blame] | 739 | if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 740 | error('Did not find needed zlib compression library ' |
| 741 | 'and/or zlib.h header file.\n' |
| 742 | 'Please install zlib and try again.') |
Steve Reinhardt | a016e13 | 2006-08-21 18:25:33 -0400 | [diff] [blame] | 743 | |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 744 | # If we have the protobuf compiler, also make sure we have the |
| 745 | # development libraries. If the check passes, libprotobuf will be |
| 746 | # automatically added to the LIBS environment variable. After |
| 747 | # this, we can use the HAVE_PROTOBUF flag to determine if we have |
| 748 | # got both protoc and libprotobuf available. |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 749 | main['HAVE_PROTOBUF'] = main['HAVE_PROTOC'] and \ |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 750 | conf.CheckLibWithHeader('protobuf', 'google/protobuf/message.h', |
| 751 | 'C++', 'GOOGLE_PROTOBUF_VERIFY_VERSION;') |
| 752 | |
Gabe Black | a3385da | 2018-08-22 16:49:22 -0700 | [diff] [blame] | 753 | # Valgrind gets much less confused if you tell it when you're using |
| 754 | # alternative stacks. |
| 755 | main['HAVE_VALGRIND'] = conf.CheckCHeader('valgrind/valgrind.h') |
| 756 | |
Andreas Hansson | 62544f9 | 2013-01-21 09:20:18 -0500 | [diff] [blame] | 757 | # If we have the compiler but not the library, print another warning. |
Gabe Black | dc3c6ee | 2019-11-18 16:00:22 -0800 | [diff] [blame] | 758 | if main['HAVE_PROTOC'] and not main['HAVE_PROTOBUF']: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 759 | warning('Did not find protocol buffer library and/or headers.\n' |
| 760 | 'Please install libprotobuf-dev for tracing support.') |
Andreas Hansson | 41f228c | 2013-01-07 13:05:37 -0500 | [diff] [blame] | 761 | |
Nathan Binkert | 318bfe9 | 2011-01-15 07:48:25 -0800 | [diff] [blame] | 762 | # Check for librt. |
Gabe Black | 0e64e1b | 2011-01-21 17:51:22 -0800 | [diff] [blame] | 763 | have_posix_clock = \ |
| 764 | conf.CheckLibWithHeader(None, 'time.h', 'C', |
| 765 | 'clock_nanosleep(0,0,NULL,NULL);') or \ |
| 766 | conf.CheckLibWithHeader('rt', 'time.h', 'C', |
| 767 | 'clock_nanosleep(0,0,NULL,NULL);') |
Nathan Binkert | 318bfe9 | 2011-01-15 07:48:25 -0800 | [diff] [blame] | 768 | |
Andreas Sandberg | d3d5393 | 2013-10-01 15:56:47 +0200 | [diff] [blame] | 769 | have_posix_timers = \ |
| 770 | conf.CheckLibWithHeader([None, 'rt'], [ 'time.h', 'signal.h' ], 'C', |
| 771 | 'timer_create(CLOCK_MONOTONIC, NULL, NULL);') |
| 772 | |
Curtis Dunham | ded540a | 2014-09-22 14:37:23 -0500 | [diff] [blame] | 773 | if not GetOption('without_tcmalloc'): |
| 774 | if conf.CheckLib('tcmalloc'): |
| 775 | main.Append(CCFLAGS=main['TCMALLOC_CCFLAGS']) |
| 776 | elif conf.CheckLib('tcmalloc_minimal'): |
| 777 | main.Append(CCFLAGS=main['TCMALLOC_CCFLAGS']) |
| 778 | else: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 779 | warning("You can get a 12% performance improvement by " |
| 780 | "installing tcmalloc (libgoogle-perftools-dev package " |
| 781 | "on Ubuntu or RedHat).") |
Ali Saidi | aec7a44 | 2012-06-05 01:23:09 -0400 | [diff] [blame] | 782 | |
Andreas Sandberg | daa53da | 2015-12-04 00:12:58 +0000 | [diff] [blame] | 783 | |
| 784 | # Detect back trace implementations. The last implementation in the |
| 785 | # list will be used by default. |
| 786 | backtrace_impls = [ "none" ] |
| 787 | |
Hanhwi Jang | c872143 | 2018-01-30 19:17:33 +0900 | [diff] [blame] | 788 | backtrace_checker = 'char temp;' + \ |
| 789 | ' backtrace_symbols_fd((void*)&temp, 0, 0);' |
| 790 | if conf.CheckLibWithHeader(None, 'execinfo.h', 'C', backtrace_checker): |
Andreas Sandberg | daa53da | 2015-12-04 00:12:58 +0000 | [diff] [blame] | 791 | backtrace_impls.append("glibc") |
Bjoern A. Zeeb | e07f0c5 | 2017-02-09 19:00:00 -0500 | [diff] [blame] | 792 | elif conf.CheckLibWithHeader('execinfo', 'execinfo.h', 'C', |
Hanhwi Jang | c872143 | 2018-01-30 19:17:33 +0900 | [diff] [blame] | 793 | backtrace_checker): |
Bjoern A. Zeeb | e07f0c5 | 2017-02-09 19:00:00 -0500 | [diff] [blame] | 794 | # NetBSD and FreeBSD need libexecinfo. |
| 795 | backtrace_impls.append("glibc") |
| 796 | main.Append(LIBS=['execinfo']) |
Andreas Sandberg | daa53da | 2015-12-04 00:12:58 +0000 | [diff] [blame] | 797 | |
| 798 | if backtrace_impls[-1] == "none": |
| 799 | default_backtrace_impl = "none" |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 800 | warning("No suitable back trace implementation found.") |
Andreas Sandberg | daa53da | 2015-12-04 00:12:58 +0000 | [diff] [blame] | 801 | |
Nathan Binkert | 318bfe9 | 2011-01-15 07:48:25 -0800 | [diff] [blame] | 802 | if not have_posix_clock: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 803 | warning("Can't find library for POSIX clocks.") |
Nathan Binkert | 318bfe9 | 2011-01-15 07:48:25 -0800 | [diff] [blame] | 804 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 805 | # Check for <fenv.h> (C99 FP environment control) |
| 806 | have_fenv = conf.CheckHeader('fenv.h', '<>') |
| 807 | if not have_fenv: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 808 | warning("Header file <fenv.h> not found.\n" |
| 809 | "This host has no IEEE FP rounding mode control.") |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 810 | |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 811 | # Check for <png.h> (libpng library needed if wanting to dump |
| 812 | # frame buffer image in png format) |
| 813 | have_png = conf.CheckHeader('png.h', '<>') |
| 814 | if not have_png: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 815 | warning("Header file <png.h> not found.\n" |
| 816 | "This host has no libpng library.\n" |
| 817 | "Disabling support for PNG framebuffers.") |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 818 | |
Andreas Hansson | 05ed2de | 2013-10-02 06:08:45 -0400 | [diff] [blame] | 819 | # Check if we should enable KVM-based hardware virtualization. The API |
| 820 | # we rely on exists since version 2.6.36 of the kernel, but somehow |
| 821 | # the KVM_API_VERSION does not reflect the change. We test for one of |
| 822 | # the types as a fall back. |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 823 | have_kvm = conf.CheckHeader('linux/kvm.h', '<>') |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 824 | if not have_kvm: |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 825 | print("Info: Compatible header file <linux/kvm.h> not found, " |
| 826 | "disabling KVM support.") |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 827 | |
Gabe Black | c58537c | 2017-06-03 07:23:05 -0700 | [diff] [blame] | 828 | # Check if the TUN/TAP driver is available. |
| 829 | have_tuntap = conf.CheckHeader('linux/if_tun.h', '<>') |
| 830 | if not have_tuntap: |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 831 | print("Info: Compatible header file <linux/if_tun.h> not found.") |
Gabe Black | c58537c | 2017-06-03 07:23:05 -0700 | [diff] [blame] | 832 | |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 833 | # x86 needs support for xsave. We test for the structure here since we |
| 834 | # won't be able to run new tests by the time we know which ISA we're |
| 835 | # targeting. |
| 836 | have_kvm_xsave = conf.CheckTypeSize('struct kvm_xsave', |
| 837 | '#include <linux/kvm.h>') != 0 |
| 838 | |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 839 | # Check if the requested target ISA is compatible with the host |
| 840 | def is_isa_kvm_compatible(isa): |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 841 | try: |
| 842 | import platform |
| 843 | host_isa = platform.machine() |
| 844 | except: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 845 | warning("Failed to determine host ISA.") |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 846 | return False |
| 847 | |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 848 | if not have_posix_timers: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 849 | warning("Can not enable KVM, host seems to lack support " |
| 850 | "for POSIX timers") |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 851 | return False |
| 852 | |
| 853 | if isa == "arm": |
Andreas Sandberg | 7c4eb3b | 2015-06-01 19:44:19 +0100 | [diff] [blame] | 854 | return host_isa in ( "armv7l", "aarch64" ) |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 855 | elif isa == "x86": |
| 856 | if host_isa != "x86_64": |
| 857 | return False |
| 858 | |
| 859 | if not have_kvm_xsave: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 860 | warning("KVM on x86 requires xsave support in kernel headers.") |
Andreas Sandberg | 12e91f7 | 2015-05-23 13:37:18 +0100 | [diff] [blame] | 861 | return False |
| 862 | |
| 863 | return True |
| 864 | else: |
| 865 | return False |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 866 | |
| 867 | |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 868 | # Check if the exclude_host attribute is available. We want this to |
| 869 | # get accurate instruction counts in KVM. |
| 870 | main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember( |
| 871 | 'linux/perf_event.h', 'struct perf_event_attr', 'exclude_host') |
| 872 | |
Andreas Sandberg | 51d38a4 | 2016-04-22 22:26:56 +0100 | [diff] [blame] | 873 | def check_hdf5(): |
| 874 | return \ |
| 875 | conf.CheckLibWithHeader('hdf5', 'hdf5.h', 'C', |
| 876 | 'H5Fcreate("", 0, 0, 0);') and \ |
| 877 | conf.CheckLibWithHeader('hdf5_cpp', 'H5Cpp.h', 'C++', |
| 878 | 'H5::H5File("", 0);') |
| 879 | |
| 880 | def check_hdf5_pkg(name): |
| 881 | print("Checking for %s using pkg-config..." % name, end="") |
| 882 | if not have_pkg_config: |
| 883 | print(" pkg-config not found") |
| 884 | return False |
| 885 | |
| 886 | try: |
| 887 | main.ParseConfig('pkg-config --cflags-only-I --libs-only-L %s' % name) |
| 888 | print(" yes") |
| 889 | return True |
| 890 | except: |
| 891 | print(" no") |
| 892 | return False |
| 893 | |
| 894 | # Check if there is a pkg-config configuration for hdf5. If we find |
| 895 | # it, setup the environment to enable linking and header inclusion. We |
| 896 | # don't actually try to include any headers or link with hdf5 at this |
| 897 | # stage. |
| 898 | if not check_hdf5_pkg('hdf5-serial'): |
| 899 | check_hdf5_pkg('hdf5') |
| 900 | |
| 901 | # Check if the HDF5 libraries can be found. This check respects the |
| 902 | # include path and library path provided by pkg-config. We perform |
| 903 | # this check even if there isn't a pkg-config configuration for hdf5 |
| 904 | # since some installations don't use pkg-config. |
| 905 | have_hdf5 = check_hdf5() |
| 906 | if not have_hdf5: |
| 907 | print("Warning: Couldn't find any HDF5 C++ libraries. Disabling") |
| 908 | print(" HDF5 support.") |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 909 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 910 | ###################################################################### |
| 911 | # |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 912 | # Finish the configuration |
| 913 | # |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 914 | main = conf.Finish() |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 915 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 916 | ###################################################################### |
| 917 | # |
| 918 | # Collect all non-global variables |
| 919 | # |
| 920 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 921 | # Define the universe of supported ISAs |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 922 | all_isa_list = [ ] |
Tony Gutierrez | 1a7d3f9 | 2016-01-19 14:28:22 -0500 | [diff] [blame] | 923 | all_gpu_isa_list = [ ] |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 924 | Export('all_isa_list') |
Tony Gutierrez | 1a7d3f9 | 2016-01-19 14:28:22 -0500 | [diff] [blame] | 925 | Export('all_gpu_isa_list') |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 926 | |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 927 | class CpuModel(object): |
| 928 | '''The CpuModel class encapsulates everything the ISA parser needs to |
| 929 | know about a particular CPU model.''' |
| 930 | |
| 931 | # Dict of available CPU model objects. Accessible as CpuModel.dict. |
| 932 | dict = {} |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 933 | |
| 934 | # Constructor. Automatically adds models to CpuModel.dict. |
Andreas Sandberg | 326662b | 2014-09-03 07:42:22 -0400 | [diff] [blame] | 935 | def __init__(self, name, default=False): |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 936 | self.name = name # name of model |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 937 | |
| 938 | # This cpu is enabled by default |
| 939 | self.default = default |
| 940 | |
| 941 | # Add self to dict |
| 942 | if name in CpuModel.dict: |
Gabe Black | a39c8db | 2019-12-02 17:52:44 -0800 | [diff] [blame] | 943 | raise AttributeError("CpuModel '%s' already registered" % name) |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 944 | CpuModel.dict[name] = self |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 945 | |
| 946 | Export('CpuModel') |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 947 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 948 | # Sticky variables get saved in the variables file so they persist from |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 949 | # one invocation to the next (unless overridden, in which case the new |
| 950 | # value becomes sticky). |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 951 | sticky_vars = Variables(args=ARGUMENTS) |
| 952 | Export('sticky_vars') |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 953 | |
Nathan Binkert | b0489d1 | 2009-04-21 08:17:36 -0700 | [diff] [blame] | 954 | # Sticky variables that should be exported |
| 955 | export_vars = [] |
| 956 | Export('export_vars') |
| 957 | |
Jason Power | aa8bcd1 | 2012-09-12 14:52:04 -0500 | [diff] [blame] | 958 | # For Ruby |
| 959 | all_protocols = [] |
| 960 | Export('all_protocols') |
| 961 | protocol_dirs = [] |
| 962 | Export('protocol_dirs') |
| 963 | slicc_includes = [] |
| 964 | Export('slicc_includes') |
| 965 | |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 966 | # Walk the tree and execute all SConsopts scripts that wil add to the |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 967 | # above variables |
Curtis Dunham | a3d582f | 2014-03-23 11:11:51 -0400 | [diff] [blame] | 968 | if GetOption('verbose'): |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 969 | print("Reading SConsopts") |
Nathan Binkert | 4d64d76 | 2008-11-10 11:51:18 -0800 | [diff] [blame] | 970 | for bdir in [ base_dir ] + extras_dir_list: |
Steve Reinhardt | 8ce85d3 | 2011-05-02 12:40:32 -0700 | [diff] [blame] | 971 | if not isdir(bdir): |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 972 | error("Directory '%s' does not exist." % bdir) |
Nathan Binkert | 4d64d76 | 2008-11-10 11:51:18 -0800 | [diff] [blame] | 973 | for root, dirs, files in os.walk(bdir): |
Steve Reinhardt | d725ff4 | 2008-02-05 17:40:08 -0800 | [diff] [blame] | 974 | if 'SConsopts' in files: |
Gabe Black | f8ac16b | 2011-07-19 02:56:02 -0700 | [diff] [blame] | 975 | if GetOption('verbose'): |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 976 | print("Reading", joinpath(root, 'SConsopts')) |
Steve Reinhardt | b96631e | 2008-02-05 17:43:45 -0800 | [diff] [blame] | 977 | SConscript(joinpath(root, 'SConsopts')) |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 978 | |
| 979 | all_isa_list.sort() |
Tony Gutierrez | 1a7d3f9 | 2016-01-19 14:28:22 -0500 | [diff] [blame] | 980 | all_gpu_isa_list.sort() |
Nathan Binkert | 1aef5c0 | 2007-03-10 23:00:54 -0800 | [diff] [blame] | 981 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 982 | sticky_vars.AddVariables( |
Giacomo Travaglini | 7ce081d | 2020-06-04 10:34:41 +0100 | [diff] [blame] | 983 | EnumVariable('TARGET_ISA', 'Target ISA', 'null', all_isa_list), |
Tony Gutierrez | 9d51dec | 2018-05-01 17:34:29 -0400 | [diff] [blame] | 984 | EnumVariable('TARGET_GPU_ISA', 'Target GPU ISA', 'gcn3', all_gpu_isa_list), |
Nathan Binkert | f0b4259 | 2010-02-26 18:14:48 -0800 | [diff] [blame] | 985 | ListVariable('CPU_MODELS', 'CPU models', |
Giacomo Travaglini | 10b4842 | 2020-03-02 14:30:25 +0000 | [diff] [blame] | 986 | sorted(n for n,m in CpuModel.dict.items() if m.default), |
Andreas Sandberg | 326662b | 2014-09-03 07:42:22 -0400 | [diff] [blame] | 987 | sorted(CpuModel.dict.keys())), |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 988 | BoolVariable('EFENCE', 'Link with Electric Fence malloc debugger', |
| 989 | False), |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 990 | BoolVariable('USE_SSE2', |
| 991 | 'Compile for SSE2 (-msse2) to get IEEE FP on x86 hosts', |
| 992 | False), |
Nathan Binkert | 318bfe9 | 2011-01-15 07:48:25 -0800 | [diff] [blame] | 993 | BoolVariable('USE_POSIX_CLOCK', 'Use POSIX Clocks', have_posix_clock), |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 994 | BoolVariable('USE_FENV', 'Use <fenv.h> IEEE mode control', have_fenv), |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 995 | BoolVariable('USE_PNG', 'Enable support for PNG images', have_png), |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 996 | BoolVariable('USE_KVM', 'Enable hardware virtualized (KVM) CPU models', |
| 997 | have_kvm), |
Gabe Black | c58537c | 2017-06-03 07:23:05 -0700 | [diff] [blame] | 998 | BoolVariable('USE_TUNTAP', |
| 999 | 'Enable using a tap device to bridge to the host network', |
| 1000 | have_tuntap), |
Tony Gutierrez | 1a7d3f9 | 2016-01-19 14:28:22 -0500 | [diff] [blame] | 1001 | BoolVariable('BUILD_GPU', 'Build the compute-GPU model', False), |
Jason Power | aa8bcd1 | 2012-09-12 14:52:04 -0500 | [diff] [blame] | 1002 | EnumVariable('PROTOCOL', 'Coherence protocol for Ruby', 'None', |
| 1003 | all_protocols), |
Andreas Sandberg | daa53da | 2015-12-04 00:12:58 +0000 | [diff] [blame] | 1004 | EnumVariable('BACKTRACE_IMPL', 'Post-mortem dump implementation', |
John Alsop | f5cf6d5 | 2017-04-20 11:26:39 -0400 | [diff] [blame] | 1005 | backtrace_impls[-1], backtrace_impls), |
| 1006 | ('NUMBER_BITS_PER_SET', 'Max elements in set (default 64)', |
| 1007 | 64), |
Andreas Sandberg | 51d38a4 | 2016-04-22 22:26:56 +0100 | [diff] [blame] | 1008 | BoolVariable('USE_HDF5', 'Enable the HDF5 support', have_hdf5), |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1009 | ) |
| 1010 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1011 | # These variables get exported to #defines in config/*.hh (see src/SConscript). |
Gabe Black | 9d1278d | 2020-08-19 20:14:49 -0700 | [diff] [blame] | 1012 | export_vars += ['USE_FENV', 'TARGET_ISA', 'TARGET_GPU_ISA', |
Gabe Black | e01ead4 | 2020-02-04 16:19:38 -0800 | [diff] [blame] | 1013 | 'USE_POSIX_CLOCK', 'USE_KVM', 'USE_TUNTAP', 'PROTOCOL', |
| 1014 | 'HAVE_PROTOBUF', 'HAVE_VALGRIND', |
John Alsop | f5cf6d5 | 2017-04-20 11:26:39 -0400 | [diff] [blame] | 1015 | 'HAVE_PERF_ATTR_EXCLUDE_HOST', 'USE_PNG', |
Andreas Sandberg | 51d38a4 | 2016-04-22 22:26:56 +0100 | [diff] [blame] | 1016 | 'NUMBER_BITS_PER_SET', 'USE_HDF5'] |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1017 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1018 | ################################################### |
| 1019 | # |
| 1020 | # Define a SCons builder for configuration flag headers. |
| 1021 | # |
| 1022 | ################################################### |
| 1023 | |
| 1024 | # This function generates a config header file that #defines the |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1025 | # variable symbol to the current variable setting (0 or 1). The source |
| 1026 | # operands are the name of the variable and a Value node containing the |
| 1027 | # value of the variable. |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1028 | def build_config_file(target, source, env): |
Giacomo Travaglini | e06ec8c | 2020-03-02 15:16:09 +0000 | [diff] [blame] | 1029 | (variable, value) = [s.get_contents().decode('utf-8') for s in source] |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1030 | with open(str(target[0].abspath), 'w') as f: |
Giacomo Travaglini | bb95aa1 | 2020-03-02 15:08:41 +0000 | [diff] [blame] | 1031 | print('#define', variable, value, file=f) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1032 | return None |
| 1033 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1034 | # Combine the two functions into a scons Action object. |
Gabe Black | 1c68c32 | 2011-08-02 03:22:11 -0700 | [diff] [blame] | 1035 | config_action = MakeAction(build_config_file, Transform("CONFIG H", 2)) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1036 | |
| 1037 | # The emitter munges the source & target node lists to reflect what |
| 1038 | # we're really doing. |
| 1039 | def config_emitter(target, source, env): |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1040 | # extract variable name from Builder arg |
| 1041 | variable = str(target[0]) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1042 | # True target is config header file |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1043 | target = Dir('config').File(variable.lower() + '.hh') |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1044 | val = env[variable] |
Nathan Binkert | 6c6b781 | 2006-10-20 11:37:59 -0700 | [diff] [blame] | 1045 | if isinstance(val, bool): |
| 1046 | # Force value to 0/1 |
| 1047 | val = int(val) |
| 1048 | elif isinstance(val, str): |
| 1049 | val = '"' + val + '"' |
Nathan Binkert | c27e23f | 2007-07-28 16:49:20 -0700 | [diff] [blame] | 1050 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1051 | # Sources are variable name & value (packaged in SCons Value nodes) |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1052 | return [target], [Value(variable), Value(val)] |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1053 | |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1054 | config_builder = Builder(emitter=config_emitter, action=config_action) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1055 | |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 1056 | main.Append(BUILDERS = { 'ConfigFile' : config_builder }) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1057 | |
Gabe Black | 4576541 | 2017-04-28 03:57:09 -0700 | [diff] [blame] | 1058 | ################################################### |
| 1059 | # |
| 1060 | # Builders for static and shared partially linked object files. |
| 1061 | # |
| 1062 | ################################################### |
| 1063 | |
| 1064 | partial_static_builder = Builder(action=SCons.Defaults.LinkAction, |
| 1065 | src_suffix='$OBJSUFFIX', |
| 1066 | src_builder=['StaticObject', 'Object'], |
| 1067 | LINKFLAGS='$PLINKFLAGS', |
| 1068 | LIBS='') |
| 1069 | |
| 1070 | def partial_shared_emitter(target, source, env): |
| 1071 | for tgt in target: |
| 1072 | tgt.attributes.shared = 1 |
| 1073 | return (target, source) |
| 1074 | partial_shared_builder = Builder(action=SCons.Defaults.ShLinkAction, |
| 1075 | emitter=partial_shared_emitter, |
| 1076 | src_suffix='$SHOBJSUFFIX', |
| 1077 | src_builder='SharedObject', |
| 1078 | SHLINKFLAGS='$PSHLINKFLAGS', |
| 1079 | LIBS='') |
| 1080 | |
| 1081 | main.Append(BUILDERS = { 'PartialShared' : partial_shared_builder, |
| 1082 | 'PartialStatic' : partial_static_builder }) |
| 1083 | |
Gabe Black | 0a73726 | 2019-02-20 17:43:15 -0800 | [diff] [blame] | 1084 | def add_local_rpath(env, *targets): |
| 1085 | '''Set up an RPATH for a library which lives in the build directory. |
| 1086 | |
| 1087 | The construction environment variable BIN_RPATH_PREFIX should be set to |
| 1088 | the relative path of the build directory starting from the location of the |
| 1089 | binary.''' |
| 1090 | for target in targets: |
| 1091 | target = env.Entry(target) |
Gabe Black | 91195ae | 2019-03-12 05:00:41 -0700 | [diff] [blame] | 1092 | if not isinstance(target, SCons.Node.FS.Dir): |
Gabe Black | 0a73726 | 2019-02-20 17:43:15 -0800 | [diff] [blame] | 1093 | target = target.dir |
| 1094 | relpath = os.path.relpath(target.abspath, env['BUILDDIR']) |
| 1095 | components = [ |
| 1096 | '\\$$ORIGIN', |
| 1097 | '${BIN_RPATH_PREFIX}', |
| 1098 | relpath |
| 1099 | ] |
| 1100 | env.Append(RPATH=[env.Literal(os.path.join(*components))]) |
| 1101 | |
Andrea Mondelli | f59e550 | 2019-02-22 11:42:16 -0500 | [diff] [blame] | 1102 | if sys.platform != "darwin": |
| 1103 | main.Append(LINKFLAGS=Split('-z origin')) |
| 1104 | |
Gabe Black | 0a73726 | 2019-02-20 17:43:15 -0800 | [diff] [blame] | 1105 | main.AddMethod(add_local_rpath, 'AddLocalRPATH') |
| 1106 | |
Gabe Black | 4d1e147 | 2017-04-27 23:50:09 -0700 | [diff] [blame] | 1107 | # builds in ext are shared across all configs in the build root. |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1108 | ext_dir = Dir('#ext').abspath |
Gabe Black | e897c52 | 2017-05-19 16:30:45 -0700 | [diff] [blame] | 1109 | ext_build_dirs = [] |
Gabe Black | 4d1e147 | 2017-04-27 23:50:09 -0700 | [diff] [blame] | 1110 | for root, dirs, files in os.walk(ext_dir): |
| 1111 | if 'SConscript' in files: |
| 1112 | build_dir = os.path.relpath(root, ext_dir) |
Gabe Black | e897c52 | 2017-05-19 16:30:45 -0700 | [diff] [blame] | 1113 | ext_build_dirs.append(build_dir) |
Gabe Black | 4d1e147 | 2017-04-27 23:50:09 -0700 | [diff] [blame] | 1114 | main.SConscript(joinpath(root, 'SConscript'), |
| 1115 | variant_dir=joinpath(build_root, build_dir)) |
Andreas Sandberg | c274057 | 2015-07-07 10:03:13 +0100 | [diff] [blame] | 1116 | |
Ciro Santilli | 9712a63 | 2018-12-21 14:22:30 +0000 | [diff] [blame] | 1117 | gdb_xml_dir = joinpath(ext_dir, 'gdb-xml') |
| 1118 | Export('gdb_xml_dir') |
| 1119 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1120 | ################################################### |
| 1121 | # |
Gabe Black | 8ee95f3 | 2017-05-01 21:58:41 -0700 | [diff] [blame] | 1122 | # This builder and wrapper method are used to set up a directory with |
| 1123 | # switching headers. Those are headers which are in a generic location and |
| 1124 | # that include more specific headers from a directory chosen at build time |
| 1125 | # based on the current build settings. |
Gabe Black | eb4ef3a | 2006-11-07 05:33:21 -0500 | [diff] [blame] | 1126 | # |
| 1127 | ################################################### |
| 1128 | |
Gabe Black | 8ee95f3 | 2017-05-01 21:58:41 -0700 | [diff] [blame] | 1129 | def build_switching_header(target, source, env): |
| 1130 | path = str(target[0]) |
| 1131 | subdir = str(source[0]) |
| 1132 | dp, fp = os.path.split(path) |
| 1133 | dp = os.path.relpath(os.path.realpath(dp), |
| 1134 | os.path.realpath(env['BUILDDIR'])) |
| 1135 | with open(path, 'w') as hdr: |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1136 | print('#include "%s/%s/%s"' % (dp, subdir, fp), file=hdr) |
Gabe Black | eb4ef3a | 2006-11-07 05:33:21 -0500 | [diff] [blame] | 1137 | |
Gabe Black | 8ee95f3 | 2017-05-01 21:58:41 -0700 | [diff] [blame] | 1138 | switching_header_action = MakeAction(build_switching_header, |
| 1139 | Transform('GENERATE')) |
Curtis Dunham | fe27f93 | 2014-05-09 18:58:47 -0400 | [diff] [blame] | 1140 | |
Gabe Black | 8ee95f3 | 2017-05-01 21:58:41 -0700 | [diff] [blame] | 1141 | switching_header_builder = Builder(action=switching_header_action, |
| 1142 | source_factory=Value, |
| 1143 | single_source=True) |
| 1144 | |
| 1145 | main.Append(BUILDERS = { 'SwitchingHeader': switching_header_builder }) |
| 1146 | |
| 1147 | def switching_headers(self, headers, source): |
| 1148 | for header in headers: |
| 1149 | self.SwitchingHeader(header, source) |
| 1150 | |
| 1151 | main.AddMethod(switching_headers, 'SwitchingHeaders') |
Gabe Black | eb4ef3a | 2006-11-07 05:33:21 -0500 | [diff] [blame] | 1152 | |
| 1153 | ################################################### |
| 1154 | # |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1155 | # Define build environments for selected configurations. |
| 1156 | # |
| 1157 | ################################################### |
| 1158 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1159 | for variant_path in variant_paths: |
Curtis Dunham | a3d582f | 2014-03-23 11:11:51 -0400 | [diff] [blame] | 1160 | if not GetOption('silent'): |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1161 | print("Building in", variant_path) |
Steve Reinhardt | 476a2ee | 2008-02-11 07:47:44 -0800 | [diff] [blame] | 1162 | |
| 1163 | # Make a copy of the build-root environment to use for this config. |
Nathan Binkert | 05d8c9a | 2009-04-21 17:17:16 -0700 | [diff] [blame] | 1164 | env = main.Clone() |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1165 | env['BUILDDIR'] = variant_path |
Nathan Binkert | 19c01e8 | 2007-07-25 18:21:11 -0700 | [diff] [blame] | 1166 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1167 | # variant_dir is the tail component of build path, and is used to |
Gabe Black | bc8d492 | 2020-02-17 02:26:05 -0800 | [diff] [blame] | 1168 | # determine the build parameters (e.g., 'X86') |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1169 | (build_root, variant_dir) = splitpath(variant_path) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1170 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1171 | # Set env variables according to the build directory config. |
| 1172 | sticky_vars.files = [] |
| 1173 | # Variables for $BUILD_ROOT/$VARIANT_DIR are stored in |
| 1174 | # $BUILD_ROOT/variables/$VARIANT_DIR so you can nuke |
| 1175 | # $BUILD_ROOT/$VARIANT_DIR without losing your variables settings. |
| 1176 | current_vars_file = joinpath(build_root, 'variables', variant_dir) |
| 1177 | if isfile(current_vars_file): |
| 1178 | sticky_vars.files.append(current_vars_file) |
Curtis Dunham | a3d582f | 2014-03-23 11:11:51 -0400 | [diff] [blame] | 1179 | if not GetOption('silent'): |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1180 | print("Using saved variables file %s" % current_vars_file) |
Gabe Black | e897c52 | 2017-05-19 16:30:45 -0700 | [diff] [blame] | 1181 | elif variant_dir in ext_build_dirs: |
| 1182 | # Things in ext are built without a variant directory. |
| 1183 | continue |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1184 | else: |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1185 | # Build dir-specific variables file doesn't exist. |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1186 | |
| 1187 | # Make sure the directory is there so we can create it later |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1188 | opt_dir = dirname(current_vars_file) |
Steve Reinhardt | b96631e | 2008-02-05 17:43:45 -0800 | [diff] [blame] | 1189 | if not isdir(opt_dir): |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1190 | mkdir(opt_dir) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1191 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1192 | # Get default build variables from source tree. Variables are |
| 1193 | # normally determined by name of $VARIANT_DIR, but can be |
Steve Reinhardt | f713af9 | 2011-05-02 12:40:31 -0700 | [diff] [blame] | 1194 | # overridden by '--default=' arg on command line. |
Gabe Black | fa44812 | 2011-03-03 23:54:31 -0800 | [diff] [blame] | 1195 | default = GetOption('default') |
Gabe Black | a4e5d2c | 2020-12-18 09:40:09 -0800 | [diff] [blame] | 1196 | opts_dir = Dir('#build_opts').abspath |
Steve Reinhardt | f713af9 | 2011-05-02 12:40:31 -0700 | [diff] [blame] | 1197 | if default: |
| 1198 | default_vars_files = [joinpath(build_root, 'variables', default), |
| 1199 | joinpath(opts_dir, default)] |
| 1200 | else: |
| 1201 | default_vars_files = [joinpath(opts_dir, variant_dir)] |
Giacomo Travaglini | 10b4842 | 2020-03-02 14:30:25 +0000 | [diff] [blame] | 1202 | existing_files = list(filter(isfile, default_vars_files)) |
Steve Reinhardt | f713af9 | 2011-05-02 12:40:31 -0700 | [diff] [blame] | 1203 | if existing_files: |
| 1204 | default_vars_file = existing_files[0] |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1205 | sticky_vars.files.append(default_vars_file) |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1206 | print("Variables file %s not found,\n using defaults in %s" |
| 1207 | % (current_vars_file, default_vars_file)) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1208 | else: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1209 | error("Cannot find variables file %s or default file(s) %s" |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1210 | % (current_vars_file, ' or '.join(default_vars_files))) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1211 | Exit(1) |
| 1212 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1213 | # Apply current variable settings to env |
| 1214 | sticky_vars.Update(env) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1215 | |
Gabe Black | 08ab457 | 2020-08-03 21:38:55 -0700 | [diff] [blame] | 1216 | Help(''' |
| 1217 | Build variables for {dir}: |
| 1218 | {help} |
| 1219 | '''.format(dir=variant_dir, help=sticky_vars.GenerateHelpText(env)), |
| 1220 | append=True) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1221 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1222 | # Process variable settings. |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1223 | |
| 1224 | if not have_fenv and env['USE_FENV']: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1225 | warning("<fenv.h> not available; forcing USE_FENV to False in", |
| 1226 | variant_dir + ".") |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1227 | env['USE_FENV'] = False |
| 1228 | |
| 1229 | if not env['USE_FENV']: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1230 | warning("No IEEE FP rounding mode control in", variant_dir + ".\n" |
| 1231 | "FP results may deviate slightly from other platforms.") |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1232 | |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 1233 | if not have_png and env['USE_PNG']: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1234 | warning("<png.h> not available; forcing USE_PNG to False in", |
| 1235 | variant_dir + ".") |
Giacomo Travaglini | 12fb1ca | 2017-09-28 13:01:08 +0100 | [diff] [blame] | 1236 | env['USE_PNG'] = False |
| 1237 | |
| 1238 | if env['USE_PNG']: |
| 1239 | env.Append(LIBS=['png']) |
| 1240 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1241 | if env['EFENCE']: |
| 1242 | env.Append(LIBS=['efence']) |
| 1243 | |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 1244 | if env['USE_KVM']: |
| 1245 | if not have_kvm: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1246 | warning("Can not enable KVM, host seems to lack KVM support") |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 1247 | env['USE_KVM'] = False |
| 1248 | elif not is_isa_kvm_compatible(env['TARGET_ISA']): |
Gabe Black | 0bb50e6 | 2018-03-05 22:05:47 -0800 | [diff] [blame] | 1249 | print("Info: KVM support disabled due to unsupported host and " |
| 1250 | "target ISA combination") |
Andreas Sandberg | f485ad1 | 2013-04-22 13:20:32 -0400 | [diff] [blame] | 1251 | env['USE_KVM'] = False |
| 1252 | |
Gabe Black | c58537c | 2017-06-03 07:23:05 -0700 | [diff] [blame] | 1253 | if env['USE_TUNTAP']: |
| 1254 | if not have_tuntap: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1255 | warning("Can't connect EtherTap with a tap device.") |
Gabe Black | c58537c | 2017-06-03 07:23:05 -0700 | [diff] [blame] | 1256 | env['USE_TUNTAP'] = False |
| 1257 | |
Tony Gutierrez | 1961a94 | 2017-01-19 11:59:34 -0500 | [diff] [blame] | 1258 | if env['BUILD_GPU']: |
| 1259 | env.Append(CPPDEFINES=['BUILD_GPU']) |
| 1260 | |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 1261 | # Warn about missing optional functionality |
| 1262 | if env['USE_KVM']: |
| 1263 | if not main['HAVE_PERF_ATTR_EXCLUDE_HOST']: |
Gabe Black | 8028348 | 2019-11-18 17:41:49 -0800 | [diff] [blame] | 1264 | warning("perf_event headers lack support for the exclude_host " |
| 1265 | "attribute. KVM instruction counts will be inaccurate.") |
Andreas Sandberg | 4b8be6a | 2013-10-15 10:09:23 +0200 | [diff] [blame] | 1266 | |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1267 | # Save sticky variable settings back to current variables file |
| 1268 | sticky_vars.Save(current_vars_file, env) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1269 | |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1270 | if env['USE_SSE2']: |
Gabe Black | 14b27fc | 2010-11-09 11:03:40 -0800 | [diff] [blame] | 1271 | env.Append(CCFLAGS=['-msse2']) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1272 | |
Ciro Santilli | ec50225 | 2019-05-21 13:19:24 +0100 | [diff] [blame] | 1273 | env.Append(CCFLAGS='$CCFLAGS_EXTRA') |
| 1274 | env.Append(LINKFLAGS='$LDFLAGS_EXTRA') |
| 1275 | |
Steve Reinhardt | 7efd0ea | 2006-06-17 09:26:08 -0400 | [diff] [blame] | 1276 | # The src/SConscript file sets up the build rules in 'env' according |
Nathan Binkert | dd6ea87 | 2009-02-09 20:10:14 -0800 | [diff] [blame] | 1277 | # to the configured variables. It returns a list of environments, |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1278 | # one for each variant build (debug, opt, etc.) |
Nikos Nikoleris | a0414b5 | 2020-04-30 17:33:13 +0100 | [diff] [blame] | 1279 | SConscript('src/SConscript', variant_dir=variant_path, |
Giacomo Travaglini | a1b6471 | 2020-06-04 12:45:52 +0100 | [diff] [blame] | 1280 | exports=['env', 'marshal_env']) |
Steve Reinhardt | ba2eae5 | 2006-05-22 14:29:33 -0400 | [diff] [blame] | 1281 | |
Gabe Black | 1c59559 | 2020-03-26 04:48:53 -0700 | [diff] [blame] | 1282 | atexit.register(summarize_warnings) |