diff --git a/misc/ollama/Makefile b/misc/ollama/Makefile index 0744c6383189..a4bc28908ec1 100644 --- a/misc/ollama/Makefile +++ b/misc/ollama/Makefile @@ -1,97 +1,95 @@ PORTNAME= ollama DISTVERSIONPREFIX= v -DISTVERSION= 0.13.5 -DISTVERSIONSUFFIX= -x1 # x1 because it doesn't seem possible to update the cached tag on GoLang servers -PORTREVISION= 1 +DISTVERSION= 0.15.1 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 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 USES= cmake:indirect go:1.24+,modules localbase pkgconfig GO_MODULE= github.com/yurivict/${PORTNAME} # fork with FreeBSD patches GO_TARGET= . GO_ENV+= CGO_CXXFLAGS="${CXXFLAGS}" PLIST_FILES= bin/${PORTNAME} \ bin/ollama-limit-gpu-layers OPTIONS_GROUP= BACKENDS OPTIONS_GROUP_BACKENDS= CPU VULKAN OPTIONS_DEFAULT= CPU VULKAN CPU_DESC= Build CPU backend shared libraries CPU_PLIST_FILES= lib/ollama/libggml-base.so \ 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 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/libggml-vulkan.so .include _CMAKE_FLAGS= -DCMAKE_BUILD_TYPE=Release -DGGML_BACKEND_DL=ON -DGGML_BACKEND_DIR=${PREFIX}/lib/ollama 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') @${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} @${MKDIR} ${WRKSRC}/build && \ cd ${WRKSRC}/build && \ ${CMAKE_BIN} ${_CMAKE_FLAGS} .. .endif @cd ${WRKSRC}/build && \ ${MAKE_CMD} ggml-vulkan 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/ @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 ${INSTALL_LIB} ${WRKSRC}/build/lib/ollama/libggml-vulkan.so \ ${STAGEDIR}${PREFIX}/lib/ollama/ 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 438d8ba70ae8..1ea79d858ab9 100644 --- a/misc/ollama/distinfo +++ b/misc/ollama/distinfo @@ -1,5 +1,5 @@ -TIMESTAMP = 1767567167 -SHA256 (go/misc_ollama/ollama-v0.13.5-x1/v0.13.5-x1.mod) = 24e9aaaef0e2169fef54d14b95b528fce46e0f6788ffb71a93bcd3b035f99654 -SIZE (go/misc_ollama/ollama-v0.13.5-x1/v0.13.5-x1.mod) = 3454 -SHA256 (go/misc_ollama/ollama-v0.13.5-x1/v0.13.5-x1.zip) = ceaac09c6c3e456af9567737e9f81d36dc70e0cfce2d10b7b1e67e8a77a1b73b -SIZE (go/misc_ollama/ollama-v0.13.5-x1/v0.13.5-x1.zip) = 20969740 +TIMESTAMP = 1769375411 +SHA256 (go/misc_ollama/ollama-v0.15.1/v0.15.1.mod) = 9b668bf140a94f76e18a9f308c715857ee187eb2efb411a51facbd593eeefbac +SIZE (go/misc_ollama/ollama-v0.15.1/v0.15.1.mod) = 3667 +SHA256 (go/misc_ollama/ollama-v0.15.1/v0.15.1.zip) = 80ebb88ae5e57e81f4060fe5576c4a9a539d3275713615eb5162cc43442f5457 +SIZE (go/misc_ollama/ollama-v0.15.1/v0.15.1.zip) = 23084629 diff --git a/misc/ollama/files/freebsd-compatibility.patch b/misc/ollama/files/freebsd-compatibility.patch index 0008a31d661d..aede88e8fd6a 100644 --- a/misc/ollama/files/freebsd-compatibility.patch +++ b/misc/ollama/files/freebsd-compatibility.patch @@ -1,160 +1,160 @@ 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 +#include +#include +*/ +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 -ruN a/go.mod b/go.mod --- a/go.mod 2026-01-04 13:08:38.543919000 -0800 +++ b/go.mod 2026-01-04 13:08:45.213194000 -0800 @@ -36,6 +36,7 @@ require ( github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect + github.com/blabber/go-freebsd-sysctl v0.0.0-20201130114544-503969f39d8f // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect - github.com/chewxy/hm v1.0.0 // indirect - github.com/chewxy/math32 v1.11.0 // indirect diff -ruN a/go.sum b/go.sum --- a/go.sum 2026-01-04 13:08:38.572637000 -0800 +++ b/go.sum 2026-01-04 13:08:45.221946000 -0800 @@ -14,6 +14,8 @@ github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +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/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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= - github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= - github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= 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{} diff --git a/misc/ollama/files/update-port.sh b/misc/ollama/files/update-port.sh new file mode 100755 index 000000000000..64af47c0864d --- /dev/null +++ b/misc/ollama/files/update-port.sh @@ -0,0 +1,65 @@ +#!/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" + + +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 * .gitattributes .github .gitignore .golangci.yaml -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 +echo "==> submitting the new version $VERSION to GoLang proxy" +GOPROXY=proxy.golang.org go124 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"