| # Copyright 2020 Google, Inc. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer; |
| # redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution; |
| # neither the name of the copyright holders nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| Import('*') |
| |
| from gem5_scons import warning |
| from gem5_scons.util import readCommand, compareVersions |
| |
| import gem5_scons |
| |
| with gem5_scons.Configure(main) as conf: |
| # Check for the protobuf compiler |
| conf.env['HAVE_PROTOC'] = False |
| protoc_version = [] |
| try: |
| protoc_version = readCommand([main['PROTOC'], '--version']).split() |
| except Exception as e: |
| warning('While checking protoc version:', str(e)) |
| |
| # Based on the availability of the compress stream wrappers, require 2.1.0. |
| min_protoc_version = '2.1.0' |
| |
| # First two words should be "libprotoc x.y.z" |
| if len(protoc_version) < 2 or protoc_version[0] != 'libprotoc': |
| warning('Protocol buffer compiler (protoc) not found.\n' |
| 'Please install protobuf-compiler for tracing support.') |
| elif compareVersions(protoc_version[1], min_protoc_version) < 0: |
| warning('protoc version', min_protoc_version, 'or newer required.\n' |
| 'Installed version:', protoc_version[1]) |
| else: |
| # Attempt to determine the appropriate include path and |
| # library path using pkg-config, that means we also need to |
| # check for pkg-config. Note that it is possible to use |
| # protobuf without the involvement of pkg-config. Later on we |
| # check go a library config check and at that point the test |
| # will fail if libprotobuf cannot be found. |
| if conf.env['HAVE_PKG_CONFIG']: |
| conf.CheckPkgConfig('protobuf', '--cflags', '--libs-only-L') |
| conf.env['HAVE_PROTOC'] = True |
| |
| # If we have the protobuf compiler, also make sure we have the |
| # development libraries. If the check passes, libprotobuf will be |
| # automatically added to the LIBS environment variable. After |
| # this, we can use the HAVE_PROTOBUF flag to determine if we have |
| # got both protoc and libprotobuf available. |
| conf.env['CONF']['HAVE_PROTOBUF'] = conf.env['HAVE_PROTOC'] and \ |
| conf.CheckLibWithHeader('protobuf', 'google/protobuf/message.h', |
| 'C++', 'GOOGLE_PROTOBUF_VERIFY_VERSION;') |
| |
| # If we have the compiler but not the library, print another warning. |
| if main['HAVE_PROTOC'] and not main['CONF']['HAVE_PROTOBUF']: |
| warning('Did not find protocol buffer library and/or headers.\n' |
| 'Please install libprotobuf-dev for tracing support.') |
| |
| if main['CONF']['HAVE_PROTOBUF']: |
| main.TagImplies('protobuf', 'gem5 lib') |
| # protoc relies on the fact that undefined preprocessor symbols are |
| # explanded to 0 but since we use -Wundef they end up generating |
| # warnings. |
| main.Append(CCFLAGS='-DPROTOBUF_INLINE_NOT_IN_HEADERS=0') |