Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 03 Jun 2026 16:13:43 +0000
From:      Yuri Victorovich <yuri@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: bf4406f863dd - main - misc/ollama: update 0.24.=?utf-8?Q?0 =E2=86=92 0.?=30.0
Message-ID:  <6a2052b7.43736.73e8ef24@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=bf4406f863dd0f71096a283a1b8f3577f28c9249

commit bf4406f863dd0f71096a283a1b8f3577f28c9249
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2026-06-03 14:21:19 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2026-06-03 16:13:38 +0000

    misc/ollama: update 0.24.0 → 0.30.0
---
 misc/ollama/Makefile                               | 144 ++++++++++++++----
 misc/ollama/distinfo                               |  24 +--
 misc/ollama/files/freebsd-compatibility.patch      | 165 +--------------------
 misc/ollama/files/patch-CMakeLists.txt             |   2 +-
 misc/ollama/files/patch-discover_cpu__freebsd.go   |  69 +++++++++
 ...h-ml_backend_ggml_ggml_src_ggml-backend-reg.cpp |  18 ---
 misc/ollama/files/patch-ml_path.go                 |  23 +--
 .../files/patch-x_imagegen_mlx_CMakeLists.txt      |  40 -----
 misc/ollama/files/patch-x_imagegen_mlx_mlx.go      |  50 +++----
 9 files changed, 229 insertions(+), 306 deletions(-)

diff --git a/misc/ollama/Makefile b/misc/ollama/Makefile
index 9d4eabc111b6..d3bfb1abb147 100644
--- a/misc/ollama/Makefile
+++ b/misc/ollama/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	ollama
 DISTVERSIONPREFIX=	v
-DISTVERSION=	0.24.0
+DISTVERSION=	0.30.0
 CATEGORIES=	misc # machine-learning
 
 MAINTAINER=	yuri@FreeBSD.org
@@ -20,41 +20,70 @@ BUILD_DEPENDS=	bash:shells/bash \
 		patchelf:sysutils/patchelf
 
 USES=		cmake:indirect go:1.26+,modules localbase pkgconfig
+USE_LDCONFIG=	${PREFIX}/lib/ollama ${PREFIX}/lib/ollama/vulkan
 USE_RC_SUBR=	ollama
 
 GO_MODULE=	github.com/yurivict/${PORTNAME} # fork with FreeBSD patches
 GO_TARGET=	.
 GO_ENV+=	CGO_CXXFLAGS="${CXXFLAGS}"
 
+LLAMA_CPP_VERSION=	b9452
+GGML_SO_VERSION=	0.13.1	# tied to LLAMA_CPP_VERSION; update when llama.cpp changes
 MLX_CORE_VERSION=	0.31.2
 MLX_C_VERSION=		fba4470b89073180056c9ea46c443051375f7399
 JSON_VERSION=		3.11.3
 
+DISTFILES+=	${LLAMA_CPP_VERSION}.tar.gz:llamasrc
+MASTER_SITES+=	https://github.com/ggml-org/llama.cpp/archive/refs/tags/:llamasrc
+
 PLIST_FILES=	bin/${PORTNAME} \
 		bin/ollama-limit-gpu-layers
 
-XARCH!=		uname -p
-
 OPTIONS_GROUP=		BACKENDS
 OPTIONS_GROUP_BACKENDS=	CPU VULKAN MLX
 OPTIONS_DEFAULT=	CPU VULKAN MLX
 
 CPU_DESC=		Build CPU backend shared libraries for various SIMD instruction sets
-CPU_PLIST_FILES=	lib/ollama/libggml-base.so \
-			lib/ollama/libggml-base.so.0
-.if ${XARCH} == "amd64" || ${XARCH} == "i386"
+CPU_PLIST_FILES=	lib/ollama/llama-server \
+			lib/ollama/llama-quantize \
+			lib/ollama/libggml-base.so \
+			lib/ollama/libggml-base.so.0 \
+			lib/ollama/libggml-base.so.${GGML_SO_VERSION} \
+			lib/ollama/libggml.so \
+			lib/ollama/libggml.so.0 \
+			lib/ollama/libggml.so.${GGML_SO_VERSION} \
+			lib/ollama/libllama-common.so \
+			lib/ollama/libllama-common.so.0 \
+			lib/ollama/libllama-common.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+			lib/ollama/libllama-quantize-impl.so \
+			lib/ollama/libllama-server-impl.so \
+			lib/ollama/libllama.so \
+			lib/ollama/libllama.so.0 \
+			lib/ollama/libllama.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+			lib/ollama/libmtmd.so \
+			lib/ollama/libmtmd.so.0 \
+			lib/ollama/libmtmd.so.0.0.${LLAMA_CPP_VERSION:S/b//}
+.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
 CPU_PLIST_FILES+=	lib/ollama/libggml-cpu-alderlake.so \
+			lib/ollama/libggml-cpu-cannonlake.so \
+			lib/ollama/libggml-cpu-cascadelake.so \
+			lib/ollama/libggml-cpu-cooperlake.so \
 			lib/ollama/libggml-cpu-haswell.so \
 			lib/ollama/libggml-cpu-icelake.so \
+			lib/ollama/libggml-cpu-ivybridge.so \
+			lib/ollama/libggml-cpu-piledriver.so \
 			lib/ollama/libggml-cpu-sandybridge.so \
+			lib/ollama/libggml-cpu-sapphirerapids.so \
 			lib/ollama/libggml-cpu-skylakex.so \
 			lib/ollama/libggml-cpu-sse42.so \
-			lib/ollama/libggml-cpu-x64.so
+			lib/ollama/libggml-cpu-x64.so \
+			lib/ollama/libggml-cpu-zen4.so
 .endif
 
 VULKAN_DESC=		Build Vulkan GPU backend shared library
 VULKAN_BUILD_DEPENDS=	glslc:graphics/shaderc \
-			${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers
+			${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers \
+			${LOCALBASE}/share/cmake/SPIRV-Headers/SPIRV-HeadersConfig.cmake:graphics/spirv-headers
 VULKAN_LIB_DEPENDS=	libvulkan.so:graphics/vulkan-loader
 VULKAN_PLIST_FILES=	lib/ollama/vulkan/libggml-vulkan.so
 
@@ -63,10 +92,20 @@ MLX_BUILD_DEPENDS=	${LOCALBASE}/lib/cmake/fmt/fmt-config.cmake:devel/libfmt
 MLX_LIB_DEPENDS=	libopenblas.so:math/openblas
 MLX_PLIST_FILES=	lib/ollama/libmlx.so \
 			lib/ollama/libmlxc.so
-_CMAKE_FLAGS=	-DCMAKE_BUILD_TYPE=Release -DGGML_BACKEND_DL=ON -DGGML_BACKEND_DIR=${PREFIX}/lib/ollama
+
+_CMAKE_FLAGS=	-DCMAKE_BUILD_TYPE=Release \
+		-DGGML_BACKEND_DL=ON \
+		-DGGML_BACKEND_DIR=${PREFIX}/lib/ollama \
+		-DFETCHCONTENT_FULLY_DISCONNECTED=ON \
+		-DFETCHCONTENT_SOURCE_DIR_LLAMA_CPP=${WRKDIR}/llama.cpp-${LLAMA_CPP_VERSION} \
+		-DLLAMA_BUILD_NUMBER=${LLAMA_CPP_VERSION:S/b//}
 
 .include <bsd.port.options.mk>
 
+.if ${PORT_OPTIONS:MVULKAN}
+_CMAKE_FLAGS+=	-DOLLAMA_LLAMA_BACKENDS=vulkan
+.endif
+
 .if ${PORT_OPTIONS:MMLX}
 GO_BUILDFLAGS+=	-tags mlx
 DISTFILES+=	v${MLX_CORE_VERSION}.tar.gz:mlxsrc \
@@ -77,19 +116,19 @@ MASTER_SITES+=	https://github.com/ml-explore/mlx/archive/refs/tags/:mlxsrc \
 		https://github.com/nlohmann/json/releases/download/v${JSON_VERSION}/:jsonsrc
 .endif
 
-CONFLICTS_BUILD=	ggml
-
 post-patch:
-	# update version in go.mod and version.go
+	# Apply llama.cpp compat hooks patch so the llama-server build has Ollama hooks
+	@${PATCH} -d ${WRKDIR}/llama.cpp-${LLAMA_CPP_VERSION} -p1 \
+		< ${WRKSRC}/llama/compat/llama-cpp-hooks.patch
+	# update version in version.go
 	@${REINPLACE_CMD} -e 's|var Version string = "0.0.0"|var Version string = "${PORTVERSION}"|g' \
-		${WRKSRC}/go.mod ${WRKSRC}/version/version.go
+		${WRKSRC}/version/version.go
 
 pre-build-CPU-on:
 	@${MKDIR} ${WRKSRC}/build && \
 		cd ${WRKSRC}/build && \
 		${CMAKE_BIN} ${_CMAKE_FLAGS} .. && \
-		${MAKE_CMD} ggml-base && \
-		${MAKE_CMD} ggml-cpu
+		${MAKE_CMD} ollama-llama-server-local
 
 pre-build-VULKAN-on:
 .if !${PORT_OPTIONS:MCPU} && !${PORT_OPTIONS:MMLX}
@@ -98,7 +137,7 @@ pre-build-VULKAN-on:
 		${CMAKE_BIN} ${_CMAKE_FLAGS} ..
 .endif
 	@cd ${WRKSRC}/build && \
-		${MAKE_CMD} ggml-vulkan
+		${MAKE_CMD} ollama-llama-server-vulkan
 
 post-patch-MLX-on:
 	# FreeBSD compatibility fix: netinet/in.h (defines IPPROTO_TCP) is not
@@ -119,19 +158,18 @@ post-patch-MLX-on:
 		${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/allocator.cpp
 
 pre-build-MLX-on:
-	@${MKDIR} ${WRKSRC}/build && \
-		cd ${WRKSRC}/build && \
+	@${MKDIR} ${WRKSRC}/build-mlx && \
+		cd ${WRKSRC}/build-mlx && \
 		OLLAMA_MLX_SOURCE=${WRKDIR}/mlx-${MLX_CORE_VERSION} \
 		OLLAMA_MLX_C_SOURCE=${WRKDIR}/mlx-c-${MLX_C_VERSION} \
 		${CMAKE_BIN} ${_CMAKE_FLAGS} \
-		-DMLX_ENGINE:BOOL=ON \
 		-DFETCHCONTENT_FULLY_DISCONNECTED:BOOL=ON \
-		-DFETCHCONTENT_SOURCE_DIR_JSON:PATH=${WRKDIR}/json \
 		-DUSE_SYSTEM_FMT:BOOL=ON \
-		-DMLX_BUILD_TESTS:BOOL=OFF \
-		-DMLX_BUILD_EXAMPLES:BOOL=OFF \
-		..
-	@cd ${WRKSRC}/build && \
+		-DFETCHCONTENT_SOURCE_DIR_JSON:PATH=${WRKDIR}/json \
+		-DOLLAMA_SOURCE_DIR:PATH=${WRKSRC} \
+		-S ${WRKSRC}/cmake/mlx \
+		-B ${WRKSRC}/build-mlx
+	@cd ${WRKSRC}/build-mlx && \
 		${MAKE_CMD} mlx mlxc
 
 post-install: # pending https://github.com/ollama/ollama/issues/6407
@@ -139,25 +177,69 @@ post-install: # pending https://github.com/ollama/ollama/issues/6407
 
 post-install-CPU-on:
 	@${MKDIR} ${STAGEDIR}${PREFIX}/lib/ollama
-	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml-base.so \
+	# versioned libggml-base
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml-base.so.${GGML_SO_VERSION} \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${LN} -sf libggml-base.so.${GGML_SO_VERSION} \
+		${STAGEDIR}${PREFIX}/lib/ollama/libggml-base.so.0
+	${LN} -sf libggml-base.so.0 \
+		${STAGEDIR}${PREFIX}/lib/ollama/libggml-base.so
+	# versioned libggml
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml.so.${GGML_SO_VERSION} \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${LN} -sf libggml.so.${GGML_SO_VERSION} \
+		${STAGEDIR}${PREFIX}/lib/ollama/libggml.so.0
+	${LN} -sf libggml.so.0 \
+		${STAGEDIR}${PREFIX}/lib/ollama/libggml.so
+	# versioned libllama-common
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libllama-common.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${LN} -sf libllama-common.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/libllama-common.so.0
+	${LN} -sf libllama-common.so.0 \
+		${STAGEDIR}${PREFIX}/lib/ollama/libllama-common.so
+	# versioned libllama
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libllama.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${LN} -sf libllama.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/libllama.so.0
+	${LN} -sf libllama.so.0 \
+		${STAGEDIR}${PREFIX}/lib/ollama/libllama.so
+	# versioned libmtmd
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libmtmd.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${LN} -sf libmtmd.so.0.0.${LLAMA_CPP_VERSION:S/b//} \
+		${STAGEDIR}${PREFIX}/lib/ollama/libmtmd.so.0
+	${LN} -sf libmtmd.so.0 \
+		${STAGEDIR}${PREFIX}/lib/ollama/libmtmd.so
+	# unversioned impl libs needed at runtime by llama-server and llama-quantize
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libllama-server-impl.so \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libllama-quantize-impl.so \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	# binaries
+	${INSTALL_PROGRAM} ${WRKSRC}/build/lib/ollama/llama-server \
+		${STAGEDIR}${PREFIX}/lib/ollama/
+	${INSTALL_PROGRAM} ${WRKSRC}/build/lib/ollama/llama-quantize \
 		${STAGEDIR}${PREFIX}/lib/ollama/
-	# Create the SONAME symlink so that libggml-vulkan.so and libggml-cpu-*.so
-	# can resolve their NEEDED libggml-base.so.0 dependency via dlopen
-	${LN} -sf libggml-base.so ${STAGEDIR}${PREFIX}/lib/ollama/libggml-base.so.0
+	# cpu-variant SIMD backend DSOs
 	@for f in ${WRKSRC}/build/lib/ollama/libggml-cpu*.so; do \
 		${INSTALL_LIB} $$f ${STAGEDIR}${PREFIX}/lib/ollama/; \
 	done
 
 post-install-VULKAN-on:
 	@${MKDIR} ${STAGEDIR}${PREFIX}/lib/ollama/vulkan
-	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml-vulkan.so \
+	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/vulkan/libggml-vulkan.so \
 		${STAGEDIR}${PREFIX}/lib/ollama/vulkan/
+	# Fix RPATH: libggml-base.so.0 lives in the parent directory
+	patchelf --set-rpath '$$ORIGIN:$$ORIGIN/..' \
+		${STAGEDIR}${PREFIX}/lib/ollama/vulkan/libggml-vulkan.so
 
 post-install-MLX-on:
 	@${MKDIR} ${STAGEDIR}${PREFIX}/lib/ollama
-	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libmlx.so \
+	${INSTALL_LIB} ${WRKSRC}/build-mlx/lib/ollama/libmlx.so \
 		${STAGEDIR}${PREFIX}/lib/ollama/
-	${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libmlxc.so \
+	${INSTALL_LIB} ${WRKSRC}/build-mlx/lib/ollama/libmlxc.so \
 		${STAGEDIR}${PREFIX}/lib/ollama/
 	patchelf --set-rpath '$$ORIGIN' ${STAGEDIR}${PREFIX}/lib/ollama/libmlx.so
 	patchelf --set-rpath '$$ORIGIN' ${STAGEDIR}${PREFIX}/lib/ollama/libmlxc.so
diff --git a/misc/ollama/distinfo b/misc/ollama/distinfo
index 362993e3680e..8168065c92e3 100644
--- a/misc/ollama/distinfo
+++ b/misc/ollama/distinfo
@@ -1,11 +1,13 @@
-TIMESTAMP = 1778897549
-SHA256 (go/misc_ollama/ollama-v0.24.0/v0.31.2.tar.gz) = bdb9b619f80962dd00c0bffb65e59c53f565c2b550f189a1467f8bc6089401ab
-SIZE (go/misc_ollama/ollama-v0.24.0/v0.31.2.tar.gz) = 4251596
-SHA256 (go/misc_ollama/ollama-v0.24.0/fba4470b89073180056c9ea46c443051375f7399.tar.gz) = 398d3d4c6458679dfc9061a3ba56101358279790bc038f60d1f534eac420d552
-SIZE (go/misc_ollama/ollama-v0.24.0/fba4470b89073180056c9ea46c443051375f7399.tar.gz) = 174039
-SHA256 (go/misc_ollama/ollama-v0.24.0/json.tar.xz) = d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d
-SIZE (go/misc_ollama/ollama-v0.24.0/json.tar.xz) = 110988
-SHA256 (go/misc_ollama/ollama-v0.24.0/v0.24.0.mod) = cc887fe117688b46216c1eaed77b787d87971fd80b66514e0354779263775fb8
-SIZE (go/misc_ollama/ollama-v0.24.0/v0.24.0.mod) = 4735
-SHA256 (go/misc_ollama/ollama-v0.24.0/v0.24.0.zip) = 7c6db62aa8a049b30343dc0e77b1579c6af264d4c9d974615712db9ec3e7dbed
-SIZE (go/misc_ollama/ollama-v0.24.0/v0.24.0.zip) = 29025027
+TIMESTAMP = 1780435135
+SHA256 (go/misc_ollama/ollama-v0.30.0/b9452.tar.gz) = 43830a2cb08975d732e3538fa2130105dd528cf929387cc82b2526acdf4c689b
+SIZE (go/misc_ollama/ollama-v0.30.0/b9452.tar.gz) = 33997105
+SHA256 (go/misc_ollama/ollama-v0.30.0/v0.31.2.tar.gz) = bdb9b619f80962dd00c0bffb65e59c53f565c2b550f189a1467f8bc6089401ab
+SIZE (go/misc_ollama/ollama-v0.30.0/v0.31.2.tar.gz) = 4251596
+SHA256 (go/misc_ollama/ollama-v0.30.0/fba4470b89073180056c9ea46c443051375f7399.tar.gz) = 398d3d4c6458679dfc9061a3ba56101358279790bc038f60d1f534eac420d552
+SIZE (go/misc_ollama/ollama-v0.30.0/fba4470b89073180056c9ea46c443051375f7399.tar.gz) = 174039
+SHA256 (go/misc_ollama/ollama-v0.30.0/json.tar.xz) = d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d
+SIZE (go/misc_ollama/ollama-v0.30.0/json.tar.xz) = 110988
+SHA256 (go/misc_ollama/ollama-v0.30.0/v0.30.0.mod) = 1ae536080fb858f852587eb80ce6444999da8700d05736083d4a5d689ce25861
+SIZE (go/misc_ollama/ollama-v0.30.0/v0.30.0.mod) = 4735
+SHA256 (go/misc_ollama/ollama-v0.30.0/v0.30.0.zip) = dda68a74098bb98351bc02ba5a2d9945dc5947de2becf73acf7975a4c4542156
+SIZE (go/misc_ollama/ollama-v0.30.0/v0.30.0.zip) = 28395257
diff --git a/misc/ollama/files/freebsd-compatibility.patch b/misc/ollama/files/freebsd-compatibility.patch
index 9ba04944cf85..e54a3903262e 100644
--- a/misc/ollama/files/freebsd-compatibility.patch
+++ b/misc/ollama/files/freebsd-compatibility.patch
@@ -1,162 +1,3 @@
-diff -ruN a/discover/cpu_freebsd.go b/discover/cpu_freebsd.go
---- a/discover/cpu_freebsd.go	1969-12-31 16:00:00.000000000 -0800
-+++ b/discover/cpu_freebsd.go	2026-01-04 13:08:45.255018000 -0800
-@@ -0,0 +1,122 @@
-+package discover
-+
-+/*
-+#include <stdlib.h>
-+#include <sys/types.h>
-+#include <sys/sysctl.h>
-+*/
-+import "C"
-+
-+import (
-+	"log/slog"
-+	"strings"
-+	"syscall"
-+	"unsafe"
-+)
-+
-+func sysctlUint64(name string) (uint64, error) {
-+	cname := C.CString(name)
-+	defer C.free(unsafe.Pointer(cname))
-+	
-+	var value C.uint64_t
-+	size := C.size_t(unsafe.Sizeof(value))
-+	
-+	ret := C.sysctlbyname(cname, unsafe.Pointer(&value), &size, nil, 0)
-+	if ret != 0 {
-+		return 0, syscall.Errno(ret)
-+	}
-+	
-+	return uint64(value), nil
-+}
-+
-+func GetCPUMem() (memInfo, error) {
-+	var mem memInfo
-+
-+	// Get page size - this is a 32-bit value
-+	pageSize32, err := syscall.SysctlUint32("vm.stats.vm.v_page_size")
-+	if err != nil {
-+		return mem, err
-+	}
-+	pageSize := uint64(pageSize32)
-+
-+	// Get physical memory - use sysctlUint64
-+	physmem, err := sysctlUint64("hw.physmem")
-+	if err != nil {
-+		return mem, err
-+	}
-+
-+	// Get free page count - this is also a 32-bit value
-+	freeCount32, err := syscall.SysctlUint32("vm.stats.vm.v_free_count")
-+	if err != nil {
-+		return mem, err
-+	}
-+	freeCount := uint64(freeCount32)
-+
-+	// Get swap total - use sysctlUint64
-+	swapTotal, err := sysctlUint64("vm.swap_total")
-+	if err != nil {
-+		// Swap may not be configured, default to 0
-+		swapTotal = 0
-+	}
-+
-+	mem.TotalMemory = physmem
-+	mem.FreeMemory = freeCount * pageSize
-+	mem.FreeSwap = swapTotal
-+
-+	slog.Debug("GetCPUMem", "total_memory", mem.TotalMemory, "free_memory", mem.FreeMemory, "free_swap", mem.FreeSwap)
-+
-+	return mem, nil
-+}
-+
-+func GetCPUDetails() []CPU {
-+	var cpus []CPU
-+
-+	// Get CPU model name - this is a string
-+	modelName, err := syscall.Sysctl("hw.model")
-+	if err != nil {
-+		slog.Warn("failed to get CPU model", "error", err)
-+		modelName = "Unknown"
-+	}
-+
-+	// Get number of physical cores - this is a 32-bit integer
-+	cores32, err := syscall.SysctlUint32("kern.smp.cores")
-+	if err != nil {
-+		slog.Warn("failed to get CPU cores", "error", err)
-+		return nil
-+	}
-+	cores := int(cores32)
-+
-+	// Get number of logical CPUs (threads) - this is a 32-bit integer
-+	threads32, err := syscall.SysctlUint32("hw.ncpu")
-+	if err != nil {
-+		slog.Warn("failed to get CPU threads", "error", err)
-+		return nil
-+	}
-+	threads := int(threads32)
-+
-+	// Extract vendor ID from model name if possible
-+	vendorID := ""
-+	modelNameLower := strings.ToLower(modelName)
-+	if strings.Contains(modelNameLower, "intel") {
-+		vendorID = "GenuineIntel"
-+	} else if strings.Contains(modelNameLower, "amd") {
-+		vendorID = "AuthenticAMD"
-+	}
-+
-+	// For FreeBSD, we assume a single socket for now
-+	// In the future, this could be enhanced to detect multi-socket systems
-+	cpu := CPU{
-+		ID:                  "0",
-+		VendorID:            vendorID,
-+		ModelName:           strings.TrimSpace(modelName),
-+		CoreCount:           cores,
-+		EfficiencyCoreCount: 0, // FreeBSD doesn't distinguish efficiency cores
-+		ThreadCount:         threads,
-+	}
-+
-+	cpus = append(cpus, cpu)
-+
-+	slog.Debug("GetCPUDetails", "cpus", cpus)
-+
-+	return cpus
-+}
-diff --git a/go.mod b/go.mod
-index a5bac302..73df7703 100644
---- a/go.mod
-+++ b/go.mod
-@@ -45,6 +45,7 @@ require (
- 	github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect
- 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
- 	github.com/bahlo/generic-list-go v0.2.0 // indirect
-+	github.com/blabber/go-freebsd-sysctl v0.0.0-20201130114544-503969f39d8f // indirect
- 	github.com/buger/jsonparser v1.1.1 // indirect
- 	github.com/bytedance/sonic/loader v0.1.1 // indirect
- 	github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
-diff --git a/go.sum b/go.sum
-index 13dd3563..5582d4ff 100644
---- a/go.sum
-+++ b/go.sum
-@@ -18,6 +18,8 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE
- github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
- github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
- github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
-+github.com/blabber/go-freebsd-sysctl v0.0.0-20201130114544-503969f39d8f h1:gMH+lz/KRpSqdoL+IQjgd91bP1LB8vrVEfNxr47GYC8=
-+github.com/blabber/go-freebsd-sysctl v0.0.0-20201130114544-503969f39d8f/go.mod h1:cTRyHktEaXkKTTEyZ0hAgS7H4V0AVoKhB8Dx0tVr/tY=
- github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
- github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
- github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
-diff -ruN a/llm/llm_freebsd.go b/llm/llm_freebsd.go
---- a/llm/llm_freebsd.go	1969-12-31 16:00:00.000000000 -0800
-+++ b/llm/llm_freebsd.go	2026-01-04 13:08:45.214499000 -0800
-@@ -0,0 +1,7 @@
-+package llm
-+
-+import (
-+	"syscall"
-+)
-+
-+var LlamaServerSysProcAttr = &syscall.SysProcAttr{}
+-- This patch file is intentionally empty.
+-- The FreeBSD-specific files (discover/cpu_freebsd.go, llm/llm_freebsd.go)
+-- are already included in the yurivict/ollama fork source at this version.
diff --git a/misc/ollama/files/patch-CMakeLists.txt b/misc/ollama/files/patch-CMakeLists.txt
index 359b7f60b1f7..0d4b1cc5a0a6 100644
--- a/misc/ollama/files/patch-CMakeLists.txt
+++ b/misc/ollama/files/patch-CMakeLists.txt
@@ -1,6 +1,6 @@
 --- CMakeLists.txt.orig	1979-11-30 08:00:00 UTC
 +++ CMakeLists.txt
-@@ -52,6 +52,10 @@ if(APPLE)
+@@ -45,6 +45,10 @@ if(APPLE)
      set(CMAKE_BUILD_RPATH "@loader_path")
      set(CMAKE_INSTALL_RPATH "@loader_path")
      set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
diff --git a/misc/ollama/files/patch-discover_cpu__freebsd.go b/misc/ollama/files/patch-discover_cpu__freebsd.go
new file mode 100644
index 000000000000..d898b22e0538
--- /dev/null
+++ b/misc/ollama/files/patch-discover_cpu__freebsd.go
@@ -0,0 +1,69 @@
+-- Remove GetCPUDetails() which references an undefined CPU struct type, and
+-- the unused "strings" import. GetCPUDetails() is not called anywhere in the
+-- codebase and the CPU type does not exist in 0.30.0.
+--- discover/cpu_freebsd.go.orig	2026-06-02 21:48:58 UTC
++++ discover/cpu_freebsd.go
+@@ -9,7 +9,6 @@ import (
+ 
+ import (
+ 	"log/slog"
+-	"strings"
+ 	"syscall"
+ 	"unsafe"
+ )
+@@ -68,55 +67,3 @@ func GetCPUMem() (memInfo, error) {
+ 	return mem, nil
+ }
+ 
+-func GetCPUDetails() []CPU {
+-	var cpus []CPU
+-
+-	// Get CPU model name - this is a string
+-	modelName, err := syscall.Sysctl("hw.model")
+-	if err != nil {
+-		slog.Warn("failed to get CPU model", "error", err)
+-		modelName = "Unknown"
+-	}
+-
+-	// Get number of physical cores - this is a 32-bit integer
+-	cores32, err := syscall.SysctlUint32("kern.smp.cores")
+-	if err != nil {
+-		slog.Warn("failed to get CPU cores", "error", err)
+-		return nil
+-	}
+-	cores := int(cores32)
+-
+-	// Get number of logical CPUs (threads) - this is a 32-bit integer
+-	threads32, err := syscall.SysctlUint32("hw.ncpu")
+-	if err != nil {
+-		slog.Warn("failed to get CPU threads", "error", err)
+-		return nil
+-	}
+-	threads := int(threads32)
+-
+-	// Extract vendor ID from model name if possible
+-	vendorID := ""
+-	modelNameLower := strings.ToLower(modelName)
+-	if strings.Contains(modelNameLower, "intel") {
+-		vendorID = "GenuineIntel"
+-	} else if strings.Contains(modelNameLower, "amd") {
+-		vendorID = "AuthenticAMD"
+-	}
+-
+-	// For FreeBSD, we assume a single socket for now
+-	// In the future, this could be enhanced to detect multi-socket systems
+-	cpu := CPU{
+-		ID:                  "0",
+-		VendorID:            vendorID,
+-		ModelName:           strings.TrimSpace(modelName),
+-		CoreCount:           cores,
+-		EfficiencyCoreCount: 0, // FreeBSD doesn't distinguish efficiency cores
+-		ThreadCount:         threads,
+-	}
+-
+-	cpus = append(cpus, cpu)
+-
+-	slog.Debug("GetCPUDetails", "cpus", cpus)
+-
+-	return cpus
+-}
diff --git a/misc/ollama/files/patch-ml_backend_ggml_ggml_src_ggml-backend-reg.cpp b/misc/ollama/files/patch-ml_backend_ggml_ggml_src_ggml-backend-reg.cpp
deleted file mode 100644
index c18b4d4f4090..000000000000
--- a/misc/ollama/files/patch-ml_backend_ggml_ggml_src_ggml-backend-reg.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
---- ml/backend/ggml/ggml/src/ggml-backend-reg.cpp.orig	1979-11-30 08:00:00 UTC
-+++ ml/backend/ggml/ggml/src/ggml-backend-reg.cpp
-@@ -545,11 +545,13 @@ static ggml_backend_reg_t ggml_backend_load_best(const
-     std::vector<fs::path> search_paths;
-     if (user_search_path == nullptr) {
- #ifdef GGML_BACKEND_DIR
-+        // On FreeBSD, GGML_BACKEND_DIR is set to the correct library directory
-         search_paths.push_back(fs::u8path(GGML_BACKEND_DIR));
--#endif
--        // default search paths: executable directory, current directory
-+#else
-+        // Fallback: search executable directory and current directory
-         search_paths.push_back(get_executable_path());
-         search_paths.push_back(fs::current_path());
-+#endif
-     } else {
-         search_paths.push_back(fs::u8path(user_search_path));
-     }
diff --git a/misc/ollama/files/patch-ml_path.go b/misc/ollama/files/patch-ml_path.go
index a35427626861..0de8e6e4537d 100644
--- a/misc/ollama/files/patch-ml_path.go
+++ b/misc/ollama/files/patch-ml_path.go
@@ -1,11 +1,14 @@
---- ml/path.go.orig	1979-11-30 08:00:00 UTC
+-- Add FreeBSD to the list of OS cases that look for lib/ollama helpers.
+-- Without this, FreeBSD falls through to the default case and may not
+-- find the llama-server binary at the expected path.
+--- ml/path.go.orig	2026-06-02 21:19:57 UTC
 +++ ml/path.go
-@@ -27,7 +27,7 @@ var LibOllamaPath string = func() string {
- 	switch runtime.GOOS {
- 	case "windows":
- 		libPath = filepath.Join(filepath.Dir(exe), "lib", "ollama")
--	case "linux":
-+	case "linux", "freebsd":
- 		libPath = filepath.Join(filepath.Dir(exe), "..", "lib", "ollama")
- 	case "darwin":
- 		libPath = filepath.Dir(exe)
+@@ -82,7 +82,7 @@ func libOllamaPathCandidates(search libOllamaPathSearc
+ 			// Local dist output and standard installs keep helpers under lib/ollama.
+ 			add(filepath.Join(exeDir, "lib", "ollama"))
+ 			add(filepath.Join(exeDir, "..", "lib", "ollama"))
+-		case "linux":
++		case "linux", "freebsd":
+ 			add(filepath.Join(exeDir, "..", "lib", "ollama"))
+ 			add(filepath.Join(exeDir, "lib", "ollama"))
+ 		case "windows":
diff --git a/misc/ollama/files/patch-x_imagegen_mlx_CMakeLists.txt b/misc/ollama/files/patch-x_imagegen_mlx_CMakeLists.txt
deleted file mode 100644
index f61429b0adfb..000000000000
--- a/misc/ollama/files/patch-x_imagegen_mlx_CMakeLists.txt
+++ /dev/null
@@ -1,40 +0,0 @@
---- x/imagegen/mlx/CMakeLists.txt.orig	2026-04-09 01:41:08 UTC
-+++ x/imagegen/mlx/CMakeLists.txt
-@@ -98,37 +98,6 @@ file(COPY ${_mlx_c_hdrs} DESTINATION "${CMAKE_SOURCE_D
- file(GLOB _mlx_c_hdrs "${mlx-c_SOURCE_DIR}/mlx/c/*.h")
- file(COPY ${_mlx_c_hdrs} DESTINATION "${CMAKE_SOURCE_DIR}/x/mlxrunner/mlx/include/mlx/c/")
- 
--# Regenerate Go/C shim wrappers from the (possibly updated) headers.
--# Skip during cross-compilation — the generated files are arch-independent.
--if(CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR OR NOT APPLE)
--    find_program(GO_EXECUTABLE go REQUIRED)
--    message(STATUS "Regenerating MLX Go wrappers")
--
--    # CGo's probe compilation is sensitive to CGO_CFLAGS/CGO_CXXFLAGS and CC.
--    # Clear them so go generate uses default compiler settings:
--    # - On Windows, CC may contain spaces (e.g., "C:/Program Files/.../cl.exe")
--    #   which breaks CGo's CC parsing.
--    # - On macOS, CGO_CFLAGS with -mmacosx-version-min breaks header search
--    #   when cmake also sets CMAKE_OSX_DEPLOYMENT_TARGET.
--    set(_SAVE_CC "$ENV{CC}")
--    set(_SAVE_CGO_CFLAGS "$ENV{CGO_CFLAGS}")
--    set(_SAVE_CGO_CXXFLAGS "$ENV{CGO_CXXFLAGS}")
--    set(ENV{CC} "")
--    set(ENV{CGO_CFLAGS} "")
--    set(ENV{CGO_CXXFLAGS} "")
--
--    execute_process(
--        COMMAND ${GO_EXECUTABLE} generate ./x/...
--        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
--        COMMAND_ERROR_IS_FATAL ANY
--    )
--
--    set(ENV{CC} "${_SAVE_CC}")
--    set(ENV{CGO_CFLAGS} "${_SAVE_CGO_CFLAGS}")
--    set(ENV{CGO_CXXFLAGS} "${_SAVE_CGO_CXXFLAGS}")
--else()
--    message(STATUS "Skipping MLX Go wrapper generation (cross-compiling)")
--endif()
- 
- # For local dev builds, override MLX_VERSION with git describe output
- if(TARGET mlx_version AND DEFINED FETCHCONTENT_SOURCE_DIR_MLX)
diff --git a/misc/ollama/files/patch-x_imagegen_mlx_mlx.go b/misc/ollama/files/patch-x_imagegen_mlx_mlx.go
index cee6e3f8ef1d..426c4529f9b1 100644
--- a/misc/ollama/files/patch-x_imagegen_mlx_mlx.go
+++ b/misc/ollama/files/patch-x_imagegen_mlx_mlx.go
@@ -1,4 +1,10 @@
---- x/imagegen/mlx/mlx.go.orig	1979-11-30 08:00:00 UTC
+-- FreeBSD compatibility fixes for MLX image generation CGO code.
+-- 1. Add FreeBSD LDFLAGS (-lc++ -ldl) required for C++ runtime and dynamic loading.
+-- 2. Fall back to CPU stream in default_stream() when GPU stream is unavailable (no Metal on FreeBSD).
+-- 3. Use CPU stream for safetensors loading on FreeBSD (Metal eval_gpu not implemented).
+-- 4. Wrap mlx_load_safetensors with safe init mode to capture C++ exceptions as Go errors
+--    instead of process exit(1), enabling proper error reporting to the user.
+--- x/imagegen/mlx/mlx.go.orig	2026-06-03 07:41:51 UTC
 +++ x/imagegen/mlx/mlx.go
 @@ -4,6 +4,7 @@ package mlx
  #cgo CFLAGS: -O3 -I${SRCDIR}/../../mlxrunner/mlx/include -I${SRCDIR}
@@ -8,18 +14,17 @@
  #cgo windows LDFLAGS: -lstdc++
  
  // Use generated wrappers instead of direct MLX headers
-@@ -23,6 +24,10 @@ static inline mlx_stream default_stream() {
+@@ -23,6 +24,9 @@ static inline mlx_stream default_stream() {
  static inline mlx_stream default_stream() {
      if (_default_stream.ctx == NULL) {
          _default_stream = mlx_default_gpu_stream_new();
-+        // On CPU-only systems (no Metal, no CUDA), fall back to the CPU stream.
 +        if (_default_stream.ctx == NULL) {
 +            _default_stream = mlx_default_cpu_stream_new();
 +        }
      }
      return _default_stream;
  }
-@@ -1512,14 +1517,21 @@ func LoadSafetensorsNative(path string) (*SafetensorsF
+@@ -1512,13 +1516,21 @@ func LoadSafetensorsNative(path string) (*SafetensorsF
  	defer C.free(unsafe.Pointer(cPath))
  
  	stream := C.default_stream()
@@ -31,36 +36,15 @@
  	var arrays C.mlx_map_string_to_array
  	var metadata C.mlx_map_string_to_string
 -	if C.mlx_load_safetensors(&arrays, &metadata, cPath, stream) != 0 {
--		return nil, fmt.Errorf("failed to load safetensors: %s", path)
 +	C.mlx_set_safe_init_mode()
-+	rc := C.mlx_load_safetensors(&arrays, &metadata, cPath, stream)
++	ret := C.mlx_load_safetensors(&arrays, &metadata, cPath, stream)
++	if C.mlx_had_init_error() != 0 {
++		msg := C.GoString(C.mlx_get_init_error())
++		C.mlx_set_default_error_mode()
++		return nil, fmt.Errorf("failed to load safetensors: %s (mlx error: %s)", path, msg)
++	}
 +	C.mlx_set_default_error_mode()
-+	if rc != 0 {
-+		errMsg := ""
-+		if C.mlx_had_init_error() != 0 {
-+			errMsg = ": " + C.GoString(C.mlx_get_init_error())
-+		}
-+		return nil, fmt.Errorf("failed to load safetensors: %s%s", path, errMsg)
++	if ret != 0 {
+ 		return nil, fmt.Errorf("failed to load safetensors: %s", path)
  	}
  	return &SafetensorsFile{arrays: arrays, metadata: metadata}, nil
- }
-@@ -1755,12 +1767,17 @@ func findMLXLibrary() string {
- 			return candidate
- 		}
- 
--		// Check exe_dir/lib/ollama/mlx* subdirectories
--		// and exe_dir/../lib/ollama/mlx* (standard bin/lib sibling layout)
-+		// Check exe_dir/lib/ollama and exe_dir/../lib/ollama directly,
-+		// and their mlx* subdirectories (standard bin/lib sibling layout)
- 		for _, libOllamaDir := range []string{
- 			filepath.Join(exeDir, "lib", "ollama"),
- 			filepath.Join(exeDir, "..", "lib", "ollama"),
- 		} {
-+			// Check the directory itself first (FreeBSD/Linux installed layout)
-+			candidate = filepath.Join(libOllamaDir, libName)
-+			if _, err := os.Stat(candidate); err == nil {
-+				return candidate
-+			}
- 			if mlxDirs, err := filepath.Glob(filepath.Join(libOllamaDir, "mlx*")); err == nil {
- 				for _, mlxDir := range mlxDirs {
- 					candidate = filepath.Join(mlxDir, libName)


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a2052b7.43736.73e8ef24>