#!/usr/bin/env python import os import re import shutil import subprocess import sys from setuptools import setup from distutils.command.clean import clean as _clean from distutils.command.build_py import build_py_2to3 as _build_py # @brief Creates Protobuf python files to encode and decode messages # @param[in] source The protobuf source file def generateProtobuf(source): output = source.replace('.proto', '_pb2.py').replace('src/protobuf/', 'aman/com/') if (not os.path.exists(output) or (os.path.exists(source) and os.path.getmtime(source) > os.path.getmtime(output))): print('Generating %s...' % output) if not os.path.exists(source): sys.stderr.write('Cannot find %s' % source) sys.exit(-1) if not os.path.exists('external/bin/protoc.exe'): sys.stderr.write('Cannot find proto-compiler') sys.exit(-1) command = [ 'external/bin/protoc.exe', '-Isrc/protobuf/', '-I.', '--python_out=aman/com/', source] if 0 != subprocess.call(command): sys.exit(-1) # check if we need to replace some import commands replaced = False content = open(output, 'r').read() for entry in re.findall('import.[A-Z].*.as.*', content): content = content.replace(entry, 'from . ' + entry) replaced = True # update the content if replaced: with open(output, 'w') as file: file.write(content) # @brief Cleans up all auto-generated files and folders # @param[in] _clean Instance of setuptools to clean up the system class clean(_clean): def run(self): for (dirpath, dirnames, filenames) in os.walk('.'): for filename in filenames: filepath = os.path.join(dirpath, filename) if filepath.endswith('_pb2.py') or filepath.endswith('.pyc'): os.remove(filepath) for dirname in dirnames: if 'Arrival_MANager.egg-info' == dirname or 'build' == dirname or 'dist' == dirname or '__pycache__' == dirname: shutil.rmtree(os.path.join(dirpath, dirname)) _clean.run(self) # @brief Generates the python files and folders to set up the development/runtime environment # @param[in] _build_py Instance of setuptools to build the system class build_py(_build_py): def run(self): generateProtobuf('src/protobuf/Aircraft.proto') generateProtobuf('src/protobuf/AircraftReport.proto') generateProtobuf('src/protobuf/AircraftSchedule.proto') generateProtobuf('src/protobuf/BaseTypes.proto') generateProtobuf('src/protobuf/Communication.proto') _build_py.run(self) with open('README.md', 'r') as f: longDescription = f.read() setup( name = 'Arrival MANager', version = '0.1.0', packages = [ 'aman', 'aman.com', 'aman.config', 'aman.formats', 'aman.sys', 'aman.sys.aco', 'aman.tools', 'aman.types' ], namespace_packages = [ 'aman' ], description = 'AMAN optimization backend', long_description = longDescription, author = 'Sven Czarnian, Pascal Seeler', author_email = 'devel@svcz.de', license = 'GPLv3', cmdclass = { 'clean': clean, 'build_py': build_py }, install_requires=[ 'argparse', 'bs4', 'configparser', 'numpy', 'protobuf', 'pyzmq', 'scipy', 'setuptools', 'flask', 'flask-cors' ] )