# 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')
