I'm building a platform independent cython project where I want to pass compiler args based on the compiler being used. I can guess the compiler based on platform or assume it's the same compiler used for Python but it's not guaranteed to match. Normally I inject into the cmdclass
arg to setuptool's setup method and wrap the install or build_ext commands to check internal state. But in this case I have to cythonize the extension modules before I reach the wrappers.
Is there any way to determine the compiler inside setup.py before cythonizing the extension modules?
To compile the example. pyx file, select Tools | Run setup.py Task command from the main menu. In the Enter setup.py task name type build and select the build_ext task. See Create and run setup.py for more details.
Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language (based on Pyrex). It makes writing C extensions for Python as easy as Python itself. Cython gives you the combined power of Python and C to let you.
After posting on the cython forums and searching for related issues in distutils I found this post showing how to move the compiler arguments into the build_ext assignment. If I subsequently remove all compiler arguments from the extension class I can now lazy assign them inside the command class as I expected. I can also get install
and egg_info
command classes to call my new version of the build_ext as well.
from setuptools.command.build_ext import build_ext
BUILD_ARGS = defaultdict(lambda: ['-O3', '-g0'])
for compiler, args in [
('msvc', ['/EHsc', '/DHUNSPELL_STATIC']),
('gcc', ['-O3', '-g0'])]:
BUILD_ARGS[compiler] = args
class build_ext_compiler_check(build_ext):
def build_extensions(self):
compiler = self.compiler.compiler_type
args = BUILD_ARGS[compiler]
for ext in self.extensions:
ext.extra_compile_args = args
build_ext.build_extensions(self)
...
setup(
...
cmdclass={ 'build_ext': build_ext_compiler_check })
A simple variation of the first answer:
from setuptools import setup, Extension
from distutils.command.build_ext import build_ext
myextension = Extension(
name = 'packagename',
sources = [
'source/debugger.cpp',
],
include_dirs = [ 'source' ],
)
class build_ext_compiler_check(build_ext):
def build_extensions(self):
compiler = self.compiler.compiler_type
# print('\n\ncompiler', compiler)
if not 'msvc' in compiler:
for extension in self.extensions:
if extension == myextension:
extension.extra_compile_args.append( '-O0' )
extension.extra_compile_args.append( '-std=c++11' )
super().build_extensions()
setup(
name = 'packagename',
version = __version__,
ext_modules= [ myextension ],
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With