Unstructured-IO / Unstructured-IO/unstructured

Vanilla `unstructured` via `uvx` fails with `Failed to build llvmlite`

Open
#4,390 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
HTML
Stars
15.5k
Forks
1.3k
Avg merge
4d 2h
Merged PRs (30d)
13

Description

Describe the bug
When installing unstructured with uv, we are occasionally hit by such error messages, both on Python 3.13/3.14 on macOS, and on CI/GHA.

`llvmlite` (v0.36.0) was included because `pueblo[all]` (v0.0.0) depends on `unstructured` (v0.18.32) which depends on `numba` (v0.53.1) which depends on `llvmlite`

To Reproduce

uvx --python=3.14 unstructured --version

Expected behavior
Vanilla unstructured installs without ado, and sheds any problematic dependencies under corresponding extra sections, so they can be optionally selected.

References

  • GH-4216

Screenshots

  × Failed to build `llvmlite==0.48.0`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1)

      [stdout]
      running bdist_wheel
      -- Configuring incomplete, errors occurred!
      Running: cmake -G Unix Makefiles /Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi

      [stderr]
      /Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/_vendor/wheel/bdist_wheel.py:4: FutureWarning: The 'wheel' package is
      no longer the canonical location of the 'bdist_wheel' command, and will be removed in a future release. Please update to setuptools v70.1 or later which
      contains an integrated version of this command.
        warn(
      CMake Error at CMakeLists.txt:21 (find_package):
        Could not find a package configuration file provided by "LLVM" with any of
        the following names:

          LLVM.cps
          llvm.cps
          LLVMConfig.cmake
          llvm-config.cmake

        Add the installation prefix of "LLVM" to CMAKE_PREFIX_PATH or set
        "LLVM_DIR" to a directory containing one of the above files.  If "LLVM"
        provides a separate development package or SDK, be sure it has been
        installed.


      Traceback (most recent call last):
        File "/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi/build.py", line 213, in <module>
          main()
          ~~~~^^
        File "/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi/build.py", line 207, in main
          main_posix('.dylib')
          ~~~~~~~~~~^^^^^^^^^^
        File "/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi/build.py", line 193, in main_posix
          try_cmake(here_dir, build_dir, generator)
          ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi/build.py", line 127, in try_cmake
          subprocess.check_call(args)
          ~~~~~~~~~~~~~~~~~~~~~^^^^^^
        File "/usr/local/Cellar/python@3.14/3.14.6/Frameworks/Python.framework/Versions/3.14/lib/python3.14/subprocess.py", line 420, in check_call
          raise CalledProcessError(retcode, cmd)
      subprocess.CalledProcessError: Command '['cmake', '-G', 'Unix Makefiles', '/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi']'
      returned non-zero exit status 1.
      Traceback (most recent call last):
        File "<string>", line 11, in <module>
          wheel_filename = backend.build_wheel("/Users/amo/.cache/uv/builds-v0/.tmpwbF1Qg", {}, None)
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/build_meta.py", line 438, in build_wheel
          return _build(['bdist_wheel'])
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/build_meta.py", line 429, in _build
          return self._build_with_temp_dir(
                 ~~~~~~~~~~~~~~~~~~~~~~~~~^
              cmd,
              ^^^^
          ...<3 lines>...
              self._arbitrary_args(config_settings),
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/build_meta.py", line 410, in _build_with_temp_dir
          self.run_setup()
          ~~~~~~~~~~~~~~^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/build_meta.py", line 520, in run_setup
          super().run_setup(setup_script=setup_script)
          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
          ~~~~^^^^^^^^^^^^^^^^
        File "<string>", line 200, in <module>
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/__init__.py", line 117, in setup
          return distutils.core.setup(**attrs)  # type: ignore[return-value]
                 ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/_distutils/core.py", line 186, in setup
          return run_commands(dist)
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/_distutils/core.py", line 202, in run_commands
          dist.run_commands()
          ~~~~~~~~~~~~~~~~~^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/_distutils/dist.py", line 1001, in run_commands
          self.run_command(cmd)
          ~~~~~~~~~~~~~~~~^^^^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/dist.py", line 1107, in run_command
          super().run_command(command)
          ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/lib/python3.14/site-packages/setuptools/_distutils/dist.py", line 1020, in run_command
          cmd_obj.run()
          ~~~~~~~~~~~^^
        File "<string>", line 170, in run
        File "<string>", line 62, in build_library_files
        File "/usr/local/Cellar/python@3.14/3.14.6/Frameworks/Python.framework/Versions/3.14/lib/python3.14/subprocess.py", line 578, in run
          raise CalledProcessError(retcode, process.args,
                                   output=stdout, stderr=stderr)
      subprocess.CalledProcessError: Command '['/Users/amo/.cache/uv/builds-v0/.tmpDuVfmH/bin/python',
      '/Users/amo/.cache/uv/sdists-v9/pypi/llvmlite/0.48.0/x4aIZFmv-9FKFAEu/src/ffi/build.py']' returned non-zero exit status 1.


hint: `llvmlite` (v0.48.0) was included because `unstructured` (v0.23.1) depends on `numba` (v0.66.0) which depends on `llvmlite`
hint: Build failures usually indicate a problem with the package or the build environment

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the issue with uvx --python=3.14 unstructured --version and inspect the package dependency declarations and extras. The change is done when vanilla unstructured installs without attempting to build llvmlite or numba, while those dependencies remain available through the appropriate optional extras.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
build-system, developer-experience
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.