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>
