123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- from __future__ import absolute_import, print_function
- from setuptools.command.build_py import build_py
- # Work around mbcs bug in distutils.
- # http://bugs.python.org/issue10945
- import codecs
- try:
- codecs.lookup('mbcs')
- except LookupError:
- ascii = codecs.lookup('ascii')
- func = lambda name, enc=ascii: {True: enc}.get(name=='mbcs')
- codecs.register(func)
- from setuptools import setup, Extension
- import glob, os, shutil, fnmatch, platform, sys
- version = '2.3.7'
- def generate_content():
- # generate the file content...
- from generator import mavgen, mavparse
- # path to message_definitions directory
- if os.getenv("MDEF",None) is not None:
- mdef_paths = [os.getenv("MDEF")]
- else:
- mdef_paths = [os.path.join('..', 'message_definitions'),
- os.path.join('mavlink', 'message_definitions'),
- os.path.join('..', 'mavlink', 'message_definitions'),
- os.path.join('message_definitions'),
- ]
- for path in mdef_paths:
- mdef_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), path)
- if os.path.exists(mdef_path):
- print("Using message definitions from %s" % mdef_path)
- break
- dialects_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'dialects')
- v10_dialects = glob.glob(os.path.join(mdef_path, 'v1.0', '*.xml'))
- # for now v2.0 uses same XML files as v1.0
- v20_dialects = glob.glob(os.path.join(mdef_path, 'v1.0', '*.xml'))
- should_generate = not "NOGEN" in os.environ
- if should_generate:
- if len(v10_dialects) == 0:
- print("No XML message definitions found")
- sys.exit(1)
- for xml in v10_dialects:
- shutil.copy(xml, os.path.join(dialects_path, 'v10'))
- for xml in v20_dialects:
- shutil.copy(xml, os.path.join(dialects_path, 'v20'))
- for xml in v10_dialects:
- dialect = os.path.basename(xml)[:-4]
- wildcard = os.getenv("MAVLINK_DIALECT",'*')
- if not fnmatch.fnmatch(dialect, wildcard):
- continue
- print("Building %s for protocol 1.0" % xml)
- if not mavgen.mavgen_python_dialect(dialect, mavparse.PROTOCOL_1_0):
- print("Building failed %s for protocol 1.0" % xml)
- sys.exit(1)
- for xml in v20_dialects:
- dialect = os.path.basename(xml)[:-4]
- wildcard = os.getenv("MAVLINK_DIALECT",'*')
- if not fnmatch.fnmatch(dialect, wildcard):
- continue
- print("Building %s for protocol 2.0" % xml)
- if not mavgen.mavgen_python_dialect(dialect, mavparse.PROTOCOL_2_0):
- print("Building failed %s for protocol 2.0" % xml)
- sys.exit(1)
- extensions = [] # Assume we might be unable to build native code
- if platform.system() != 'Windows':
- extensions = [ Extension('mavnative',
- sources=['mavnative/mavnative.c'],
- include_dirs=[
- 'generator/C/include_v1.0',
- 'generator/C/include_v2.0',
- 'mavnative'
- ]
- ) ]
- else:
- print("Skipping mavnative due to Windows possibly missing a compiler...")
- class custom_build_py(build_py):
- def run(self):
- generate_content()
- # distutils uses old-style classes, so no super()
- build_py.run(self)
- setup (name = 'pymavlink',
- version = version,
- description = 'Python MAVLink code',
- long_description = ('A Python library for handling MAVLink protocol streams and log files. This allows for the '
- 'creation of simple scripts to analyse telemetry logs from autopilots such as ArduPilot which use '
- 'the MAVLink protocol. See the scripts that come with the package for examples of small, useful '
- 'scripts that use pymavlink. For more information about the MAVLink protocol see '
- 'https://mavlink.io/en/'),
- url = 'https://github.com/ArduPilot/pymavlink/',
- classifiers=['Development Status :: 4 - Beta',
- 'Environment :: Console',
- 'Intended Audience :: Science/Research',
- 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)',
- 'Operating System :: OS Independent',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3.5',
- 'Topic :: Scientific/Engineering'
- ],
- license='LGPLv3',
- package_dir = { 'pymavlink' : '.' },
- package_data = { 'pymavlink.dialects.v10' : ['*.xml'],
- 'pymavlink.dialects.v20' : ['*.xml'],
- 'pymavlink.generator' : [ '*.xsd',
- 'java/lib/*.*',
- 'java/lib/Messages/*.*',
- 'C/include_v1.0/*.h',
- 'C/include_v1.0/*.hpp',
- 'C/include_v2.0/*.h',
- 'C/include_v2.0/*.hpp',
- 'CPP11/include_v2.0/*.hpp',
- 'CS/common/*.cs',
- 'swift/*.swift',],
- 'pymavlink' : ['mavnative/*.h',
- 'message_definitions/v*/*.xml']
- },
- packages = ['pymavlink',
- 'pymavlink.generator',
- 'pymavlink.dialects',
- 'pymavlink.dialects.v10',
- 'pymavlink.dialects.v20'],
- scripts = [ 'tools/magfit_delta.py', 'tools/mavextract.py',
- 'tools/mavgraph.py', 'tools/mavparmdiff.py',
- 'tools/mavtogpx.py', 'tools/magfit_gps.py',
- 'tools/mavflightmodes.py', 'tools/mavlogdump.py',
- 'tools/mavparms.py', 'tools/magfit_motors.py',
- 'tools/mavflighttime.py', 'tools/mavloss.py',
- 'tools/mavplayback.py', 'tools/magfit.py',
- 'tools/mavgpslock.py',
- 'tools/mavmission.py',
- 'tools/mavsigloss.py',
- 'tools/mavsearch.py',
- 'tools/mavtomfile.py',
- 'tools/mavgen.py',
- 'tools/mavkml.py',
- 'tools/mavfft.py',
- 'tools/mavfft_isb.py',
- 'tools/mavsummarize.py',
- 'tools/MPU6KSearch.py',
- 'tools/mavlink_bitmask_decoder.py',
- ],
- install_requires=[
- 'future',
- 'lxml',
- ],
- setup_requires=[
- 'future' # future is required by mavgen, included by this file
- ],
- cmdclass={'build_py': custom_build_py},
- ext_modules = extensions
- )
|