view Makefile.freebsd @ 44:0a8b06e38e19

Need "packaging" at wheel build time too. Parsing of version_p into a tuple now is done at build time.
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 11 Oct 2025 17:16:23 +0200
parents 8934ac156ef5
children
line wrap: on
line source

# -*- mode: makefile; coding: utf-8 -*-
#
# Needs GNU make (aka gmake) and binutils/ar or LLVM/ar
# (instead of FreeBSD /usr/bin/ar).
#
# Building against an installed mupdf package fails because the libmupdfcpp.so
# is missing.
#
# Prepare:
#
# - Create a Python  venv and activate it
#
# - Install a LLVM package that has the same version as the libclang
#   Python package that will be used/installed
#   (e.g. pkg install llvm18 because of libclang>=18,<19)
#
# - In the "bin"-directory of the venv symlink "make" to /usr/local/bin/gmake
#   and "ar" to /usr/local/llvm18/bin/llvm-ar
#
#   * Makefiles have GNU syntax
#   * ar is called with @-response-files -- which are a GNU feature (also
#     implemented by LLVM's ar)
#
# - At first to not build with tesseract (OCR)
#
#     export PYMUPDF_SETUP_MUPDF_TESSERACT=0
#

.PHONY: all wheel sdist populate-venv check

.SILENT: check

THIS_MAKEFILE_JUSTNAME:=	$(firstword $(MAKEFILE_LIST))
THIS_MAKEFILE_DIR:=		$(abspath $(dir $(THIS_MAKEFILE_JUSTNAME)))

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)'

#
# Setting these does not work for some parts built by sub-makes.
# Symlink in the venv instead.
#
#CC=	$(CLANG_DIR)/bin/clang
#CXX=	$(CLANG_DIR)/bin/clang++

# Define _FORTIFY_SOURCE=$(FORTIFY) (if != 0, default 0)
FORTIFY?=	3
#
# If != 0 (default 1):
#    -fno-delete-null-pointer-checks
#
#       Should always be done when fortifying:
#       https://github.com/ossf/wg-best-practices-os-developers/issues/659
#
#    -Werror=implicit-function-declaration
#    -fstack-clash-protection
#    -fstack-protector-strong
#
EXTRA_CHECKS?=	1


all: sdist wheel


wheel: check
	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/make || $(SYMLINK) $(LOCALBASE)/bin/gmake $(firstword $(PYTHON_PREFIXES))/bin/make
	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/ar || $(SYMLINK) $(CLANG_DIR)/bin/llvm-ar $(firstword $(PYTHON_PREFIXES))/bin/ar
	$(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) 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) PYMUPDF_SETUP_LIBCLANG='$(PYMUPDF_SETUP_LIBCLANG)' $(PYTHON) -m build --sdist --verbose --no-isolation


populate-venv:
ifneq ($(firstword $(PYTHON_PREFIXES)),$(lastword $(PYTHON_PREFIXES)))
	$(PYTHON) -m pip install -U -r requirements-build.txt
else
	$(error Not in a Python virtual environment)
endif


check:
ifneq ($(firstword $(PYTHON_PREFIXES)),$(lastword $(PYTHON_PREFIXES)))
	$(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*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
	$(TEST) -x $(CLANG_DIR)/bin/clang
	$(TEST) -x $(CLANG_DIR)/bin/clang++
	$(TEST) -x $(CLANG_DIR)/bin/ld.lld
else
	$(error Not in a Python virtual environment)
endif