#!/usr/bin/env python3

# Copyright 2016 The Meson development team

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import sys

from mesonbuild.coredata import version

if sys.version_info < (3, 5, 0):
    print('Tried to install with an unsupported version of Python. '
          'Meson requires Python 3.5.0 or greater')
    sys.exit(1)

# We need to support Python installations that have nothing but the basic
# Python installation. Use setuptools when possible and fall back to
# plain distutils when setuptools is not available.
try:
    from setuptools import setup
    from setuptools.command.install_scripts import install_scripts as orig
except ImportError:
    from distutils.core import setup
    from distutils.command.install_scripts import install_scripts as orig

class install_scripts(orig):
    def run(self):
        if sys.platform == 'win32':
            super().run()
            return

        if not self.skip_build:
            self.run_command('build_scripts')
        self.outfiles = []
        if not self.dry_run:
            self.mkpath(self.install_dir)

        # We want the files to be installed without a suffix on Unix
        for infile in self.get_inputs():
            infile = os.path.basename(infile)
            in_built = os.path.join(self.build_dir, infile)
            in_stripped = infile[:-3] if infile.endswith('.py') else infile
            outfile = os.path.join(self.install_dir, in_stripped)
            # NOTE: Mode is preserved by default
            self.copy_file(in_built, outfile)
            self.outfiles.append(outfile)

setup(name='meson',
      version=version,
      description='A high performance build system',
      author='Jussi Pakkanen',
      author_email='jpakkane@gmail.com',
      url='http://mesonbuild.com',
      license=' Apache License, Version 2.0',
      python_requires='>=3.5',
      packages=['mesonbuild',
                'mesonbuild.backend',
                'mesonbuild.compilers',
                'mesonbuild.dependencies',
                'mesonbuild.modules',
                'mesonbuild.scripts',
                'mesonbuild.wrap'],
      scripts=['meson.py',
               'mesonconf.py',
               'mesontest.py',
               'mesonintrospect.py',
               'wraptool.py'],
      cmdclass={'install_scripts': install_scripts},
      data_files=[('share/man/man1', ['man/meson.1',
                                      'man/mesonconf.1',
                                      'man/mesonintrospect.1',
                                      'man/mesontest.1',
                                      'man/wraptool.1'])],
      classifiers=['Development Status :: 5 - Production/Stable',
                   'Environment :: Console',
                   'Intended Audience :: Developers',
                   'License :: OSI Approved :: Apache Software License',
                   'Natural Language :: English',
                   'Operating System :: MacOS :: MacOS X',
                   'Operating System :: Microsoft :: Windows',
                   'Operating System :: POSIX :: BSD',
                   'Operating System :: POSIX :: Linux',
                   'Programming Language :: Python :: 3 :: Only',
                   'Topic :: Software Development :: Build Tools',
                   ],
      long_description='''Meson is a cross-platform build system designed to be both as
fast and as user friendly as possible. It supports many languages and compilers, including
GCC, Clang and Visual Studio. Its build definitions are written in a simple non-turing
complete DSL.''')
