#!/usr/bin/env ${PY_STRING}
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#

from distutils.core import setup
from distutils.command.build_py import build_py
from distutils.file_util import copy_file
from os.path import join
from os import environ

"""Install public packages and scripts for Qpid Dispatch."""

class BuildPy(build_py):
    """Extend standard build command, add generated modules from binary directory."""

    MODULES = ['qpid_dispatch_site.py']

    def run(self):
        build_py.run(self)      # Run the standard build, copies source .py files into builddir
        for m in self.MODULES:
            copy_file(join('${CMAKE_CURRENT_BINARY_DIR}', m), join(self.build_lib, m))

    def get_outputs(self, **kwargs):
        return build_py.get_outputs(self, **kwargs) + [join(self.build_lib, m) for m in self.MODULES]

options={}
destdir = environ.get("DESTDIR")
if destdir:
    options["install"] = {"root": destdir}

setup(
    options=options,

    name='qpid_dispatch',
    description='Apache Qpid Dispatch tools and libraries.',
    package_dir={'' : '${CMAKE_SOURCE_DIR}/python'},
    packages=['qpid_dispatch', 'qpid_dispatch.management'],
    package_data={'qpid_dispatch.management': ['*.json']},
    cmdclass={'build_py': BuildPy},

    version='${QPID_DISPATCH_VERSION}',
    author='Apache Qpid',
    author_email='dev@qpid.apache.org',
    url='http://qpid.apache.org/',
    license='Apache Software License'
)
