You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.7 KiB
202 lines
6.7 KiB
#!/usr/bin/env python3
|
|
#
|
|
# Copyright 2017 - The Android Open Source Project
|
|
#
|
|
# 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 shutil
|
|
import subprocess
|
|
import sys
|
|
from distutils import cmd
|
|
from distutils import log
|
|
|
|
import setuptools
|
|
from setuptools.command.develop import develop
|
|
from setuptools.command.install import install
|
|
|
|
FRAMEWORK_DIR = 'acts_framework'
|
|
LOCAL_FRAMEWORK_DIR = '../acts/framework'
|
|
|
|
acts_tests_dir = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
install_requires = []
|
|
|
|
|
|
|
|
def _setup_acts_framework(option, *args):
|
|
"""Locates and runs setup.py for the ACTS framework.
|
|
|
|
Args:
|
|
option: the option to use with setup.py, e.g. install, develop
|
|
args: additional args for the command
|
|
"""
|
|
acts_framework_dir = os.path.join(acts_tests_dir, FRAMEWORK_DIR)
|
|
if not os.path.isdir(acts_framework_dir):
|
|
log.info('Directory "%s" not found. Attempting to locate ACTS '
|
|
'framework through local repository.' % acts_framework_dir)
|
|
acts_framework_dir = os.path.join(acts_tests_dir, LOCAL_FRAMEWORK_DIR)
|
|
if not os.path.isdir(acts_framework_dir):
|
|
log.error('Cannot install ACTS framework. Framework dir "%s" not '
|
|
'found.' % acts_framework_dir)
|
|
exit(1)
|
|
acts_setup_bin = os.path.join(acts_framework_dir, 'setup.py')
|
|
if not os.path.isfile(acts_setup_bin):
|
|
log.error('Cannot install ACTS framework. Setup script not found.')
|
|
exit(1)
|
|
command = [sys.executable, acts_setup_bin, option, *args]
|
|
subprocess.check_call(command, cwd=acts_framework_dir)
|
|
|
|
|
|
class ActsContribInstall(install):
|
|
"""Custom installation of the acts_contrib package.
|
|
|
|
Also installs the required ACTS framework via its own setup.py script.
|
|
|
|
The installation requires the ACTS framework to exist under the
|
|
"acts_framework" directory, at the same level of this setup script.
|
|
Otherwise, it will attempt to locate the ACTS framework from the local
|
|
repository.
|
|
"""
|
|
def run(self):
|
|
super().run()
|
|
_setup_acts_framework('install')
|
|
|
|
|
|
class ActsContribDevelop(develop):
|
|
"""Custom installation of the acts_contrib package (in develop mode).
|
|
|
|
See ActsContribInstall for more details.
|
|
"""
|
|
def run(self):
|
|
super().run()
|
|
if self.uninstall:
|
|
_setup_acts_framework('develop', '-u')
|
|
else:
|
|
_setup_acts_framework('develop')
|
|
|
|
|
|
class ActsContribInstallDependencies(cmd.Command):
|
|
"""Installs only required packages
|
|
|
|
Installs all required packages for acts_contrib to work. Rather than using
|
|
the normal install system which creates links with the python egg, pip is
|
|
used to install the packages.
|
|
"""
|
|
|
|
description = 'Install dependencies needed for acts_contrib packages.'
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
install_args = [sys.executable, '-m', 'pip', 'install']
|
|
subprocess.check_call(install_args + ['--upgrade', 'pip'])
|
|
required_packages = self.distribution.install_requires
|
|
|
|
for package in required_packages:
|
|
self.announce('Installing %s...' % package, log.INFO)
|
|
subprocess.check_call(install_args +
|
|
['-v', '--no-cache-dir', package])
|
|
|
|
self.announce('Dependencies installed.')
|
|
|
|
|
|
class ActsContribUninstall(cmd.Command):
|
|
"""acts_contrib uninstaller.
|
|
|
|
Uninstalls acts_contrib from the current version of python. This will
|
|
attempt to import acts_contrib from any of the python egg locations. If it
|
|
finds an import it will use the modules file location to delete it. This is
|
|
repeated until acts_contrib can no longer be imported and thus is
|
|
uninstalled.
|
|
"""
|
|
|
|
description = 'Uninstall acts_contrib from the local machine.'
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def uninstall_acts_contrib_module(self, acts_contrib_module):
|
|
"""Uninstalls acts_contrib from a module.
|
|
|
|
Args:
|
|
acts_contrib_module: The acts_contrib module to uninstall.
|
|
"""
|
|
for acts_contrib_install_dir in acts_contrib_module.__path__:
|
|
self.announce('Deleting acts_contrib from: %s'
|
|
% acts_contrib_install_dir, log.INFO)
|
|
shutil.rmtree(acts_contrib_install_dir)
|
|
|
|
def run(self):
|
|
"""Entry point for the uninstaller."""
|
|
# Remove the working directory from the python path. This ensures that
|
|
# Source code is not accidentally targeted.
|
|
our_dir = os.path.abspath(os.path.dirname(__file__))
|
|
if our_dir in sys.path:
|
|
sys.path.remove(our_dir)
|
|
|
|
if os.getcwd() in sys.path:
|
|
sys.path.remove(os.getcwd())
|
|
|
|
try:
|
|
import acts_contrib as acts_contrib_module
|
|
except ImportError:
|
|
self.announce('acts_contrib is not installed, nothing to uninstall.',
|
|
level=log.ERROR)
|
|
return
|
|
|
|
while acts_contrib_module:
|
|
self.uninstall_acts_contrib_module(acts_contrib_module)
|
|
try:
|
|
del sys.modules['acts_contrib']
|
|
import acts_contrib as acts_contrib_module
|
|
except ImportError:
|
|
acts_contrib_module = None
|
|
|
|
self.announce('Finished uninstalling acts_contrib.')
|
|
|
|
# Uninstall the ACTS framework
|
|
_setup_acts_framework('uninstall')
|
|
|
|
|
|
def main():
|
|
os.chdir(acts_tests_dir)
|
|
packages = setuptools.find_packages(include=('acts_contrib*',))
|
|
setuptools.setup(name='acts_contrib',
|
|
version='0.9',
|
|
description='Android Comms Test Suite',
|
|
license='Apache2.0',
|
|
packages=packages,
|
|
include_package_data=True,
|
|
install_requires=install_requires,
|
|
cmdclass={
|
|
'install': ActsContribInstall,
|
|
'develop': ActsContribDevelop,
|
|
'install_deps': ActsContribInstallDependencies,
|
|
'uninstall': ActsContribUninstall
|
|
},
|
|
url="http://www.android.com/")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|