python-mapnik icon indicating copy to clipboard operation
python-mapnik copied to clipboard

Current hard-coded pycairo flags in setup.py hinder installs where Python and pycairo have different prefixes

Open jwilges opened this issue 4 years ago • 1 comments

Issue

As in the title, the current hard-coded pycairo flags in setup.py hinder installs where Python and pycairo have different prefixes.

Clarification

In a nutshell, if pycairo resides outside of Python's sys.exec_prefix, the current setup.py behavior is incorrect.

See this Dockerfile gist for an example of this issue in a python:3.8-slim-based container that uses Debian's python3-cairo-dev package to provide pycairo.

Reference

Current setup.py:

if os.environ.get("PYCAIRO", "false") == "true":
    try:
        extra_comp_args.append('-DHAVE_PYCAIRO')
        print("-I%s/include/pycairo".format(sys.exec_prefix))
        extra_comp_args.append("-I{0}/include/pycairo".format(sys.exec_prefix))
        #extra_comp_args.extend(check_output(["pkg-config", '--cflags', 'pycairo']).strip().split(' '))
        #linkflags.extend(check_output(["pkg-config", '--libs', 'pycairo']).strip().split(' '))
    except:
        raise Exception("Failed to find compiler options for pycairo")

It looks like someone tried to leverage pkg-config at some point but ultimately disabled it.

Suggestion

I am attaching a patch that aims to give us the best of both worlds: flags sourced from pkg-config when viable with backward compatible fallback flag values when pkg-config detection fails.

This could be rolled up into a slightly better generic pkg-config pattern if other dependencies could benefit from similar behavior but I made the patch solely for pycairo since that was the only preexisting use case of pkg-config in setup.py.

jwilges avatar Nov 13 '20 02:11 jwilges

Thanks for this patch, but maybe we should also expose this as a system variable. I've installed pycairo in a venv and it doesn't come with a pkg-config configuration. So neither the original one nor your code finds the files inside the venv.

tobwen avatar Feb 06 '22 23:02 tobwen