import platform import textwrap import pytest from . import utils from . import test_projects # TODO: specify these at runtime according to manylinux_image project_with_manylinux_symbols = test_projects.new_c_project( spam_c_top_level_add=textwrap.dedent(r''' #include #if !defined(__GLIBC_PREREQ) #error "Must run on a glibc linux environment" #endif #if !__GLIBC_PREREQ(2, 5) /* manylinux1 is glibc 2.5 */ #error "Must run on a glibc >= 2.5 linux environment" #endif '''), spam_c_function_add=textwrap.dedent(r''' #if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 17) /* manylinux2014 is glibc 2.17 */ // secure_getenv is only available in manylinux2014, ensuring // that only a manylinux2014 wheel is produced secure_getenv("NON_EXISTING_ENV_VARIABLE"); #elif defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10) /* manylinux2010 is glibc 2.12 */ // malloc_info is only available on manylinux2010+ malloc_info(0, stdout); #endif '''), ) @pytest.mark.parametrize('manylinux_image', ['manylinux1', 'manylinux2010', 'manylinux2014']) def test(manylinux_image, tmp_path): if utils.platform != 'linux': pytest.skip('the docker test is only relevant to the linux build') elif platform.machine() not in ['x86_64', 'i686']: if manylinux_image in ['manylinux1', 'manylinux2010']: pytest.skip("manylinux1 and 2010 doesn't exist for non-x86 architectures") project_dir = tmp_path / 'project' project_with_manylinux_symbols.generate(project_dir) # build the wheels # CFLAGS environment variable is necessary to fail on 'malloc_info' (on manylinux1) during compilation/linking, # rather than when dynamically loading the Python add_env = { 'CIBW_ENVIRONMENT': 'CFLAGS="$CFLAGS -Werror=implicit-function-declaration"', 'CIBW_MANYLINUX_X86_64_IMAGE': manylinux_image, 'CIBW_MANYLINUX_I686_IMAGE': manylinux_image, 'CIBW_MANYLINUX_PYPY_X86_64_IMAGE': manylinux_image, 'CIBW_MANYLINUX_AARCH64_IMAGE': manylinux_image, 'CIBW_MANYLINUX_PPC64LE_IMAGE': manylinux_image, 'CIBW_MANYLINUX_S390X_IMAGE': manylinux_image, } if manylinux_image == 'manylinux1': # We don't have a manylinux1 image for PyPy add_env['CIBW_SKIP'] = 'pp*' elif manylinux_image == 'manylinux2014': # We don't have a manylinux2014 image for PyPy (yet?) add_env['CIBW_SKIP'] = 'cp27* pp*' # Python 2.7 not available on manylinux2014 actual_wheels = utils.cibuildwheel_run(project_dir, add_env=add_env) expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0', manylinux_versions=[manylinux_image])] if manylinux_image == 'manylinux2014': expected_wheels = [w for w in expected_wheels if '-cp27' not in w] if manylinux_image in ['manylinux1', 'manylinux2014']: expected_wheels = [w for w in expected_wheels if '-pp' not in w] assert set(actual_wheels) == set(expected_wheels)