Py_LIMITED_API + PyBytes_Check => undefined symbol: PyType_GetFlags
Not a huge deal, I can simply disable Py_LIMITED_API in the package I'm working on, but figured I should bring this up since it's different than CPython
mod.c
#include <Python.h>
static PyObject* _hello_world(PyObject* self) {
/* this code is nonsense, but it should still compile */
if (PyBytes_Check(self)) {
Py_RETURN_TRUE;
} else {
Py_RETURN_FALSE;
}
}
static struct PyMethodDef methods[] = {
{"hello_world", (PyCFunction)_hello_world, METH_NOARGS},
{NULL, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"mod",
NULL,
-1,
methods
};
PyMODINIT_FUNC PyInit_mod(void) {
return PyModule_Create(&module);
}
setup.py
from setuptools import setup, Extension
setup(
ext_modules=[
Extension(
'mod', ['mod.c'],
define_macros=[('Py_LIMITED_API', None)],
),
],
)
output
$ pip install . -vv
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-el29qzci
Created temporary directory: /tmp/pip-req-tracker-r6whtqbw
Initialized build tracking at /tmp/pip-req-tracker-r6whtqbw
Created build tracker: /tmp/pip-req-tracker-r6whtqbw
Entered build tracker: /tmp/pip-req-tracker-r6whtqbw
Created temporary directory: /tmp/pip-install-l8kncs1y
Processing /tmp/x
Created temporary directory: /tmp/pip-req-build-s8t68o2s
Added file:///tmp/x to build tracker '/tmp/pip-req-tracker-r6whtqbw'
Running setup.py (path:/tmp/pip-req-build-s8t68o2s/setup.py) egg_info for package from file:///tmp/x
Running command python setup.py egg_info
running egg_info
creating /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info
writing /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/PKG-INFO
writing dependency_links to /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/dependency_links.txt
writing top-level names to /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/top_level.txt
writing manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
reading manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
writing manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
Source in /tmp/pip-req-build-s8t68o2s has version 0.0.0, which satisfies requirement UNKNOWN==0.0.0 from file:///tmp/x
Removed UNKNOWN==0.0.0 from file:///tmp/x from build tracker '/tmp/pip-req-tracker-r6whtqbw'
Building wheels for collected packages: UNKNOWN
Created temporary directory: /tmp/pip-wheel-ebh16bjb
Building wheel for UNKNOWN (setup.py) ... Destination directory: /tmp/pip-wheel-ebh16bjb
Running command /tmp/x/venv/bin/pypy3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-s8t68o2s/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-s8t68o2s/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-ebh16bjb
running bdist_wheel
running build
running build_ext
building 'mod' extension
creating build
creating build/temp.linux-x86_64-3.6
gcc -pthread -DNDEBUG -O2 -fPIC -DPy_LIMITED_API -I/tmp/x/venv/include -I/home/asottile/opt/pypy3.6-v7.3.0-linux64/include -c mod.c -o build/temp.linux-x86_64-3.6/mod.o
In file included from /home/asottile/opt/pypy3.6-v7.3.0-linux64/include/Python.h:79:0,
from mod.c:1:
mod.c: In function ‘_hello_world’:
/home/asottile/opt/pypy3.6-v7.3.0-linux64/include/object.h:241:35: warning: implicit declaration of function ‘PyType_GetFlags’; did you mean ‘PyTuple_GetSlice’? [-Wimplicit-function-declaration]
#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0)
^
/home/asottile/opt/pypy3.6-v7.3.0-linux64/include/object.h:245:35: note: in expansion of macro ‘PyType_HasFeature’
#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f)
^~~~~~~~~~~~~~~~~
/home/asottile/opt/pypy3.6-v7.3.0-linux64/include/bytesobject.h:59:18: note: in expansion of macro ‘PyType_FastSubclass’
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS)
^~~~~~~~~~~~~~~~~~~
mod.c:4:9: note: in expansion of macro ‘PyBytes_Check’
if (PyBytes_Check(self)) {
^~~~~~~~~~~~~
creating build/lib.linux-x86_64-3.6
gcc -pthread -shared build/temp.linux-x86_64-3.6/mod.o -o build/lib.linux-x86_64-3.6/mod.pypy36-pp73-x86_64-linux-gnu.so
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
copying build/lib.linux-x86_64-3.6/mod.pypy36-pp73-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/wheel
running install_egg_info
running egg_info
creating UNKNOWN.egg-info
writing UNKNOWN.egg-info/PKG-INFO
writing dependency_links to UNKNOWN.egg-info/dependency_links.txt
writing top-level names to UNKNOWN.egg-info/top_level.txt
writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
reading manifest file 'UNKNOWN.egg-info/SOURCES.txt'
writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
Copying UNKNOWN.egg-info to build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0-py3.6.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0.dist-info/WHEEL
creating '/tmp/pip-wheel-ebh16bjb/UNKNOWN-0.0.0-pp36-pypy36_pp73-linux_x86_64.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'mod.pypy36-pp73-x86_64-linux-gnu.so'
adding 'UNKNOWN-0.0.0.dist-info/METADATA'
adding 'UNKNOWN-0.0.0.dist-info/WHEEL'
adding 'UNKNOWN-0.0.0.dist-info/top_level.txt'
adding 'UNKNOWN-0.0.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
done
Created wheel for UNKNOWN: filename=UNKNOWN-0.0.0-pp36-pypy36_pp73-linux_x86_64.whl size=3302 sha256=37ba3ba940e2e6054ebe21b72b7f93b912c4250dc854178669777a12ce808e53
Stored in directory: /tmp/pip-ephem-wheel-cache-el29qzci/wheels/7d/9e/1f/02f8804947d211e565279cf14282092ed2a13e9a47728f23f9
Successfully built UNKNOWN
Installing collected packages: UNKNOWN
Created temporary directory: /tmp/pip-unpacked-wheel-s9t21dvd
Successfully installed UNKNOWN-0.0.0
Cleaning up...
Removing source in /tmp/pip-req-build-s8t68o2s
Removed build tracker: '/tmp/pip-req-tracker-r6whtqbw'
$ python -c 'import mod'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /tmp/x/venv/site-packages/mod.pypy36-pp73-x86_64-linux-gnu.so: undefined symbol: PyType_GetFlags
output under cpython
$ pip install . -vv
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-6q8yoj5l
Created temporary directory: /tmp/pip-req-tracker-sh6zqzns
Initialized build tracking at /tmp/pip-req-tracker-sh6zqzns
Created build tracker: /tmp/pip-req-tracker-sh6zqzns
Entered build tracker: /tmp/pip-req-tracker-sh6zqzns
Created temporary directory: /tmp/pip-install-teoww993
Processing /tmp/x
Created temporary directory: /tmp/pip-req-build-diwbywxk
Added file:///tmp/x to build tracker '/tmp/pip-req-tracker-sh6zqzns'
Running setup.py (path:/tmp/pip-req-build-diwbywxk/setup.py) egg_info for package from file:///tmp/x
Running command python setup.py egg_info
running egg_info
creating /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info
writing /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/PKG-INFO
writing dependency_links to /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/dependency_links.txt
writing top-level names to /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/top_level.txt
writing manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
reading manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
writing manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
Source in /tmp/pip-req-build-diwbywxk has version 0.0.0, which satisfies requirement UNKNOWN==0.0.0 from file:///tmp/x
Removed UNKNOWN==0.0.0 from file:///tmp/x from build tracker '/tmp/pip-req-tracker-sh6zqzns'
Building wheels for collected packages: UNKNOWN
Created temporary directory: /tmp/pip-wheel-np5kfh2q
Building wheel for UNKNOWN (setup.py) ... Destination directory: /tmp/pip-wheel-np5kfh2q
Running command /tmp/x/venvcp/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-diwbywxk/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-diwbywxk/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-np5kfh2q
running bdist_wheel
running build
running build_ext
building 'mod' extension
creating build
creating build/temp.linux-x86_64-3.6
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_LIMITED_API -I/tmp/x/venvcp/include -I/usr/include/python3.6m -c mod.c -o build/temp.linux-x86_64-3.6/mod.o
creating build/lib.linux-x86_64-3.6
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/mod.o -o build/lib.linux-x86_64-3.6/mod.cpython-36m-x86_64-linux-gnu.so
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
copying build/lib.linux-x86_64-3.6/mod.cpython-36m-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/wheel
running install_egg_info
running egg_info
creating UNKNOWN.egg-info
writing UNKNOWN.egg-info/PKG-INFO
writing dependency_links to UNKNOWN.egg-info/dependency_links.txt
writing top-level names to UNKNOWN.egg-info/top_level.txt
writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
reading manifest file 'UNKNOWN.egg-info/SOURCES.txt'
writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
Copying UNKNOWN.egg-info to build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0-py3.6.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0.dist-info/WHEEL
creating '/tmp/pip-wheel-np5kfh2q/UNKNOWN-0.0.0-cp36-cp36m-linux_x86_64.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'mod.cpython-36m-x86_64-linux-gnu.so'
adding 'UNKNOWN-0.0.0.dist-info/METADATA'
adding 'UNKNOWN-0.0.0.dist-info/WHEEL'
adding 'UNKNOWN-0.0.0.dist-info/top_level.txt'
adding 'UNKNOWN-0.0.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
done
Created wheel for UNKNOWN: filename=UNKNOWN-0.0.0-cp36-cp36m-linux_x86_64.whl size=7510 sha256=e352fd2cb0259bdf374d133ab2b2204fbd6ddb3c28ce584e7fcacfb2be359d45
Stored in directory: /tmp/pip-ephem-wheel-cache-6q8yoj5l/wheels/ee/b3/31/be28105f11219b62c2dcf0cb7310ac9d23b417a75b7d21d607
Successfully built UNKNOWN
Installing collected packages: UNKNOWN
Created temporary directory: /tmp/pip-unpacked-wheel-gejzz0ev
Successfully installed UNKNOWN-0.0.0
Cleaning up...
Removing source in /tmp/pip-req-build-diwbywxk
Removed build tracker: '/tmp/pip-req-tracker-sh6zqzns'
$ python -c 'import mod'
$