Trouble installing duplicity on OSX Mojave: Missing librsync.h
I'm having trouble installing duplicity on Mac OSX Mojave 10.14.5 via pip using Python 2.7.16 (via pyenv). Specifically, I get the following output from running pip2 install duplicity:
Collecting duplicity
Using cached https://files.pythonhosted.org/packages/eb/3f/1e8cd24fc23dc6cd8d3f86811c0c5b07da59fc55f881838b10f141cd589e/duplicity-0.7.14.tar.gz
Requirement already satisfied: fasteners in /Users/albo/.pyenv/versions/2.7.16/lib/python2.7/site-packages (from duplicity) (0.15)
Requirement already satisfied: monotonic>=0.1 in /Users/albo/.pyenv/versions/2.7.16/lib/python2.7/site-packages (from fasteners->duplicity) (1.5)
Requirement already satisfied: six in /Users/albo/.pyenv/versions/2.7.16/lib/python2.7/site-packages (from fasteners->duplicity) (1.12.0)
Installing collected packages: duplicity
Running setup.py install for duplicity ... error
ERROR: Complete output from command /Users/albo/.pyenv/versions/2.7.16/bin/python2.7 -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/76/6lq0sxzd24b7d5573nxfyy600000gr/T/pip-install-52AhpF/duplicity/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/76/6lq0sxzd24b7d5573nxfyy600000gr/T/pip-record-l4gMJE/install-record.txt --single-version-externally-managed --compile:
ERROR: running install
running build
running build_py
creating build
creating build/lib.macosx-10.14-x86_64-2.7
creating build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/tempdir.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/dup_threading.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/backend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/manifest.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/log.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/util.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/globals.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/globmatch.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/diffdir.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/commandline.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/librsync.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/dup_time.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/compilec.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/gpg.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/file_naming.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/collections.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/asyncscheduler.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/gpginterface.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/robust.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/statistics.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/patchdir.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/errors.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/selection.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/progress.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/dup_temp.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/tarfile.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/lazy.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/filechunkio.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/path.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
copying duplicity/cached_ops.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity
creating build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/megabackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/acdclibackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/pydrivebackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/imapbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/ssh_pexpect_backend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/par2backend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/multibackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/swiftbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/botobackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/tahoebackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/giobackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/_boto_multi.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/localbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/sxbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/_cf_pyrax.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/mediafirebackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/ncftpbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/gdocsbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/cfbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/_cf_cloudfiles.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/_boto_single.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/ssh_paramiko_backend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/hsibackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/onedrivebackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/hubicbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/dpbxbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/b2backend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/azurebackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/rsyncbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/lftpbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
copying duplicity/backends/webdavbackend.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends
creating build/lib.macosx-10.14-x86_64-2.7/duplicity/backends/pyrax_identity
copying duplicity/backends/pyrax_identity/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends/pyrax_identity
copying duplicity/backends/pyrax_identity/hubic.py -> build/lib.macosx-10.14-x86_64-2.7/duplicity/backends/pyrax_identity
creating build/lib.macosx-10.14-x86_64-2.7/testing
copying testing/test_code.py -> build/lib.macosx-10.14-x86_64-2.7/testing
copying testing/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/testing
creating build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_verify.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_cleanup.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_selection.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_log.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_final.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_badupload.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_restart.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
copying testing/functional/test_rdiffdir.py -> build/lib.macosx-10.14-x86_64-2.7/testing/functional
creating build/lib.macosx-10.14-x86_64-2.7/testing/overrides
copying testing/overrides/gettext.py -> build/lib.macosx-10.14-x86_64-2.7/testing/overrides
copying testing/overrides/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/testing/overrides
creating build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_backend.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_statistics.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_tempdir.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_dup_time.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_diffdir.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_gpginterface.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/__init__.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_selection.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_manifest.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_backend_instance.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_patchdir.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_dup_temp.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_gpg.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_file_naming.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_path.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_collections.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_lazy.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_globmatch.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
copying testing/unit/test_tarfile.py -> build/lib.macosx-10.14-x86_64-2.7/testing/unit
running build_ext
building 'duplicity._librsync' extension
creating build/temp.macosx-10.14-x86_64-2.7
creating build/temp.macosx-10.14-x86_64-2.7/duplicity
clang -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/albo/.pyenv/versions/2.7.16/include/python2.7 -c duplicity/_librsyncmodule.c -o build/temp.macosx-10.14-x86_64-2.7/duplicity/_librsyncmodule.o
duplicity/_librsyncmodule.c:27:10: fatal error: 'librsync.h' file not found
#include <librsync.h>
^~~~~~~~~~~~
1 error generated.
error: command 'clang' failed with exit status 1
----------------------------------------
ERROR: Command "/Users/albo/.pyenv/versions/2.7.16/bin/python2.7 -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/76/6lq0sxzd24b7d5573nxfyy600000gr/T/pip-install-52AhpF/duplicity/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/76/6lq0sxzd24b7d5573nxfyy600000gr/T/pip-record-l4gMJE/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/76/6lq0sxzd24b7d5573nxfyy600000gr/T/pip-install-52AhpF/duplicity/
clang complains that it cannot find the librsync.h file. Although the rsync executable is available on OSX, the sources do not seem to be.
I then tried downloading the rsync source files myself and setting LIBRSYNC_DIR when running pip2 but duplicity assumes that the include files are found in $LIBRSYNC_DIR/include which is not the case for the librsync sources on github or sourceforge.
brew is not an option for me on this particular machine.
Is there another way of installing duplicity on OSX short of modifying the setup.py script and running python2 setup.py install, or am I missing something else? I could also simply create the directory and move the header into it (and do the same with $LIBRSYNC_DIR/lib) but there must be a better way :)