New submission from Todd Levi <tel...@comcast.net>:

Action:
Run the following command in py36, py37, and py3 for package uvloop

python setup.py build_ext --inline bdist_wheel

Expected behavior:

The package is built and bundled as a wheel.

Observed behavior:

The build fails at the bdist_wheel stage with the following error:

error: don't know how to compile C/C++ code on platform 'posix' with 
'<distutils.unixccompiler.UnixCCompiler object at 0x7f6054587438>' compiler

Additional Notes:

If I split the two commands (build_ext and bdist_wheel) into separate 
invocations (e.g. python setup.py build_ext --inline && python setup.py 
bdist_wheel) then the wheel is successfully built.  It only (and always) fails 
when build_ext and bdist_wheel are on the same command line.

What "seems" to be happening is that bdist_wheel is somehow inheriting the 
existing CCompiler object that was used by build_ext and is then passing that 
back to distutils.compiler.new_compiler().  The new_compiler() function simply 
checks to see if compiler is None and, if not, uses its value as a key to the 
compiler_class dict.

The distutils/command/build_ext build_ext object initially sets self.compiler 
to None so the first invocation of new_compiler() in build_ext.run() will work 
as expected.  In build_ext.run() at around line 306 (in master), however, it 
simply does self.compiler = new_compiler(compiler=self.compiler,...) so any 
subsequent invocation of run() seems like it will fail and produce the error 
message I'm seeing.  new_compiler() is the only place I see that error message 
being emitted.

The package I'm building (uvloop) is being built with Cython but all the object 
paths I've been able to track come back to distutils.ccompiler.py.  That 
packages setup.py file doesn't seem to do anything weird that I can see (which 
doesn't mean it isn't doing something weird).  It sets the sdist and build_ext 
cmdclass entries to their own methods (that don't seem to set compiler - just 
compiler options) and also registers an extension via ext_modules.  The 
setup.py code is here: https://github.com/MagicStack/uvloop/blob/master/setup.py

Possible Fix:

Two simple possibilities come to mind.  1) In run, see if self.compiler is not 
None and alter the call to new_compiler() to use self.compiler.compiler_type.  
2) In new_compiler(), check the type of compiler and simply return if its a 
CCompiler object.

----------
components: Distutils
messages: 363765
nosy: dstufft, eric.araujo, televi
priority: normal
severity: normal
status: open
title: new_compiler() called 2nd time causes error
type: behavior
versions: Python 3.6, Python 3.7, Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue39917>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to