diff --git a/misc/ollama/Makefile b/misc/ollama/Makefile index 072f8c65a793..70a5be527b30 100644 --- a/misc/ollama/Makefile +++ b/misc/ollama/Makefile @@ -1,172 +1,172 @@ PORTNAME= ollama DISTVERSIONPREFIX= v -DISTVERSION= 0.20.7 +DISTVERSION= 0.21.0 CATEGORIES= misc # machine-learning MAINTAINER= yuri@FreeBSD.org COMMENT= Run Llama 2, Mistral, and other large language models WWW= https://ollama.com \ https://github.com/ollama/ollama LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE BROKEN_i386= fails to compile: x/mlxrunner/mlx/memory.go:40:11: 1 << (4 * 10) (untyped int constant 1099511627776) overflows int BUILD_DEPENDS= bash:shells/bash \ ${LOCALBASE}/include/miniaudio/miniaudio.h:audio/miniaudio \ ${LOCALBASE}/include/nlohmann/json_fwd.hpp:devel/nlohmann-json \ ${LOCALBASE}/include/stb/stb_image.h:devel/stb \ patchelf:sysutils/patchelf USES= cmake:indirect go:1.24+,modules localbase pkgconfig USE_RC_SUBR= ollama GO_MODULE= github.com/yurivict/${PORTNAME} # fork with FreeBSD patches GO_TARGET= . GO_ENV+= CGO_CXXFLAGS="${CXXFLAGS}" MLX_CORE_VERSION= 0.31.1 MLX_C_VERSION= 0.6.0 JSON_VERSION= 3.11.3 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/libggml-cpu-alderlake.so \ lib/ollama/libggml-cpu-haswell.so \ lib/ollama/libggml-cpu-icelake.so \ lib/ollama/libggml-cpu-sandybridge.so \ lib/ollama/libggml-cpu-skylakex.so \ lib/ollama/libggml-cpu-sse42.so \ lib/ollama/libggml-cpu-x64.so .endif VULKAN_DESC= Build Vulkan GPU backend shared library VULKAN_BUILD_DEPENDS= glslc:graphics/shaderc \ ${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers VULKAN_LIB_DEPENDS= libvulkan.so:graphics/vulkan-loader VULKAN_PLIST_FILES= lib/ollama/vulkan/libggml-vulkan.so MLX_DESC= Build MLX backend for image generation (CPU) 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 .include .if ${PORT_OPTIONS:MMLX} GO_BUILDFLAGS+= -tags mlx DISTFILES+= v${MLX_CORE_VERSION}.tar.gz:mlxsrc \ v${MLX_C_VERSION}.tar.gz:mlxcsrc \ json.tar.xz:jsonsrc MASTER_SITES+= https://github.com/ml-explore/mlx/archive/refs/tags/:mlxsrc \ https://github.com/ml-explore/mlx-c/archive/refs/tags/:mlxcsrc \ https://github.com/nlohmann/json/releases/download/v${JSON_VERSION}/:jsonsrc .endif CONFLICTS_BUILD= ggml post-patch: # change import path to the fork @cd ${WRKSRC} && \ (${GREP} -rl ollama/ollama | ${XARGS} ${REINPLACE_CMD} -i '' -e 's|ollama/ollama|yurivict/ollama|g') # update version in go.mod and version.go @${REINPLACE_CMD} -e 's|var Version string = "0.0.0"|var Version string = "${PORTVERSION}"|g' \ ${WRKSRC}/go.mod ${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 pre-build-VULKAN-on: .if !${PORT_OPTIONS:MCPU} && !${PORT_OPTIONS:MMLX} @${MKDIR} ${WRKSRC}/build && \ cd ${WRKSRC}/build && \ ${CMAKE_BIN} ${_CMAKE_FLAGS} .. .endif @cd ${WRKSRC}/build && \ ${MAKE_CMD} ggml-vulkan post-patch-MLX-on: # FreeBSD compatibility fix: netinet/in.h (defines IPPROTO_TCP) is not # pulled in transitively by netinet/tcp.h on FreeBSD as it is on Linux. @${AWK} '/^#include /{print "#include ";print;next}1' \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/distributed/ring/ring.cpp > \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/distributed/ring/ring.cpp.new && \ ${MV} ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/distributed/ring/ring.cpp.new \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/distributed/ring/ring.cpp # FreeBSD memory size fix: add hw.physmem sysctl query so MLX sets its # memory_limit from actual RAM instead of using the 8 GB hardcoded fallback. ${INSTALL_DATA} ${FILESDIR}/freebsd_memory.h \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/freebsd_memory.h @${AWK} '/^#elif defined\(__linux__\)/{print "#elif defined(__FreeBSD__)";print "#include \"mlx/backend/no_gpu/freebsd_memory.h\"";print;next}1' \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/allocator.cpp > \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/allocator.cpp.new && \ ${MV} ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/allocator.cpp.new \ ${WRKDIR}/mlx-${MLX_CORE_VERSION}/mlx/backend/no_gpu/allocator.cpp pre-build-MLX-on: @${MKDIR} ${WRKSRC}/build && \ cd ${WRKSRC}/build && \ 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 && \ ${MAKE_CMD} mlx mlxc post-install: # pending https://github.com/ollama/ollama/issues/6407 ${INSTALL_SCRIPT} ${FILESDIR}/ollama-limit-gpu-layers ${STAGEDIR}${PREFIX}/bin post-install-CPU-on: @${MKDIR} ${STAGEDIR}${PREFIX}/lib/ollama ${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml-base.so \ ${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 @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 \ ${STAGEDIR}${PREFIX}/lib/ollama/vulkan/ post-install-MLX-on: @${MKDIR} ${STAGEDIR}${PREFIX}/lib/ollama ${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libmlx.so \ ${STAGEDIR}${PREFIX}/lib/ollama/ ${INSTALL_LIB} ${WRKSRC}/build/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 do-test: @cd ${WRKSRC} && \ ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${GO_ENV} ${GO_CMD} test ./... .include diff --git a/misc/ollama/distinfo b/misc/ollama/distinfo index de46a18ae9ad..6fc11c606418 100644 --- a/misc/ollama/distinfo +++ b/misc/ollama/distinfo @@ -1,11 +1,11 @@ -TIMESTAMP = 1776149217 -SHA256 (go/misc_ollama/ollama-v0.20.7/v0.31.1.tar.gz) = 37e2a585a2bb28bcd3432af1c45d5c1ba8d560704ae285c3f9fd22a041e37004 -SIZE (go/misc_ollama/ollama-v0.20.7/v0.31.1.tar.gz) = 4163405 -SHA256 (go/misc_ollama/ollama-v0.20.7/v0.6.0.tar.gz) = 6ec2eab86ed3ce661c0d9b834027870651546138b7b4470fa8ef5533498c79aa -SIZE (go/misc_ollama/ollama-v0.20.7/v0.6.0.tar.gz) = 170186 -SHA256 (go/misc_ollama/ollama-v0.20.7/json.tar.xz) = d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d -SIZE (go/misc_ollama/ollama-v0.20.7/json.tar.xz) = 110988 -SHA256 (go/misc_ollama/ollama-v0.20.7/v0.20.7.mod) = e660ffa37ad33611a4c1248967204e578f07ada9941e63ffe6a6fe3e95ac5039 -SIZE (go/misc_ollama/ollama-v0.20.7/v0.20.7.mod) = 4757 -SHA256 (go/misc_ollama/ollama-v0.20.7/v0.20.7.zip) = da3a0fcbe78a1d229497315998e0ba3d500f540eadfe64ba6e3a71d0dd742b13 -SIZE (go/misc_ollama/ollama-v0.20.7/v0.20.7.zip) = 26694689 +TIMESTAMP = 1776484660 +SHA256 (go/misc_ollama/ollama-v0.21.0/v0.31.1.tar.gz) = 37e2a585a2bb28bcd3432af1c45d5c1ba8d560704ae285c3f9fd22a041e37004 +SIZE (go/misc_ollama/ollama-v0.21.0/v0.31.1.tar.gz) = 4163405 +SHA256 (go/misc_ollama/ollama-v0.21.0/v0.6.0.tar.gz) = 6ec2eab86ed3ce661c0d9b834027870651546138b7b4470fa8ef5533498c79aa +SIZE (go/misc_ollama/ollama-v0.21.0/v0.6.0.tar.gz) = 170186 +SHA256 (go/misc_ollama/ollama-v0.21.0/json.tar.xz) = d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d +SIZE (go/misc_ollama/ollama-v0.21.0/json.tar.xz) = 110988 +SHA256 (go/misc_ollama/ollama-v0.21.0/v0.21.0.mod) = a1fb851b8a77fe8f7e3846ac0964c8f363cf9c31ca31815bf54067c3e20b5ddd +SIZE (go/misc_ollama/ollama-v0.21.0/v0.21.0.mod) = 4745 +SHA256 (go/misc_ollama/ollama-v0.21.0/v0.21.0.zip) = 2c5afe85ba52d2be29752de080a977ff9c0b51e020669d50d08c599295de72d1 +SIZE (go/misc_ollama/ollama-v0.21.0/v0.21.0.zip) = 26752155 diff --git a/misc/ollama/files/patch-x_imagegen_server.go b/misc/ollama/files/patch-x_imagegen_server.go deleted file mode 100644 index f22dcbbc665a..000000000000 --- a/misc/ollama/files/patch-x_imagegen_server.go +++ /dev/null @@ -1,26 +0,0 @@ --- same issue as first chunk: https://github.com/ollama/ollama/issues/15107 - ---- x/imagegen/server.go.orig 1979-11-30 08:00:00 UTC -+++ x/imagegen/server.go -@@ -55,7 +55,9 @@ func NewServer(modelName string) (*Server, error) { - return &Server{ - modelName: modelName, - done: make(chan error, 1), -- client: &http.Client{Timeout: 10 * time.Minute}, -+ // No client-level timeout: image generation on CPU can take many minutes. -+ // Cancellation is handled via request context. -+ client: &http.Client{}, - }, nil - } - -@@ -116,8 +118,8 @@ func (s *Server) Load(ctx context.Context, _ ml.System - cmd := exec.Command(exe, "runner", "--imagegen-engine", "--model", s.modelName, "--port", strconv.Itoa(port)) - cmd.Env = os.Environ() - -- // On Linux, set LD_LIBRARY_PATH to include MLX library directories -- if runtime.GOOS == "linux" { -+ // On Linux and FreeBSD, set LD_LIBRARY_PATH to include MLX library directories -+ if runtime.GOOS == "linux" || runtime.GOOS == "freebsd" { - // Build library paths: start with LibOllamaPath, then add any mlx_* subdirectories - libraryPaths := []string{ml.LibOllamaPath} - if mlxDirs, err := filepath.Glob(filepath.Join(ml.LibOllamaPath, "mlx_*")); err == nil { diff --git a/misc/ollama/files/patch-x_mlxrunner_client.go b/misc/ollama/files/patch-x_mlxrunner_client.go new file mode 100644 index 000000000000..042b1d58222b --- /dev/null +++ b/misc/ollama/files/patch-x_mlxrunner_client.go @@ -0,0 +1,11 @@ +--- x/mlxrunner/client.go.orig 2026-04-18 04:07:37 UTC ++++ x/mlxrunner/client.go +@@ -366,6 +366,8 @@ func (c *Client) Load(ctx context.Context, _ ml.System + switch runtime.GOOS { + case "linux": + libPathEnvVar = "LD_LIBRARY_PATH" ++ case "freebsd": ++ libPathEnvVar = "LD_LIBRARY_PATH" + case "windows": + libPathEnvVar = "PATH" + } diff --git a/misc/ollama/files/update-port.sh b/misc/ollama/files/update-port.sh index 6a79b872dd14..e2f008a997b5 100755 --- a/misc/ollama/files/update-port.sh +++ b/misc/ollama/files/update-port.sh @@ -1,81 +1,80 @@ #!/bin/sh STRICT="set -euo pipefail" $STRICT # args : "${1?Usage: $0 }" VERSION="$1" # consts GH_PROJECT="ollama" GH_ACCOUNT_ORIG="ollama" GH_ACCOUNT_FORK="yurivict" GO_CMD=$(make -V GO_CMD) # check if GO_CMD is set and is a valid command if [ -z "$GO_CMD" ]; then echo "error: GO_CMD is not set" exit 1 fi if ! command -v "$GO_CMD" >/dev/null 2>&1; then echo "error: GO_CMD '$GO_CMD' is not a valid command" exit 1 fi -# make GoLang proxy +# make GoLang proxy to ingest the new version echo "==> submitting the new version $VERSION to GoLang proxy" GOPROXY=proxy.golang.org $GO_CMD list -m github.com/$GH_ACCOUNT_FORK/ollama@v$VERSION - exit 1 echo "updating $GH_PROJECT to version $VERSION" # remove old dirs rm -rf $GH_ACCOUNT_ORIG-$GH_PROJECT.repo $GH_ACCOUNT_FORK-$GH_PROJECT.repo # clone repos git clone https://github.com/$GH_ACCOUNT_ORIG/$GH_PROJECT.git $GH_ACCOUNT_ORIG-$GH_PROJECT.repo git clone https://github.com/$GH_ACCOUNT_FORK/$GH_PROJECT.git $GH_ACCOUNT_FORK-$GH_PROJECT.repo # checkout version cd $GH_ACCOUNT_ORIG-$GH_PROJECT.repo git checkout v$VERSION cd ../$GH_ACCOUNT_FORK-$GH_PROJECT.repo rm -rf * cp -r \ ../$GH_ACCOUNT_ORIG-$GH_PROJECT.repo/* \ ../$GH_ACCOUNT_ORIG-$GH_PROJECT.repo/.gitattributes \ ../$GH_ACCOUNT_ORIG-$GH_PROJECT.repo/.github \ ../$GH_ACCOUNT_ORIG-$GH_PROJECT.repo/.gitignore \ ../$GH_ACCOUNT_ORIG-$GH_PROJECT.repo/.golangci.yaml \ . # apply freebsd compatibility patch (patch-no-backup-1 < ../files/freebsd-compatibility.patch) || { echo "error: failed to apply freebsd compatibility patch"; exit 1; } # it should be buildable at this point #update $GH_ACCOUNT_ORIG/$GH_PROJECT -> $GH_ACCOUNT_FORK/$GH_PROJECT # this is done in the port # commit and tag echo "==> committing version v$VERSION" git add * .gitattributes .github .gitignore .golangci.yaml git commit . -m "Update to version v$VERSION + freebsd patches" echo "==> tagging version v$VERSION" git tag -a v$VERSION -m "Release version v$VERSION + freebsd patches" # push changes git push origin git push --tags -# make GoLang proxy +# make GoLang proxy to ingest the new version echo "==> submitting the new version $VERSION to GoLang proxy" GOPROXY=proxy.golang.org $GO_CMD list -m github.com/$GH_ACCOUNT_FORK/ollama@v$VERSION # final message echo "success: done updating the $GH_ACCOUNT_FORK/$GH_PROJECT to version $VERSION"