#!/usr/bin/env python3
# -*- Mode: Python -*-
# GObject-Introspection - a framework for introspecting GObject libraries
# Copyright (C) 2008  Johan Dahlin
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#

import os
import sys
import sysconfig
import builtins


debug = os.getenv('GI_SCANNER_DEBUG')
if debug:
    if 'pydevd' in debug.split(','):
        # http://pydev.org/manual_adv_remote_debugger.html
        pydevdpath = os.getenv('PYDEVDPATH', None)
        if pydevdpath is not None and os.path.isdir(pydevdpath):
            sys.path.insert(0, pydevdpath)
            import pydevd
            pydevd.settrace()
    else:
        def on_exception(exctype, value, tb):
            print("Caught exception: %r %r" % (exctype, value))
            import pdb
            pdb.pm()
        sys.excepthook = on_exception

# Detect and set datadir, pylibdir, etc as applicable
# Similar to the method used in gdbus-codegen
filedir = os.path.dirname(__file__)

# Try using relative paths first so that the installation prefix is relocatable
datadir = os.path.abspath(os.path.join(filedir, '..', 'share'))
# Fallback to hard-coded paths if the relocatable paths are wrong
if not os.path.isdir(os.path.join(datadir, 'gir-1.0')):
    datadir = "/usr/share"

builtins.__dict__['DATADIR'] = datadir

gir_dir = os.path.abspath(os.path.join(filedir, '..', 'share', 'gir-1.0'))
# Fallback to hard-coded paths if the relocatable paths are wrong
if not os.path.isdir(gir_dir):
    gir_dir = "/usr/share/gir-1.0"

builtins.__dict__['GIR_DIR'] = gir_dir

# Again, relative paths first so that the installation prefix is relocatable
pylibdir = os.path.abspath(os.path.join(filedir, '..', 'lib', 'gobject-introspection'))

# EXT_SUFFIX for py3 SO for py2
py_mod_suffix = sysconfig.get_config_var('EXT_SUFFIX') or sysconfig.get_config_var('SO')

if not os.path.isfile(os.path.join(pylibdir, 'giscanner', '_giscanner' + py_mod_suffix)):
    # Running uninstalled?
    builddir = os.getenv('UNINSTALLED_INTROSPECTION_BUILDDIR', None)
    if builddir is not None:
        # Autotools, most likely
        builddir = os.path.abspath(builddir)
        # For _giscanner.so
        sys.path.insert(0, os.path.join(builddir, '.libs'))
        srcdir = os.getenv('UNINSTALLED_INTROSPECTION_SRCDIR', None)
        if srcdir:
            # For the giscanner python files
            pylibdir = srcdir
    elif os.path.isdir(os.path.join(filedir, '..', 'giscanner')):
        # We're running uninstalled inside meson
        builddir = os.path.abspath(os.path.join(filedir, '..'))
        pylibdir = builddir

        if 'GI_GIR_PATH' not in os.environ:
            os.environ['GI_GIR_PATH'] = os.path.join(filedir, os.pardir, 'gir')

        gdump_path = os.path.join(builddir, 'giscanner', 'gdump.c')
        if os.path.isfile(gdump_path):
            builtins.__dict__['GDUMP_PATH'] = gdump_path
    else:
        # Okay, we're not running uninstalled and the prefix is not
        # relocatable. Use hard-coded libdir.
        pylibdir = os.path.join('/usr/lib', 'gobject-introspection')

sys.path.insert(0, pylibdir)

from giscanner.utils import dll_dirs
dll_dirs = dll_dirs()
dll_dirs.add_dll_dirs(['gio-2.0'])

def get_rspfile_args(rspfile):
    '''
    Response files are useful on Windows where there is a command-line character
    limit of 8191 because when passing sources as arguments to glib-mkenums this
    limit can be exceeded in large codebases.

    There is no specification for response files and each tool that supports it
    generally writes them out in slightly different ways, but some sources are:
    https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-response-files
    https://docs.microsoft.com/en-us/windows/desktop/midl/the-response-file-command
    '''
    import shlex
    if not os.path.isfile(rspfile):
        sys.exit('Response file {!r} does not exist'.format(rspfile))
    try:
        with open(rspfile, 'r') as f:
            cmdline = f.read()
    except OSError as e:
        sys.exit('Response file {!r} could not be read: {}'
                 .format(rspfile, e.strerror))
    return shlex.split(cmdline)


# Support reading an rspfile of the form @filename which contains the args
# to be parsed
if sys.argv[-1].startswith('@'):
    args = sys.argv[0:-1] + get_rspfile_args(sys.argv[-1][1:])
else:
    args = sys.argv

from giscanner.scannermain import scanner_main
sys.exit(scanner_main(args))
