amueller / word_cloud

A little word cloud generator in Python
https://amueller.github.io/word_cloud
MIT License
10.1k stars 2.31k forks source link

Fails to build with Python 3.12 #730

Closed davide125 closed 10 months ago

davide125 commented 1 year ago

wordcloud 1.9.2 currently fails to build with Python 3.12:

Building wheels for collected packages: wordcloud
  Building wheel for wordcloud (pyproject.toml): started
  Running command Building wheel for wordcloud (pyproject.toml)
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-cpython-312
  creating build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/__init__.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/__main__.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/_version.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/color_from_image.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/tokenization.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/wordcloud.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/wordcloud_cli.py -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/stopwords -> build/lib.linux-x86_64-cpython-312/wordcloud
  copying wordcloud/DroidSansMono.ttf -> build/lib.linux-x86_64-cpython-312/wordcloud
  UPDATING build/lib.linux-x86_64-cpython-312/wordcloud/_version.py
  set build/lib.linux-x86_64-cpython-312/wordcloud/_version.py to '1.9.2'
  running build_ext
  building 'wordcloud.query_integral_image' extension
  creating build/temp.linux-x86_64-cpython-312
  creating build/temp.linux-x86_64-cpython-312/wordcloud
  gcc -fno-strict-overflow -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -D_GNU_SOURCE -fPIC -fwrapv -O2 -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -D_GNU_SOURCE -fPIC -fwrapv -O2 -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -D_GNU_SOURCE -fPIC -fwrapv -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fPIC -I/usr/include/python3.12 -c wordcloud/query_integral_image.c -o build/temp.linux-x86_64-cpython-312/wordcloud/query_integral_image.o
  wordcloud/query_integral_image.c: In function ‘__pyx_pf___pyx_MemviewEnum___reduce_cython__’:
  wordcloud/query_integral_image.c:4817:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
   4817 |     __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error)
        |     ^~~~~~~~~~~~~~~~~~~~~~~~~
  In file included from /usr/include/python3.12/dictobject.h:90,
                   from /usr/include/python3.12/Python.h:61,
                   from wordcloud/query_integral_image.c:6:
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c:4863:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
   4863 |     __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error)
        |     ^~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__pyx_memview_slice’:
  wordcloud/query_integral_image.c:10000:3: warning: ‘Py_OptimizeFlag’ is deprecated [-Wdeprecated-declarations]
  10000 |   if (unlikely(!Py_OptimizeFlag)) {
        |   ^~
  In file included from /usr/include/python3.12/Python.h:48:
  /usr/include/python3.12/cpython/pydebug.h:13:37: note: declared here
     13 | Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag;
        |                                     ^~~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_Raise’:
  wordcloud/query_integral_image.c:18119:34: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘curexc_traceback’
  18119 |         PyObject* tmp_tb = tstate->curexc_traceback;
        |                                  ^~
  wordcloud/query_integral_image.c:18122:19: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘curexc_traceback’
  18122 |             tstate->curexc_traceback = tb;
        |                   ^~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyUnicode_Equals’:
  wordcloud/query_integral_image.c:557:51: warning: implicit declaration of function ‘_PyUnicode_Ready’; did you mean ‘PyUnicode_READY’? [-Wimplicit-function-declaration]
    557 |                                               0 : _PyUnicode_Ready((PyObject *)(op)))
        |                                                   ^~~~~~~~~~~~~~~~
  wordcloud/query_integral_image.c:937:43: note: in definition of macro ‘unlikely’
    937 |   #define unlikely(x) __builtin_expect(!!(x), 0)
        |                                           ^
  wordcloud/query_integral_image.c:18304:22: note: in expansion of macro ‘__Pyx_PyUnicode_READY’
  18304 |         if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
        |                      ^~~~~~~~~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_get_tp_dict_version’:
  wordcloud/query_integral_image.c:18585:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  18585 |     return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
        |     ^~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_get_object_dict_version’:
  wordcloud/query_integral_image.c:18597:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  18597 |     return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
        |     ^~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_object_dict_version_matches’:
  wordcloud/query_integral_image.c:18601:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  18601 |     if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
        |     ^~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx__GetModuleGlobalName’:
  wordcloud/query_integral_image.c:18618:5: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  18618 |     __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
        |     ^~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyInt_AddObjC’:
  wordcloud/query_integral_image.c:19027:51: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  19027 |         const digit* digits = ((PyLongObject*)op1)->ob_digit;
        |                                                   ^~
  wordcloud/query_integral_image.c: In function ‘__Pyx_CLineForTraceback’:
  wordcloud/query_integral_image.c:19381:9: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  19381 |         __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
        |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c:19381:9: warning: ‘ma_version_tag’ is deprecated [-Wdeprecated-declarations]
  19381 |         __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
        |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/python3.12/cpython/dictobject.h:22:34: note: declared here
     22 |     Py_DEPRECATED(3.12) uint64_t ma_version_tag;
        |                                  ^~~~~~~~~~~~~~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyInt_As_int’:
  wordcloud/query_integral_image.c:20562:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  20562 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c:20617:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  20617 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyInt_As_long’:
  wordcloud/query_integral_image.c:20796:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  20796 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c:20851:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  20851 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyInt_As_char’:
  wordcloud/query_integral_image.c:21030:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  21030 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c:21085:53: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  21085 |             const digit* digits = ((PyLongObject*)x)->ob_digit;
        |                                                     ^~
  wordcloud/query_integral_image.c: In function ‘__Pyx_PyIndex_AsSsize_t’:
  wordcloud/query_integral_image.c:21436:45: error: ‘PyLongObject’ {aka ‘struct _longobject’} has no member named ‘ob_digit’
  21436 |     const digit* digits = ((PyLongObject*)b)->ob_digit;
        |                                             ^~
  error: command '/usr/lib64/ccache/gcc' failed with exit code 1
  error: subprocess-exited-with-error

  × Building wheel for wordcloud (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> See above for output.

  note: This error originates from a subprocess, and is likely not a problem with pip.
  full command: /usr/bin/python3 /usr/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py build_wheel /builddir/build/BUILD/wordcloud-1.9.2/.pyproject-builddir/tmp_t540371
  cwd: /builddir/build/BUILD/wordcloud-1.9.2
  Building wheel for wordcloud (pyproject.toml): finished with status 'error'
  ERROR: Failed building wheel for wordcloud
Failed to build wordcloud
ERROR: Failed to build one or more wheels
error: Bad exit status from /var/tmp/rpm-tmp.qGl6ju (%build)
    Bad exit status from /var/tmp/rpm-tmp.qGl6ju (%build)
amueller commented 1 year ago

you probably need to recreate the cython code. Python3.12 isn't released yet, I was gonna add a built job for it once it's released.

T1t4m1un commented 11 months ago

you can install cython and modify your setup.py like this:

import io
from setuptools import setup
from setuptools.extension import Extension
import versioneer

from Cython.Build import cythonize

with io.open('README.md', encoding='utf_8') as fp:
    readme = fp.read()

setup(
    author="Andreas Mueller",
    author_email="t3kcit+wordcloud@gmail.com",
    name='wordcloud',
    version=versioneer.get_version(),
    cmdclass=versioneer.get_cmdclass(),
    url='https://github.com/amueller/word_cloud',
    description='A little word cloud generator',
    long_description=readme,
    long_description_content_type='text/markdown; charset=UTF-8',
    license='MIT',
    install_requires=['numpy>=1.6.1', 'pillow', 'matplotlib'],
    # ext_modules=[Extension("wordcloud.query_integral_image",
    #                        ["wordcloud/query_integral_image.c"])],
    ext_modules=cythonize("wordcloud/query_integral_image.pyx"),
    entry_points={'console_scripts': ['wordcloud_cli=wordcloud.__main__:main']},
    packages=['wordcloud'],
    package_data={'wordcloud': ['stopwords', 'DroidSansMono.ttf']}
)

replace the pre-generate cython source code path with cythonize, generate the correct code