Locationd: no module dbus

Goal: Try to implement simple gps reading app in python following this example:
Obtain Location

HW: Dell Gateway 3002:

snap 2.45.2
snapd 2.45.2
series 16
kernel 4.4.0-186-generic

cores:

core 16-2.45.2 9665 latest/stable canonical✓ core
core18 20200724 1885 latest/stable canonical✓ base

Build environment: Ubuntu 20

snapcraft.yml

name: gps 
base: core18 
version: '0.1' 
summary: GPS via DBus service API
description: |
   gps example
grade: devel
confinement: devmode

architectures:
  - build-on: amd64
    run-on: [amd64, i386]

parts:
  gps:
    plugin: python
    source: .
    stage-packages: 
      - dbus
    
apps:
  gps:
    command: gps
    plugs: ["location-observe", "location-control"]

gps.py
exact example as in link.

snapcraft on Ubunt20, scp to Dell GW 3002 and install:

snap install gps_0.1_amd64.snap --devmode --dangerous

Connecting plugs

snap connect gps:location-observe locationd:service-observe
snap connect gps:location-control locationd:service-control

run:

gps

error

    Traceback (most recent call last):
      File "/snap/gps/x3/bin/gps", line 33, in <module>
        sys.exit(load_entry_point('gps==0.1.0', 'console_scripts', 'gps')())
      File "/snap/gps/x3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 488, in load_entry_point
        return get_distribution(dist).load_entry_point(group, name)
      File "/snap/gps/x3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2872, in load_entry_point
        return ep.load()
      File "/snap/gps/x3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2472, in load
        return self.resolve()
      File "/snap/gps/x3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2478, in resolve
        module = __import__(self.module_name, fromlist=['__name__'], level=0)
      File "/snap/gps/x3/lib/python3.6/site-packages/src/gps.py", line 2, in <module>
        import dbus
    ModuleNotFoundError: No module named 'dbus'

Didnt get any error in snapcraft, not sure if this is a Dell GW3002 issue or not? But can’t install this package…

Apparently

dbus is now in pip as dbus-python

In addition snapcraft.yaml needs to have included:

python-packages

and

build-packages

snapcraft.yaml:

name: gps 
base: core18 
version: '0.1' 
summary: GPS via DBus service API
description: |
   gps example
grade: devel
confinement: devmode

architectures:
  - build-on: amd64
    run-on: [amd64, i386]

parts:
  gps:
    plugin: python
    source: .
    python-packages: 
      - dbus-python
      - gobject
    build-packages:
      - cmake
      - make
      - gcc
      - python    
apps:
  gps:
    command: gps
    plugs: ["location-observe", "location-control"]

ERROR while snapcrafting:

  ERROR: Command errored out with exit status 1:
   command: /root/parts/gps/install/usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-wheel-31202_7p/dbus-python/setup.py'"'"'; __file__='"'"'/tmp/pip-wheel-31202_7p/dbus-python/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-nirko97n
       cwd: /tmp/pip-wheel-31202_7p/dbus-python/
  Complete output (144 lines):
  running bdist_wheel
  running build
  creating /tmp/pip-wheel-31202_7p/dbus-python/build
  creating /tmp/pip-wheel-31202_7p/dbus-python/build/temp.linux-x86_64-3.6
  checking whether make supports nested variables... yes
  checking whether to enable maintainer-specific portions of Makefiles... no
  checking for gcc... gcc
  checking whether the C compiler works... yes
  checking for C compiler default output file name... a.out
  checking for suffix of executables...
  checking whether we are cross compiling... no
  checking for suffix of object files... o
  checking whether we are using the GNU C compiler... yes
  checking whether gcc accepts -g... yes
  checking for gcc option to accept ISO C89... none needed
  checking whether gcc understands -c and -o together... yes
  checking how to run the C preprocessor... gcc -E
  checking for grep that handles long lines and -e... /bin/grep
  checking for egrep... /bin/grep -E
  checking for ANSI C header files... yes
  checking for sys/types.h... yes
  checking for sys/stat.h... yes
  checking for stdlib.h... yes
  checking for string.h... yes
  checking for memory.h... yes
  checking for strings.h... yes
  checking for inttypes.h... yes
  checking for stdint.h... yes
  checking for unistd.h... yes
  checking minix/config.h usability... no
  checking minix/config.h presence... no
  checking for minix/config.h... no
  checking whether it is safe to define __EXTENSIONS__... yes
  checking for a BSD-compatible install... /usr/bin/install -c
  checking whether build environment is sane... yes
  checking for a thread-safe mkdir -p... /bin/mkdir -p
  checking for gawk... gawk
  checking whether make sets $(MAKE)... yes
  checking whether make supports the include directive... yes (GNU style)
  checking whether UID '0' is supported by ustar format... yes
  checking whether GID '0' is supported by ustar format... yes
  checking how to create a ustar tar archive... gnutar
  checking dependency style of gcc... gcc3
  checking build system type... x86_64-pc-linux-gnu
  checking host system type... x86_64-pc-linux-gnu
  checking for native Windows host... no
  checking how to print strings... printf
  checking for a sed that does not truncate output... /bin/sed
  checking for fgrep... /bin/grep -F
  checking for ld used by gcc... /usr/bin/ld
  checking if the linker (/usr/bin/ld) is GNU ld... yes
  checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
  checking the name lister (/usr/bin/nm -B) interface... BSD nm
  checking whether ln -s works... yes
  checking the maximum length of command line arguments... 1572864
  checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
  checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
  checking for /usr/bin/ld option to reload object files... -r
  checking for objdump... objdump
  checking how to recognize dependent libraries... pass_all
  checking for dlltool... no
  checking how to associate runtime and link libraries... printf %s\n
  checking for ar... ar
  checking for archiver @FILE support... @
  checking for strip... strip
  checking for ranlib... ranlib
  checking command to parse /usr/bin/nm -B output from gcc object... ok
  checking for sysroot... no
  checking for a working dd... /bin/dd
  checking how to truncate binary pipes... /bin/dd bs=4096 count=1
  /tmp/pip-wheel-31202_7p/dbus-python/configure: line 7105: /usr/bin/file: No such file or directory
  checking for mt... no
  checking if : is a manifest tool... no
  checking for dlfcn.h... yes
  checking for objdir... .libs
  checking if gcc supports -fno-rtti -fno-exceptions... no
  checking for gcc option to produce PIC... -fPIC -DPIC
  checking if gcc PIC flag -fPIC -DPIC works... yes
  checking if gcc static flag -static works... yes
  checking if gcc supports -c -o file.o... yes
  checking if gcc supports -c -o file.o... (cached) yes
  checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
  checking whether -lc should be explicitly linked in... no
  checking dynamic linker characteristics... GNU/Linux ld.so
  checking how to hardcode library paths into programs... immediate
  checking whether stripping libraries is possible... yes
  checking if libtool supports shared libraries... yes
  checking whether to build shared libraries... yes
  checking whether to build static libraries... no
  checking for inline... inline
  checking for gawk... (cached) gawk
  checking for python... /root/parts/gps/install/usr/bin/python3
  checking for a version of Python >= '2.1.0'... yes
  checking for a version of Python >= '2.7'... yes
  checking for the distutils Python package... yes
  checking for Python include path... -I/root/parts/gps/install/usr/include/python3.6m
  checking for Python library path... -L/usr/lib -lpython3.6m
  checking for Python site-packages path... /root/parts/gps/install/usr/lib/python3.6/site-packages
  checking python extra libraries... -lpthread -ldl  -lutil -lm
  checking python extra linking flags... -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
  checking consistency of all components of python development environment... yes
  checking for python version... 3.6
  checking for python platform... linux
  checking for python script directory... ${prefix}/lib/python3.6/site-packages
  checking for python extension module directory... ${exec_prefix}/lib/python3.6/site-packages
  checking python3 module: sphinx... no
  checking python3 module: sphinx_rtd_theme... no
  checking for dbus-run-session... /usr/bin/dbus-run-session
  checking for pkg-config... no
  checking for DBUS... no
  configure: error: in `/tmp/pip-wheel-31202_7p/dbus-python/build/temp.linux-x86_64-3.6':
  configure: error: The pkg-config script could not be found or is too old.  Make sure it
  is in your PATH or set the PKG_CONFIG environment variable to the full
  path to pkg-config.
  
  Alternatively, you may set the environment variables DBUS_CFLAGS
  and DBUS_LIBS to avoid the need to call pkg-config.
  See the pkg-config man page for more details.
  
  To get pkg-config, see <http://pkg-config.freedesktop.org/>.
  See `config.log' for more details
  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "/tmp/pip-wheel-31202_7p/dbus-python/setup.py", line 111, in <module>
      tests_require=['tap.py'],
    File "/root/parts/gps/install/lib/python3.6/site-packages/setuptools/__init__.py", line 163, in setup
      return distutils.core.setup(**attrs)
    File "/root/parts/gps/install/usr/lib/python3.6/distutils/core.py", line 148, in setup
      dist.run_commands()
    File "/root/parts/gps/install/usr/lib/python3.6/distutils/dist.py", line 955, in run_commands
      self.run_command(cmd)
    File "/root/parts/gps/install/usr/lib/python3.6/distutils/dist.py", line 974, in run_command
      cmd_obj.run()
    File "/root/parts/gps/install/lib/python3.6/site-packages/wheel/bdist_wheel.py", line 290, in run
      self.run_command('build')
    File "/root/parts/gps/install/usr/lib/python3.6/distutils/cmd.py", line 313, in run_command
      self.distribution.run_command(command)
    File "/root/parts/gps/install/usr/lib/python3.6/distutils/dist.py", line 974, in run_command
      cmd_obj.run()
    File "/tmp/pip-wheel-31202_7p/dbus-python/setup.py", line 64, in run
      cwd=builddir)
    File "/root/parts/gps/install/usr/lib/python3.6/subprocess.py", line 311, in check_call
      raise CalledProcessError(retcode, cmd)
  subprocess.CalledProcessError: Command '['/tmp/pip-wheel-31202_7p/dbus-python/configure', '--disable-maintainer-mode', 'PYTHON=/root/parts/gps/install/usr/bin/python3', '--prefix=/tmp/pip-wheel-31202_7p/dbus-python/build/temp.linux-x86_64-3.6/prefix']' returned non-zero exit status 1.
  ----------------------------------------
  ERROR: Failed building wheel for dbus-python
  Running setup.py clean for dbus-python
Failed to build dbus-python
ERROR: Failed to build one or more wheels
Failed to run '/root/parts/gps/install/usr/bin/python3 -m pip wheel --no-index --find-links /root/parts/gps/python-packages --wheel-dir /tmp/tmpk7bb6kbx dbus-python gobject': Exited with code 1.

Issue solved by using the correct python-packages and build-packages required for the above example:

parts:
  gps:
    plugin: python
    python-version: python3
    source: .
    python-packages:
      - dbus-python
      - gobject
    build-packages:
      - cmake
      - gcc
      - pkg-config
      - build-essential
      - libcairo2-dev
      - python3-dev 
      - libdbus-glib-1-dev 
      - libgirepository1.0-dev