diff options
author | Fred Wright <fw@fwright.net> | 2019-03-27 16:45:19 -0700 |
---|---|---|
committer | Fred Wright <fw@fwright.net> | 2019-03-27 20:27:05 -0700 |
commit | 7fc42e4d1c881e6c88c3f01b4b19080dcdf8378b (patch) | |
tree | ddf12684c2c03f60258b13ac01ad6f5981f15267 | |
parent | 4b80866539305242d6fe96bf385efd30d95da6a7 (diff) | |
download | gpsd-7fc42e4d1c881e6c88c3f01b4b19080dcdf8378b.tar.gz |
ubxtool/zerk: Makes PySerial a "soft" dependency.
This allows the absence of the PySerial ('serial') module, as long as
the -f option is not used. This not only avoids the PySerial
dependency for informational options like -h and -V, but also allows
full functionality in the "via gpsd" mode.
The 'gps_io' class was taking the 'serial' module (mistakenly referred
to as a class as an init argument, but wasn't making any use of that
flexibility. Since fully supporting that would complicate the error
message, it's simply removed instead.
The zerk changes are untested, due to the lack of appropriate
hardware. However, they are identical to the changes in the
corresponding code in ubxtool, which is tested.
The manpages are updated to mention the pyserial dependency for -f.
The install of ubxtool and zerk is no longer conditional on PySerial.
TESTED:
Tested ubxtool with PySerial 2.7, 3.0, 3.4, and none at all, verifying
that -f works with all three versions, and other modes work without.
Also tested with Python 3.4-3.7 (PySerial 3.4 only).
-rw-r--r-- | INSTALL | 2 | ||||
-rw-r--r-- | SConstruct | 17 | ||||
-rw-r--r-- | man/ubxtool.xml | 1 | ||||
-rw-r--r-- | man/zerk.xml | 3 | ||||
-rwxr-xr-x | ubxtool | 15 | ||||
-rwxr-xr-x | zerk | 15 |
6 files changed, 23 insertions, 30 deletions
@@ -96,7 +96,7 @@ various additional features have additional prerequisites: |Qt + qmake | libQgpsmm depends on this |python2.x(x>=6) or 3.y(y>=2) | required for various clients and utilities |python-GI bindings | the test clients xgps and xgpsspeed, need this -|pyserial | ubxtool and zerk need this +|pyserial | for ubxtool and zerk in direct-serial mode |=============================================================================== Some ncurses packages contain the terminfo library; some break it out @@ -1457,7 +1457,7 @@ if not env['python']: python_targets = [] else: # installed python programs - python_progs = ["gegps", "gpscat", "gpsfake", "gpsprof"] + python_progs = ["gegps", "gpscat", "gpsfake", "gpsprof", "ubxtool", "zerk"] python_deps = {'gpscat': 'packet'} # python misc helpers and stuff @@ -1479,21 +1479,10 @@ else: "man/gpscat.1": "man/gpscat.xml", "man/gpsfake.1": "man/gpsfake.xml", "man/gpsprof.1": "man/gpsprof.xml", + "man/ubxtool.1": "man/ubxtool.xml", + "man/zerk.1": "man/zerk.xml", } - # check for pyserial - try: - imp.find_module('serial') - python_progs.extend(["ubxtool", "zerk"]) - python_manpages.update({ - "man/ubxtool.1": "man/ubxtool.xml", - "man/zerk.1": "man/zerk.xml", - }) - except ImportError: - # no pyserial, reduced functionality in ubxtool and zerk - announce("WARNING: Python module serial (pyserial) not found.\n" - " ubxtool and zerk will not be installed") - if env['xgps']: # check for pycairo try: diff --git a/man/ubxtool.xml b/man/ubxtool.xml index fa69e9aa..47020e3e 100644 --- a/man/ubxtool.xml +++ b/man/ubxtool.xml @@ -170,6 +170,7 @@ is to enable the option. <para>Connect to a file or device. Accepts one parameter, FILE, the file or device to open. Files are opened read-only. Character devices are opened read/write, unless the -r parameter is given. +Requires the pyserial module. </para> </listitem> </varlistentry> diff --git a/man/zerk.xml b/man/zerk.xml index e82d5c71..cf9d3319 100644 --- a/man/zerk.xml +++ b/man/zerk.xml @@ -192,7 +192,8 @@ same OPTIONs as -d, except the action is to enable the option. <listitem> <para>Connect to a file or device. Accepts one parameter, FILE, the file or device to open. Files are opened read-only. Character -devices are opened red/write, unless the -r parameter is given. +devices are opened read/write, unless the -r parameter is given. +Requires the pyserial module. </para> </listitem> </varlistentry> @@ -44,9 +44,7 @@ PROG_NAME = 'ubxtool' try: import serial except ImportError: - # treat serial as special since it is not part of standard Python - sys.stderr.write("%s: failed to import pyserial\n" % PROG_NAME) - sys.exit(2) + serial = None # Defer complaining until we know we need it. try: import gps @@ -2159,11 +2157,11 @@ class gps_io(object): ser = None input_is_device = False - def __init__(self, serial_class): + def __init__(self): "Initialize class" - Serial = serial_class - Serial_v3 = Serial.VERSION.split('.')[0] >= '3' + Serial = serial + Serial_v3 = Serial and Serial.VERSION.split('.')[0] >= '3' # buffer to hold read data self.out = b'' @@ -2238,6 +2236,9 @@ class gps_io(object): timeout=0.05, **{write_timeout_arg: 0.5} ) + except AttributeError: + sys.stderr.write('%s: failed to import pyserial\n' % PROG_NAME) + sys.exit(2) except Serial.serialutil.SerialException: # this exception happens on bad serial port device name sys.stderr.write('%s: failed to open serial port "%s"\n' @@ -2546,7 +2547,7 @@ try: sys.exit(1) # create the I/O instance - io_handle = gps_io(serial) + io_handle = gps_io() sys.stdout.flush() @@ -52,9 +52,7 @@ PROG_NAME = 'zerk' try: import serial except ImportError: - # treat serial as special since it is not part of standard Python - sys.stderr.write("%s: failed to import pyserial\n" % PROG_NAME) - sys.exit(2) + serial = None # Defer complaining until we know we need it. try: import gps @@ -1458,11 +1456,11 @@ class gps_io(object): ser = None input_is_device = False - def __init__(self, serial_class): + def __init__(self): "Initialize class" - Serial = serial_class - Serial_v3 = Serial.VERSION.split('.')[0] >= '3' + Serial = serial + Serial_v3 = Serial and Serial.VERSION.split('.')[0] >= '3' # buffer to hold read data self.out = b'' @@ -1536,6 +1534,9 @@ class gps_io(object): timeout=0.05, **{write_timeout_arg: 0.5} ) + except AttributeError: + sys.stderr.write('%s: failed to import pyserial\n' % PROG_NAME) + sys.exit(2) except Serial.serialutil.SerialException: # this exception happens on bad serial port device name sys.stderr.write('%s: failed to open serial port "%s"\n' @@ -1853,7 +1854,7 @@ try: sys.exit(1) # create the I/O instance - io_handle = gps_io(serial) + io_handle = gps_io() # keep it simple, only one of -O, -c -d -e or -S if opts['oaf_name'] is not None: |