aboutsummaryrefslogtreecommitdiffstats
path: root/community/gpsd
diff options
context:
space:
mode:
Diffstat (limited to 'community/gpsd')
-rw-r--r--community/gpsd/APKBUILD82
-rw-r--r--community/gpsd/gpsd-use-local-timepps-header.patch13
-rw-r--r--community/gpsd/gpsd.confd7
-rw-r--r--community/gpsd/gpsd.initd38
-rw-r--r--community/gpsd/timepps.h216
5 files changed, 356 insertions, 0 deletions
diff --git a/community/gpsd/APKBUILD b/community/gpsd/APKBUILD
new file mode 100644
index 0000000000..db0ef9107e
--- /dev/null
+++ b/community/gpsd/APKBUILD
@@ -0,0 +1,82 @@
+# Contributor: Nathan Angelacos <nangel@alpinelinux.org>
+# Maintainer: Nathan Angelacos <nangel@alpinelinux.org>
+pkgname=gpsd
+pkgver=3.21
+pkgrel=0
+pkgdesc="GPS daemon"
+arch=all
+url="http://catb.org/gpsd/"
+license="BSD-2-Clause"
+makedepends="scons python3-dev libcap-dev ncurses-dev"
+subpackages="$pkgname-dev $pkgname-doc py3-$pkgname:_py $pkgname-clients:_clients"
+source="https://download-mirror.savannah.gnu.org/releases/gpsd/gpsd-$pkgver.tar.gz
+ timepps.h
+ gpsd-use-local-timepps-header.patch
+ gpsd.initd
+ gpsd.confd"
+
+options="!check" # FIXME: tests fails
+
+prepare() {
+ # We copy timepps.h to the local build directory instead of
+ # creating a pps-tools-dev package for ppstime.h
+ # (See https://github.com/ago/pps-tools)
+ mkdir -p "$builddir"/sys
+ cp "$srcdir"/timepps.h "$builddir"/sys/
+
+ # Hack to get scons to respect python
+ ln -s /usr/bin/python3 python
+ export PATH="$PATH:."
+
+ default_prepare
+}
+
+build() {
+ CPPFLAGS="$CPPFLAGS -I. -DHAVE_SYS_TIMEPPS_H"
+ scons -j${JOBS:-1} \
+ prefix=/usr \
+ target_python=python3 \
+ dbus_export=no \
+ systemd=no
+}
+
+check() {
+ scons check
+}
+
+package() {
+ DESTDIR="$pkgdir" scons install
+ # fix python interpreter path
+ sed -e "s,#!/usr/bin/\(python[23]\?\|env \+python[23]\?\),#!/usr/bin/python3},g" -i \
+ gegps gpscat gpsfake xgps xgpsspeed gpsprof gps/*.py
+ install -m755 -D "$srcdir"/gpsd.initd "$pkgdir"/etc/init.d/gpsd
+ install -m644 -D "$srcdir"/gpsd.confd "$pkgdir"/etc/conf.d/gpsd
+}
+
+_py() {
+ local _py=${subpkgname##-*}
+ local _pyver=${_py%py}
+ pkgdesc="$pkgname library and clients for python $_pyver"
+ mkdir -p "$subpkgdir"/usr/lib
+ # As of 3.18.1, gpsd wants to put the python stuff in /usr/local
+ mv "$pkgdir"/usr/local/lib/python* "$subpkgdir"/usr/lib/
+ rm -rf "$pkgdir"/usr/local
+
+ mkdir -p "$subpkgdir"/usr/bin
+ for n in gpscat gpsfake gpsprof; do
+ mv "$pkgdir"/usr/bin/$n "$subpkgdir"/usr/bin/
+ done
+
+}
+
+_clients() {
+ pkgdesc="$pkgname clients"
+ mkdir -p "$subpkgdir"/usr/bin
+ mv "$pkgdir"/usr/bin/* "$subpkgdir"/usr/bin
+}
+
+sha512sums="7fbff3698a44ef24ce4631f1d0c5192b70c2e47f28e61372d8d0c437a6b4aeee459b08dcd69d9dc02bbda7b56949fd01ac57460fb922b5f807455f4ab3e91f2d gpsd-3.21.tar.gz
+eb11fc19243d1789016d88eb7645bfe67c46304547781489bf36eb1dd4c252d523681ff835a6488fa0ef62b6b9e2f781c672279f4439f5d5640a3f214a113048 timepps.h
+b692c9fc77a9db3fc621693d3b9e3ef9bc2efbbc7b01651168d7b928d29d48a489b8859930bad01b6021e211372e069a726b78dd5938385ed4ae0153b38f4170 gpsd-use-local-timepps-header.patch
+51319247eb78c3021d3eb897cb5d6026cc09d46a532a245a835459ed525947ffb6239f08126dd7e344de52e3b0387226bce060191ec3f14f99fc9f255d96f8ea gpsd.initd
+75dbfe39eb900cc9587dd70794ee77ae2230765bbede47760ca227145aa3f2290b6995335ffcfeae6cd86f56b01ca87367548f4fbcf810aff1bc012b7416deef gpsd.confd"
diff --git a/community/gpsd/gpsd-use-local-timepps-header.patch b/community/gpsd/gpsd-use-local-timepps-header.patch
new file mode 100644
index 0000000000..e7b7642cd1
--- /dev/null
+++ b/community/gpsd/gpsd-use-local-timepps-header.patch
@@ -0,0 +1,13 @@
+diff --git a/SConstruct b/SConstruct
+index 33e0ff3..cf39fd9 100644
+--- a/SConstruct
++++ b/SConstruct
+@@ -319,7 +319,7 @@ for var in import_env:
+ envs[var] = os.environ[var]
+ envs["GPSD_HOME"] = os.getcwd()
+
+-env = Environment(tools=["default", "tar", "textfile"], options=opts, ENV=envs)
++env = Environment(tools=["default", "tar", "textfile"], options=opts, ENV=envs, CPPPATH=".")
+
+ # Minimal build turns off every option not set on the command line,
+ if ARGUMENTS.get('minimal'):
diff --git a/community/gpsd/gpsd.confd b/community/gpsd/gpsd.confd
new file mode 100644
index 0000000000..0f52aa9b5e
--- /dev/null
+++ b/community/gpsd/gpsd.confd
@@ -0,0 +1,7 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# Config file for gpsd server
+GPSD_OPTIONS=""
+DEVICES=""
+GPSD_SOCKET="/var/run/gpsd.sock"
diff --git a/community/gpsd/gpsd.initd b/community/gpsd/gpsd.initd
new file mode 100644
index 0000000000..d2a30071a2
--- /dev/null
+++ b/community/gpsd/gpsd.initd
@@ -0,0 +1,38 @@
+#!/sbin/openrc-run
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+depend() {
+ after dbus
+ before ntpd
+}
+
+PIDFILE=/var/run/${SVCNAME}.pid
+DAEMON=/usr/sbin/gpsd
+
+checkconfig() {
+ # Note: these GPSD_xxx var names should be kept in sync with the udev rules.
+ if [ -z "${GPSD_SOCKET}" ] && [ -z "${DEVICES}" ]; then
+ GPSD_SOCKET="/var/run/gpsd.sock"
+ fi
+
+ if [ -n "${GPSD_SOCKET}" ]; then
+ GPSD_OPTIONS="${GPSD_OPTIONS} -F ${GPSD_SOCKET}"
+ fi
+}
+
+start() {
+ checkconfig
+ ebegin "Starting gpsd"
+
+ start-stop-daemon --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
+ ${GPSD_OPTIONS} -P ${PIDFILE} ${DEVICES}
+ eend $?
+}
+
+stop() {
+ ebegin "Stopping gpsd"
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile ${PIDFILE}
+ eend $?
+ rm -f ${PIDFILE}
+}
diff --git a/community/gpsd/timepps.h b/community/gpsd/timepps.h
new file mode 100644
index 0000000000..8c3bd835d6
--- /dev/null
+++ b/community/gpsd/timepps.h
@@ -0,0 +1,216 @@
+/*
+ * timepps.h -- PPS API main header
+ *
+ * Copyright (C) 2005-2007 Rodolfo Giometti <giometti@linux.it>
+ * Copyright (C) 2009-2011 Alexander Gordeev <alex@gordick.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Source: https://github.com/ago/pps-tools/ - Retreived Dec 2013
+ */
+
+#ifndef _SYS_TIMEPPS_H_
+#define _SYS_TIMEPPS_H_
+
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <linux/pps.h>
+
+#define LINUXPPS 1 /* signal we are using LinuxPPS */
+
+/*
+ * New data structures
+ */
+
+struct ntp_fp {
+ unsigned int integral;
+ unsigned int fractional;
+};
+
+union pps_timeu {
+ struct timespec tspec;
+ struct ntp_fp ntpfp;
+ unsigned long longpad[3];
+};
+
+struct pps_info {
+ unsigned long assert_sequence; /* seq. num. of assert event */
+ unsigned long clear_sequence; /* seq. num. of clear event */
+ union pps_timeu assert_tu; /* time of assert event */
+ union pps_timeu clear_tu; /* time of clear event */
+ int current_mode; /* current mode bits */
+};
+
+struct pps_params {
+ int api_version; /* API version # */
+ int mode; /* mode bits */
+ union pps_timeu assert_off_tu; /* offset compensation for assert */
+ union pps_timeu clear_off_tu; /* offset compensation for clear */
+};
+
+typedef int pps_handle_t; /* represents a PPS source */
+typedef unsigned long pps_seq_t; /* sequence number */
+typedef struct ntp_fp ntp_fp_t; /* NTP-compatible time stamp */
+typedef union pps_timeu pps_timeu_t; /* generic data type for time stamps */
+typedef struct pps_info pps_info_t;
+typedef struct pps_params pps_params_t;
+
+#define assert_timestamp assert_tu.tspec
+#define clear_timestamp clear_tu.tspec
+
+#define assert_timestamp_ntpfp assert_tu.ntpfp
+#define clear_timestamp_ntpfp clear_tu.ntpfp
+
+#define assert_offset assert_off_tu.tspec
+#define clear_offset clear_off_tu.tspec
+
+#define assert_offset_ntpfp assert_off_tu.ntpfp
+#define clear_offset_ntpfp clear_off_tu.ntpfp
+
+/*
+ * The PPS API
+ */
+
+static __inline int time_pps_create(int source, pps_handle_t *handle)
+{
+ int ret;
+ struct pps_kparams dummy;
+
+ if (!handle) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* First we check if current device is a valid PPS one by
+ * doing a dummy PPS_GETPARAMS...
+ */
+ ret = ioctl(source, PPS_GETPARAMS, &dummy);
+ if (ret) {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+
+ /* ... then since in LinuxPPS there are no differences between a
+ * "PPS source" and a "PPS handle", we simply return the same value.
+ */
+ *handle = source;
+
+ return 0;
+}
+
+static __inline int time_pps_destroy(pps_handle_t handle)
+{
+ return close(handle);
+}
+
+static __inline int time_pps_getparams(pps_handle_t handle,
+ pps_params_t *ppsparams)
+{
+ int ret;
+ struct pps_kparams __ppsparams;
+
+ ret = ioctl(handle, PPS_GETPARAMS, &__ppsparams);
+
+ ppsparams->api_version = __ppsparams.api_version;
+ ppsparams->mode = __ppsparams.mode;
+ ppsparams->assert_off_tu.tspec.tv_sec = __ppsparams.assert_off_tu.sec;
+ ppsparams->assert_off_tu.tspec.tv_nsec = __ppsparams.assert_off_tu.nsec;
+ ppsparams->clear_off_tu.tspec.tv_sec = __ppsparams.clear_off_tu.sec;
+ ppsparams->clear_off_tu.tspec.tv_nsec = __ppsparams.clear_off_tu.nsec;
+
+ return ret;
+}
+
+static __inline int time_pps_setparams(pps_handle_t handle,
+ const pps_params_t *ppsparams)
+{
+ struct pps_kparams __ppsparams;
+
+ __ppsparams.api_version = ppsparams->api_version;
+ __ppsparams.mode = ppsparams->mode;
+ __ppsparams.assert_off_tu.sec = ppsparams->assert_off_tu.tspec.tv_sec;
+ __ppsparams.assert_off_tu.nsec = ppsparams->assert_off_tu.tspec.tv_nsec;
+ __ppsparams.clear_off_tu.sec = ppsparams->clear_off_tu.tspec.tv_sec;
+ __ppsparams.clear_off_tu.nsec = ppsparams->clear_off_tu.tspec.tv_nsec;
+
+ return ioctl(handle, PPS_SETPARAMS, &__ppsparams);
+}
+
+/* Get capabilities for handle */
+static __inline int time_pps_getcap(pps_handle_t handle, int *mode)
+{
+ return ioctl(handle, PPS_GETCAP, mode);
+}
+
+static __inline int time_pps_fetch(pps_handle_t handle, const int tsformat,
+ pps_info_t *ppsinfobuf,
+ const struct timespec *timeout)
+{
+ struct pps_fdata __fdata;
+ int ret;
+
+ /* Sanity checks */
+ if (tsformat != PPS_TSFMT_TSPEC) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (timeout) {
+ __fdata.timeout.sec = timeout->tv_sec;
+ __fdata.timeout.nsec = timeout->tv_nsec;
+ __fdata.timeout.flags = ~PPS_TIME_INVALID;
+ } else
+ __fdata.timeout.flags = PPS_TIME_INVALID;
+
+ ret = ioctl(handle, PPS_FETCH, &__fdata);
+
+ ppsinfobuf->assert_sequence = __fdata.info.assert_sequence;
+ ppsinfobuf->clear_sequence = __fdata.info.clear_sequence;
+ ppsinfobuf->assert_tu.tspec.tv_sec = __fdata.info.assert_tu.sec;
+ ppsinfobuf->assert_tu.tspec.tv_nsec = __fdata.info.assert_tu.nsec;
+ ppsinfobuf->clear_tu.tspec.tv_sec = __fdata.info.clear_tu.sec;
+ ppsinfobuf->clear_tu.tspec.tv_nsec = __fdata.info.clear_tu.nsec;
+ ppsinfobuf->current_mode = __fdata.info.current_mode;
+
+ return ret;
+}
+
+#ifdef PPS_KC_BIND
+
+static __inline int time_pps_kcbind(pps_handle_t handle,
+ const int kernel_consumer,
+ const int edge, const int tsformat)
+{
+ struct pps_bind_args __bind_args;
+
+ __bind_args.tsformat = tsformat;
+ __bind_args.edge = edge;
+ __bind_args.consumer = kernel_consumer;
+
+ return ioctl(handle, PPS_KC_BIND, &__bind_args);
+}
+
+#else /* !PPS_KC_BIND */
+
+static __inline int time_pps_kcbind(pps_handle_t handle,
+ const int kernel_consumer,
+ const int edge, const int tsformat)
+{
+ /* LinuxPPS doesn't implement kernel consumer feature */
+ errno = EOPNOTSUPP;
+ return -1;
+}
+
+#endif /* PPS_KC_BIND */
+
+#endif /* _SYS_TIMEPPS_H_ */