diff --git a/misc/ollama/Makefile b/misc/ollama/Makefile index f2a31fea0eb1..16188023fff8 100644 --- a/misc/ollama/Makefile +++ b/misc/ollama/Makefile @@ -1,93 +1,96 @@ PORTNAME= ollama DISTVERSIONPREFIX= v -DISTVERSION= 0.13.1-rc0 -PORTREVISION= 2 +DISTVERSION= 0.13.5 +DISTVERSIONSUFFIX= -x1 # x1 because it doesn't seem possible to update the cached tag on GoLang servers 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 +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 a22b0ff08646..438d8ba70ae8 100644 --- a/misc/ollama/distinfo +++ b/misc/ollama/distinfo @@ -1,5 +1,5 @@ -TIMESTAMP = 1764279505 -SHA256 (go/misc_ollama/ollama-v0.13.1-rc0/v0.13.1-rc0.mod) = 24e9aaaef0e2169fef54d14b95b528fce46e0f6788ffb71a93bcd3b035f99654 -SIZE (go/misc_ollama/ollama-v0.13.1-rc0/v0.13.1-rc0.mod) = 3454 -SHA256 (go/misc_ollama/ollama-v0.13.1-rc0/v0.13.1-rc0.zip) = 07d7cb01a4556fb134ab8c4986239afcf87363c12a074e60c9893dda977a5ea3 -SIZE (go/misc_ollama/ollama-v0.13.1-rc0/v0.13.1-rc0.zip) = 20653199 +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 diff --git a/misc/ollama/files/freebsd-compatibility.patch b/misc/ollama/files/freebsd-compatibility.patch new file mode 100644 index 000000000000..0008a31d661d --- /dev/null +++ b/misc/ollama/files/freebsd-compatibility.patch @@ -0,0 +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/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/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{}