#!/usr/bin/env python3

#
# Copyright (C) 2013-2019 Christoph Sommer <sommer@ccs-labs.org>
#
# Documentation for these modules is at http://veins.car2x.org/
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

"""
Creates Makefile(s) for building this project.
"""

import os
import sys
import subprocess
import logging
from logging import info, warning, error
from optparse import OptionParser

# check python version
if sys.version_info[0] < 3:
    warning("Warning: running configure with Python 2 might result in subtle errors.")

# pretty-print version
def version_to_hr(v):
    s = '"%s"' % v.decode(errors='replace')
    return(s)

# pretty-print list of versions
def versions_to_hr(vv):
    s = ' or '.join([version_to_hr(v) for v in vv])
    return(s)

# Option handling
parser = OptionParser()
parser.add_option("-v", "--verbose", dest="count_verbose", default=0, action="count", help="increase verbosity [default: don't log infos, debug]")
parser.add_option("-q", "--quiet", dest="count_quiet", default=0, action="count", help="decrease verbosity [default: log warnings, errors]")
parser.add_option("--with-veins", dest="veins", help="link with a version of Veins installed in PATH [default: ../..]", metavar="PATH", default="../..")
(options, args) = parser.parse_args()

_LOGLEVELS = (logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG)
loglevel = _LOGLEVELS[max(0, min(1 + options.count_verbose - options.count_quiet, len(_LOGLEVELS)-1))]
logging.basicConfig(level=loglevel)

if args:
    warning("Superfluous command line arguments: \"%s\"" % " ".join(args))


# Start with default flags
makemake_flags = ['--make-so', '-f', '--deep', '-I', '.', '-O', 'out']
run_lib_paths = []


# Add flags for Veins
if options.veins:
    fname = os.path.join(options.veins, 'print-veins-version')
    expect_version = [b'5.2']
    try:
        info('Running "%s" to determine Veins version.' % fname)
        version = subprocess.check_output(['env', fname]).strip()
        if not version in expect_version:
            warning('')
            warning('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
            warning('Unsupported Veins Version. Expecting %s, found %s' % (versions_to_hr(expect_version), version_to_hr(version)))
            warning('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
            warning('')
        else:
            info('Found Veins version %s. Okay.' % version_to_hr(version))
    except subprocess.CalledProcessError as e:
        error('Could not determine Veins Version (by running %s): %s. Check the path to Veins (--with-veins=... option) and the Veins version (should be version %s)' % (fname, e, versions_to_hr(expect_version)))
        sys.exit(1)

    veins_header_dirs = [os.path.join(os.path.relpath(options.veins, 'src'), 'src')]
    veins_includes = ['-I' + s for s in veins_header_dirs]
    veins_link = ["-L" + os.path.join(os.path.relpath(options.veins, 'src'), 'src'), "-lveins$(D)"]
    veins_defs = []

    makemake_flags += veins_includes + veins_link + veins_defs
    run_lib_paths = [os.path.relpath(os.path.join(options.veins, 'src'))] + run_lib_paths


# Start creating files
if not os.path.isdir('out'):
    os.mkdir('out')

f = open(os.path.join('out', 'config.py'), 'w')
f.write('run_lib_paths = %s\n' % repr(run_lib_paths))
f.close()

subprocess.check_call(['env', 'opp_makemake'] + makemake_flags, cwd='src')

info('Configure done. You can now run "make".')
