1

Using python 2.6, I'm attempting to build an RPM for a python C extension module.

The setup.py that I'm using contains something like:

from distutils.core import setup, Extension

foo_ext = Extension('foo',
                    sources=['foo.c', '../src/common.c'],
                    include_dirs=['../includes'])

setup(... , ext_modules=[foo_ext])

If I run python setup.py build from /devel/foo for example, it compiles and builds without any errors, and gcc is called with the correct paths, i.e.:

gcc ... -I/devel/includes ...

When I use python setup.py bdist_rpm instead, then the relative paths used above are converted to absolute paths relative to the RPM build dir, this results in gcc trying to compile using:

gcc ... -I/devel/foo/build/bdist.linux-x86_64/rpm/BUILD/includes ...

Compilation then fails as a required .h file is not found in the include path.

Any suggestions or workarounds to this?

Dave Challis
  • 3,525
  • 2
  • 37
  • 65

2 Answers2

2

Solved by setting an environment variable during the first pass through the script, which is then read again when building the RPM:

import os
from distutils.core import setup, Extension

src_path = os.path.abspath('../src/common.c')
inc_path = os.path.abspath('../includes')

if 'SRC_PATH' not in os.environ:
    os.environ['SRC_PATH'] = src_path
    os.environ['INC_PATH'] = inc_path
else:
    src_path = os.environ['SRC_PATH']
    inc_path = os.environ['INC_PATH']

foo_ext = Extension('foo',
                sources=['foo.c', src_path],
                include_dirs=[inc_path])

setup(... , ext_modules=[foo_ext])
Dave Challis
  • 3,525
  • 2
  • 37
  • 65
  • Looks like a huge kludge. There should be a way to make that buggy `setup.py build_rpm` copy the entire source tree into its build directory. – firegurafiku Feb 12 '15 at 16:01
0

I could solve a similar problem by providing distutils with a proper MANIFEST.in file, which enumerated all header files I wanted to include. In my case it was like this:

include src/_rvlm_fdtd/include/rvlm/fdtd/* –or–
recursive-include src/_rvlm_fdtd *.h

but I think this will not work with your ../ paths. Instead I recommend you putting all your source code inside a package base directory.

The reason why RPM build phase was not able to find out your headers is because it builds a source distribution first (with setup.py sdist) and unpacks resulted tarball into a temporary build directory. So your source distribution just did not contain all files necessary for building.

firegurafiku
  • 3,017
  • 1
  • 28
  • 37