Quokka does not support Python 3.12 (because of capstone)
Due to a problem in capstone, quokka installation fails with Python 3.12 and 3.11.
In Python 3.12
➜ python --version
Python 3.12.2
➜ pip install quokka-project
+ quokka-project==0.5.5
➜ python -c 'import quokka'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "./python312/lib/python3.12/site-packages/quokka/__init__.py", line 24, in <module>
import quokka.analysis
File "./python312/lib/python3.12/site-packages/quokka/analysis/__init__.py", line 19, in <module>
from quokka.analysis.arch import (
File "./python312/lib/python3.12/site-packages/quokka/analysis/arch.py", line 19, in <module>
import capstone
File "./python312/lib/python3.12/site-packages/capstone/__init__.py", line 379, in <module>
import distutils.sysconfig
ModuleNotFoundError: No module named 'distutils'
This is resolved in https://github.com/capstone-engine/capstone/commit/d63211e3acb64fceb8b1c4a0d804b4b027f4ef71 but not yet available on PyPi.
With Python 3.11
➜ python -c 'import quokka'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "./capstone/python311/lib/python3.11/site-packages/quokka/__init__.py", line 24, in <module>
import quokka.analysis
File "./capstone/python311/lib/python3.11/site-packages/quokka/analysis/__init__.py", line 19, in <module>
from quokka.analysis.arch import (
File "./capstone/python311/lib/python3.11/site-packages/quokka/analysis/arch.py", line 19, in <module>
import capstone
File "./python311/lib/python3.11/site-packages/capstone/__init__.py", line 380, in <module>
import pkg_resources
ModuleNotFoundError: No module named 'pkg_resources'
This is solved by installing setuptools.
pip install setuptools
However, this will also fail with the following error on Mac Mx:
➜ python -c 'import quokka'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "./python311/lib/python3.11/site-packages/quokka/__init__.py", line 24, in <module>
import quokka.analysis
File "./python311/lib/python3.11/site-packages/quokka/analysis/__init__.py", line 19, in <module>
from quokka.analysis.arch import (
File "./python311/lib/python3.11/site-packages/quokka/analysis/arch.py", line 19, in <module>
import capstone
File "./capstone/python311/lib/python3.11/site-packages/capstone/__init__.py", line 425, in <module>
_cs = _load_lib(_path)
^^^^^^^^^^^^^^^^
File "./capstone/python311/lib/python3.11/site-packages/capstone/__init__.py", line 398, in _load_lib
return ctypes.cdll.LoadLibrary(lib_file)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.9/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 454, in LoadLibrary
return self._dlltype(name)
^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.9/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 376, in __init__
self._handle = _dlopen(self._name, mode)
^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: dlopen(./python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib, 0x0006): tried: './python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), './python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64'))
This can be solved by compiling the capstone bindings ourselves:
gh repo clone capstone-engine/capstone
cd capstone
./make.sh
cp ./libcapstone.5.dylib .venv/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib
Finally, this work
➜ python -c 'import quokka' && echo "GOOD"
GOOD
Of note, this last issue is fixed in : https://github.com/capstone-engine/capstone/issues/2066
For python 3.12 as you said we need to wait for the capstone pip package to come out. ~~Un~~fortunately python 3.12 broke so many things that it is still not widespread.
For python 3.11 though I cannot reproduce the error you mentioned with No module named 'pkg_resources'
I tried on linux with capstone 5.0.1 and 4.0.2
Which version did you try and on which OS?
Issue capstone-engine/capstone#2066 was closed last week.
As of yesterday, I was able to build with Py 3.12.6 and capstone 5.0.3. Since the issue hasn't gotten a response from the OP, can this be closed?
$ git log -n 1 main
commit baff1bcfcc72e549ed83c100fb7155c4887e83c4 (HEAD -> main, tag: v0.5.7, origin/main, origin/HEAD)
Author: Robin David <[email protected]>
AuthorDate: Tue May 28 23:07:59 2024 +0200
Commit: Robin David <[email protected]>
CommitDate: Tue May 28 23:07:59 2024 +0200
bump to version 0.5.7
$ pip freeze | grep capstone
capstone==5.0.3
$ python -V
Python 3.12.6
$ python -m build .
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (protobuf_distutils, setuptools)
* Getting build dependencies for sdist...
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
* Building sdist...
running sdist
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
running check
creating quokka_project-0.5.7
creating quokka_project-0.5.7/bindings/python/quokka
creating quokka_project-0.5.7/bindings/python/quokka/analysis
creating quokka_project-0.5.7/bindings/python/quokka/backends
creating quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying files to quokka_project-0.5.7...
copying LICENSE -> quokka_project-0.5.7
copying README.md -> quokka_project-0.5.7
copying pyproject.toml -> quokka_project-0.5.7
copying setup.py -> quokka_project-0.5.7
copying bindings/python/quokka/__init__.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/__main__.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/addresser.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/block.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/data.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/exc.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/executable.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/function.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/instruction.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/program.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/py.typed -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/quokka_pb2.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/reference.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/segment.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/structure.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/types.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/utils.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/version.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/analysis/__init__.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/arch.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/calling_convention.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/env.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/replacer.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/utils.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/backends/__init__.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka/backends/capstone.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka/backends/pypcode.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka_project.egg-info/PKG-INFO -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/SOURCES.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/dependency_links.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/entry_points.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/requires.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/top_level.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/SOURCES.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
Writing quokka_project-0.5.7/setup.cfg
Creating tar archive
removing 'quokka_project-0.5.7' (and everything under it)
WARNING Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.
* Building wheel from sdist
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (protobuf_distutils, setuptools)
* Getting build dependencies for wheel...
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
* Building wheel...
running bdist_wheel
running build
running build_py
creating build/lib/quokka
copying bindings/python/quokka/structure.py -> build/lib/quokka
copying bindings/python/quokka/segment.py -> build/lib/quokka
copying bindings/python/quokka/executable.py -> build/lib/quokka
copying bindings/python/quokka/types.py -> build/lib/quokka
copying bindings/python/quokka/addresser.py -> build/lib/quokka
copying bindings/python/quokka/function.py -> build/lib/quokka
copying bindings/python/quokka/exc.py -> build/lib/quokka
copying bindings/python/quokka/instruction.py -> build/lib/quokka
copying bindings/python/quokka/__init__.py -> build/lib/quokka
copying bindings/python/quokka/utils.py -> build/lib/quokka
copying bindings/python/quokka/data.py -> build/lib/quokka
copying bindings/python/quokka/reference.py -> build/lib/quokka
copying bindings/python/quokka/quokka_pb2.py -> build/lib/quokka
copying bindings/python/quokka/program.py -> build/lib/quokka
copying bindings/python/quokka/block.py -> build/lib/quokka
copying bindings/python/quokka/__main__.py -> build/lib/quokka
copying bindings/python/quokka/version.py -> build/lib/quokka
creating build/lib/quokka/analysis
copying bindings/python/quokka/analysis/__init__.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/env.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/arch.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/replacer.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/utils.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/calling_convention.py -> build/lib/quokka/analysis
creating build/lib/quokka/backends
copying bindings/python/quokka/backends/__init__.py -> build/lib/quokka/backends
copying bindings/python/quokka/backends/pypcode.py -> build/lib/quokka/backends
copying bindings/python/quokka/backends/capstone.py -> build/lib/quokka/backends
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
copying bindings/python/quokka/py.typed -> build/lib/quokka
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/quokka
copying build/lib/quokka/structure.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/segment.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/executable.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/types.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/addresser.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/function.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/exc.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/instruction.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/utils.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/data.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/reference.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/quokka_pb2.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/program.py -> build/bdist.linux-x86_64/wheel/./quokka
creating build/bdist.linux-x86_64/wheel/quokka/analysis
copying build/lib/quokka/analysis/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/env.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/arch.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/replacer.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/utils.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/calling_convention.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
creating build/bdist.linux-x86_64/wheel/quokka/backends
copying build/lib/quokka/backends/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/backends/pypcode.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/backends/capstone.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/py.typed -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/block.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/__main__.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/version.py -> build/bdist.linux-x86_64/wheel/./quokka
running install_egg_info
Copying bindings/python/quokka_project.egg-info to build/bdist.linux-x86_64/wheel/./quokka_project-0.5.7-py3.12.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/quokka_project-0.5.7.dist-info/WHEEL
creating 'build/quarkslab.quokka/dist/.tmp-ylcm8pqo/quokka_project-0.5.7-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'quokka/__init__.py'
adding 'quokka/__main__.py'
adding 'quokka/addresser.py'
adding 'quokka/block.py'
adding 'quokka/data.py'
adding 'quokka/exc.py'
adding 'quokka/executable.py'
adding 'quokka/function.py'
adding 'quokka/instruction.py'
adding 'quokka/program.py'
adding 'quokka/py.typed'
adding 'quokka/quokka_pb2.py'
adding 'quokka/reference.py'
adding 'quokka/segment.py'
adding 'quokka/structure.py'
adding 'quokka/types.py'
adding 'quokka/utils.py'
adding 'quokka/version.py'
adding 'quokka/analysis/__init__.py'
adding 'quokka/analysis/arch.py'
adding 'quokka/analysis/calling_convention.py'
adding 'quokka/analysis/env.py'
adding 'quokka/analysis/replacer.py'
adding 'quokka/analysis/utils.py'
adding 'quokka/backends/__init__.py'
adding 'quokka/backends/capstone.py'
adding 'quokka/backends/pypcode.py'
adding 'quokka_project-0.5.7.dist-info/LICENSE'
adding 'quokka_project-0.5.7.dist-info/METADATA'
adding 'quokka_project-0.5.7.dist-info/WHEEL'
adding 'quokka_project-0.5.7.dist-info/entry_points.txt'
adding 'quokka_project-0.5.7.dist-info/top_level.txt'
adding 'quokka_project-0.5.7.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built quokka_project-0.5.7.tar.gz and quokka_project-0.5.7-py3-none-any.whl