changeset 38:8934ac156ef5

Allow to build with the PyPI package "clang" instead of "libclang". 1. It seems to be maintained. 2. In the FreeBSD base system there is no pre-built libclang.so. If you need this library you have to install llvm from ports additionally. 2. On FreeBSD there is no pre-built wheel "libclang" with a packaged libclang.so.
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 23 Sep 2025 10:27:15 +0200
parents 1252325c592f
children 71bcc18e306f
files Makefile.freebsd mupdf-source/scripts/wrap/state.py requirements-build.txt
diffstat 3 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.freebsd	Mon Sep 22 11:44:07 2025 +0200
+++ b/Makefile.freebsd	Tue Sep 23 10:27:15 2025 +0200
@@ -36,14 +36,21 @@
 PYMUPDF_SETUP_MUPDF_BUILD?=	$(THIS_MAKEFILE_DIR)/mupdf-source
 # It would compile with tesseract because its sources are vendored by MuPDF
 PYMUPDF_SETUP_MUPDF_TESSERACT?=	0
+#
+# We use clang instead of libclang: On FreeBSD you have to install
+# llvm to get a libclang.so installed; there is no libclang package
+# with a bundled libclang.so. Additionally, libclang currently is not
+# up-to-date with respect to clang versions >= 19.
+#
+PYMUPDF_SETUP_LIBCLANG?=	clang>=18,<19
 LIBCLANG_LIBRARY_PATH?=		$(CLANG_DIR)/lib
+CLANG_DIR?=			/usr/local/llvm18
 
 TEST=				/bin/test
 LOCALBASE?=			/usr/local
 SYMLINK?=			/bin/ln -s
 PYTHON?=			python3
 PYTHON_PREFIXES!=		$(PYTHON) -c 'import sys; print(sys.prefix); print(sys.base_prefix)'
-CLANG_DIR?=			/usr/local/llvm18
 
 #
 # Setting these does not work for some parts built by sub-makes.
@@ -77,11 +84,11 @@
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/cc || $(SYMLINK) $(CLANG_DIR)/bin/clang $(firstword $(PYTHON_PREFIXES))/bin/cc
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/c++ || $(SYMLINK) $(CLANG_DIR)/bin/clang++ $(firstword $(PYTHON_PREFIXES))/bin/c++
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/ld || $(SYMLINK) $(CLANG_DIR)/bin/ld.lld $(firstword $(PYTHON_PREFIXES))/bin/ld
-	FORTIFY=$(FORTIFY) EXTRA_CHECKS=$(EXTRA_CHECKS) PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) $(PYTHON) -m build --wheel --verbose --no-isolation
+	FORTIFY=$(FORTIFY) EXTRA_CHECKS=$(EXTRA_CHECKS) PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) PYMUPDF_SETUP_LIBCLANG='$(PYMUPDF_SETUP_LIBCLANG)' $(PYTHON) -m build --wheel --verbose --no-isolation
 
 
 sdist: check
-	PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) $(PYTHON) -m build --sdist --verbose --no-isolation
+	PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) PYMUPDF_SETUP_LIBCLANG='$(PYMUPDF_SETUP_LIBCLANG)' $(PYTHON) -m build --sdist --verbose --no-isolation
 
 
 populate-venv:
@@ -97,7 +104,9 @@
 	$(PYTHON) -m pip freeze | grep -E '^\s*setuptools-scm==' >/dev/null
 	$(PYTHON) -m pip freeze | grep -E '^\s*build==' >/dev/null
 	$(PYTHON) -m pip freeze | grep -E '^\s*swig==' >/dev/null
-	$(PYTHON) -m pip freeze | grep -E '^\s*libclang==18\.' >/dev/null
+	$(PYTHON) -m pip freeze | grep -E '^\s*clang==18\.' >/dev/null
+	# This covers the "clang" and "libclang" package
+	$(PYTHON) -c 'import clang.cindex' >/dev/null
 	$(TEST) -x $(LOCALBASE)/bin/gmake
 	$(TEST) -x $(LOCALBASE)/bin/cmake
 	$(TEST) -x $(CLANG_DIR)/bin/llvm-ar
--- a/mupdf-source/scripts/wrap/state.py	Mon Sep 22 11:44:07 2025 +0200
+++ b/mupdf-source/scripts/wrap/state.py	Tue Sep 23 10:27:15 2025 +0200
@@ -21,6 +21,12 @@
             f'or (OpenBSD only) `pkg_add py3-llvm.`\n'
             )
     clang = None
+else:
+    if os.environ.get('LIBCLANG_LIBRARY_FILE', None):
+        clang.cindex.Config.set_library_file(os.environ['LIBCLANG_LIBRARY_FILE'])
+    elif os.environ.get('LIBCLANG_LIBRARY_PATH', None):
+        clang.cindex.Config.set_library_path(os.environ['LIBCLANG_LIBRARY_PATH'])
+
 
 omit_fns = [
         'fz_open_file_w',
--- a/requirements-build.txt	Mon Sep 22 11:44:07 2025 +0200
+++ b/requirements-build.txt	Tue Sep 23 10:27:15 2025 +0200
@@ -9,4 +9,4 @@
 setuptools-scm
 build
 swig
-libclang>=18,<19
+clang>=18,<19