diff --git a/science/py-tensorflow/Makefile b/science/py-tensorflow/Makefile index bf145dab1426..de96a9bf5e95 100644 --- a/science/py-tensorflow/Makefile +++ b/science/py-tensorflow/Makefile @@ -1,309 +1,326 @@ PORTNAME= tensorflow DISTVERSIONPREFIX= v DISTVERSION= 2.21.0 PORTREVISION= 3 CATEGORIES= science python # machine-learning PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} DIST_SUBDIR= ${PORTNAME} EXTRACT_ONLY= ${DISTNAME}.tar.gz MAINTAINER= yuri@FreeBSD.org COMMENT= Computation using data flow graphs for scalable machine learning WWW= https://www.tensorflow.org \ https://github.com/tensorflow/tensorflow LICENSE= APACHE20 LICENSE_FILE= ${WRKSRC}/LICENSE -ONLY_FOR_ARCHS= amd64 +ONLY_FOR_ARCHS= amd64 powerpc64le BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}grpcio-tools>=1.22.0:devel/py-grpcio-tools@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}numpy>=1.22.0:math/py-numpy@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR} \ bash:shells/bash \ bazel:devel/bazel7 \ git:devel/git \ patchelf:sysutils/patchelf \ pybind11>=2.6.2:devel/pybind11 \ swig:devel/swig \ xxd:sysutils/xxd LIB_DEPENDS= libpng.so:graphics/png \ libsnappy.so:archivers/snappy \ libabsl_base.so:devel/abseil \ libsqlite3.so:databases/sqlite3 \ libicuio.so:devel/icu \ libjsoncpp.so:devel/jsoncpp \ libprotobuf.so:devel/protobuf \ libgif.so:graphics/giflib \ libcurl.so:ftp/curl \ libre2.so:devel/re2 \ libhwloc.so:devel/hwloc2 RUN_DEPENDS= pybind11>=2.6.2:devel/pybind11 \ ${PYTHON_PKGNAMEPREFIX}absl-py>=2.0.0:devel/py-absl-py@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}astunparse>=1.6.0:devel/py-astunparse@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}flatbuffers>=25.9.23:devel/py-flatbuffers@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}gast>=0.2.1:devel/py-gast@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}google-pasta>=0.1.1:devel/py-google-pasta@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}h5py>=2.9.0:science/py-h5py@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}numpy>=1.22.0:math/py-numpy@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}packaging>=21.3:devel/py-packaging@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}requests>=2.21.0:www/py-requests@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}protobuf>=3.20.3:devel/py-protobuf@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}six>=1.12.0:devel/py-six@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}termcolor>=1.1.0:devel/py-termcolor@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}typing-extensions>=3.6.6:devel/py-typing-extensions@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}wrapt>=1.11.0:devel/py-wrapt@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}grpcio>=1.24.3:devel/py-grpcio@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}ml-dtypes>=0.3.1:math/py-ml-dtypes@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}opt-einsum>=3.3.0:math/py-opt-einsum@${PY_FLAVOR} USES= java jpeg perl5 python shebangfix ssl JAVA_VERSION= 21 JAVA_VENDOR= openjdk USE_CXXSTD= c++17 USE_GITHUB= yes USE_PERL5= build USE_PYTHON= cython distutils SHEBANG_GLOB= *.py BINARY_ALIAS= python3=${PYTHON_CMD} OPTIONS_DEFINE= CPU_OPTS XLA OPTIONS_RADIO= PARALLEL_JOBS OPTIONS_RADIO_PARALLEL_JOBS= JOBS_1 JOBS_HALF JOBS_ALL PARALLEL_JOBS_DESC= How many jobs to run during build? OPTIONS_DEFAULT= JOBS_ALL JOBS_1_DESC= Run one job JOBS_1_VARS= TF_JOBS_NUMBER=1 JOBS_HALF_DESC= Run half jobs JOBS_HALF_VARS= TF_JOBS_NUMBER="`expr \( ${MAKE_JOBS_NUMBER} + 1 \) / 2`" JOBS_ALL_DESC= Run all jobs JOBS_ALL_VARS= TF_JOBS_NUMBER=${MAKE_JOBS_NUMBER} CPU_OPTS_DESC= Enable optimisations using features available on your CPU -CPU_OPTS_VARS= CPU_TARGET=native BAZEL_COPT="-c opt --copt=-march=native --copt=-mfpmath=sse" -CPU_OPTS_VARS_OFF= CPU_TARGET=x86-64 +CPU_OPTS_VARS= CPU_TARGET=${CPU_NATIVE} BAZEL_COPT="-c opt --copt=${CPU_FLAG}=${CPU_NATIVE} ${CPU_COPT_EXTRA}" +CPU_OPTS_VARS_OFF= CPU_TARGET=${CPU_BASELINE} XLA_DESC= Accelerated Linear Algebra XLA_VARS= XLA_OPT="1" XLA_VARS_OFF= XLA_OPT="0" +.include + +.if ${ARCH} == powerpc64le +CPU_FLAG= -mcpu +CPU_BASELINE= ${CPUTYPE:Upower8} +CPU_NATIVE= ${CPU_BASELINE} +BAZEL_ARCH_DEFINES= --define=xnn_enable_assembly=false \ + --linkopt=-Wl,-z,undefs +.else +CPU_FLAG= -march +CPU_BASELINE= x86-64 +CPU_NATIVE= native +CPU_COPT_EXTRA= --copt=-mfpmath=sse +.endif + .include "Makefile.MASTER_SITES" BAZEL_BOOT= --output_user_root=${WRKDIR}/bazel_out .if !defined(WITH_DEBUG) # For the reason why the linker is used for the strip, see PR 280234. BAZEL_LINKOPT= --linkopt=-Wl,--strip-all .endif post-patch: # Set up a local repository with our pre-downloaded packages # This prevents bazel downloading the files without modifying # the bzl files. @${MKDIR} ${WRKDIR}/bazel-dist .for file in ${DISTFILES:C/\:(.*)//} @${ECHO} "Moving ${file} to ${WRKDIR}/bazel-dist" @${CP} ${DISTDIR}/${DIST_SUBDIR}/${file} ${WRKDIR}/bazel-dist .endfor # Pre-populate repository cache for files fetched via ctx.download() # (these are not served by --distdir; must be in --repository_cache) @${MKDIR} ${WRKDIR}/bazel-cache/content_addressable/sha256/12cffc7274190ca1693a52ccd8303e719407e707c8557ddfb7eef81f208efaab @${CP} ${DISTDIR}/${DIST_SUBDIR}/libtinfo.so.5 \ ${WRKDIR}/bazel-cache/content_addressable/sha256/12cffc7274190ca1693a52ccd8303e719407e707c8557ddfb7eef81f208efaab/file @${MKDIR} ${WRKDIR}/bazel-cache/content_addressable/sha256/5e8ee902c8906ddb7779fd36dc9979cb08b51fbebf7c0b1a9aeb78af382af590 @${CP} ${DISTDIR}/${DIST_SUBDIR}/copyright.txt \ ${WRKDIR}/bazel-cache/content_addressable/sha256/5e8ee902c8906ddb7779fd36dc9979cb08b51fbebf7c0b1a9aeb78af382af590/file @${CP} ${PATCHDIR}/bazelrc ${WRKDIR}/bazelrc @${CP} -R ${PATCHDIR}/bazel/* \ ${WRKSRC}/third_party/ @${CP} ${PATCHDIR}/bazel/rules_python_freebsd.patch \ ${WRKSRC}/third_party/xla/third_party/py/ @${CP} ${PATCHDIR}/bazel/fix-environ.patch \ ${WRKSRC}/third_party/xla/third_party/ @${CP} ${PATCHDIR}/llvm_freebsd.patch \ ${WRKSRC}/third_party/xla/third_party/llvm/freebsd.patch @${CP} ${PATCHDIR}/grpc.bazel.BUILD \ ${WRKSRC}/third_party/systemlibs/grpc.bazel.BUILD @${CP} ${PATCHDIR}/grpc.bazel.python_rules.bzl \ ${WRKSRC}/third_party/systemlibs/grpc.bazel.python_rules.bzl @${CP} ${PATCHDIR}/grpc.bazel.cc_grpc_library.bzl \ ${WRKSRC}/third_party/systemlibs/grpc.bazel.cc_grpc_library.bzl @${REINPLACE_CMD} "s#%%BAZEL_DIR%%#${WRKDIR}#" ${WRKDIR}/bazelrc @${REINPLACE_CMD} "s#%%BAZEL_DIST%%#${WRKDIR}#" ${WRKDIR}/bazelrc @${REINPLACE_CMD} "s#%%WRKSRC%%#${WRKSRC}#" ${WRKDIR}/bazelrc @${REINPLACE_CMD} "s#%%JAVA_HOME%%#${JAVA_HOME}#" ${WRKDIR}/bazelrc # copy the toolchain over @${CP} -R ${PATCHDIR}/freebsd \ ${WRKSRC}/ @${REINPLACE_CMD} "s#%%PATH%%#${PATH}#" ${WRKDIR}/bazelrc @${REINPLACE_CMD} -e "s#%%LOCALBASE%%#${LOCALBASE}#" \ ${WRKDIR}/bazelrc \ ${WRKSRC}/freebsd/cc_toolchain_config.bzl \ ${WRKSRC}/.bazelrc \ ${WRKSRC}/WORKSPACE @${REINPLACE_CMD} -e "s#%%NUMPY_INCLUDEDIR%%#${PYTHON_SITELIBDIR}/numpy/_core/include#g" \ ${WRKDIR}/bazelrc \ ${WRKSRC}/freebsd/cc_toolchain_config.bzl @${REINPLACE_CMD} -e "s#%%PYTHON_VER%%#${PYTHON_VER}#g" \ ${WRKSRC}/WORKSPACE # Fix Python runtime headers: replace rules_python CC toolchain alias with # a direct cc_library using a symlink to the system Python headers. @${REINPLACE_CMD} \ "s|%%PYTHON_INCLUDEDIR%%|${PYTHON_INCLUDEDIR}|g" \ ${WRKDIR}/bazelrc @${CP} ${PATCHDIR}/pthreadpool-freebsd-alloca.patch \ ${WRKSRC}/third_party/xla/third_party/pthreadpool/freebsd_alloca.patch @${CP} ${PATCHDIR}/xnnpack-freebsd-mmap.patch \ ${WRKSRC}/third_party/xla/third_party/xnnpack/freebsd_mmap.patch + @${CP} ${PATCHDIR}/xnnpack-freebsd-ppc-hwcap.patch \ + ${WRKSRC}/third_party/xla/third_party/xnnpack/freebsd_ppc_hwcap.patch @${CP} ${PATCHDIR}/protobuf-freebsd-upb.patch \ ${WRKSRC}/third_party/xla/third_party/protobuf/freebsd_upb.patch @${CP} ${PATCHDIR}/cpuinfo-freebsd-alwayslink.patch \ ${WRKSRC}/third_party/cpuinfo/cpuinfo_freebsd_alwayslink.patch @${CP} ${PATCHDIR}/grpc-no-go-sdk.patch \ ${WRKSRC}/third_party/xla/third_party/grpc/grpc_no_go.patch @${LN} -sf ${PYTHON_INCLUDEDIR} \ ${WRKSRC}/third_party/xla/third_party/python_runtime/python_include # Create pypi hub stub (FreeBSD has no platform wheels in requirements_lock) @${MKDIR} ${WRKSRC}/bazel_pypi_hub @${PRINTF} 'package(default_visibility = ["//visibility:public"])\nexports_files(["requirements.bzl"])\n' \ > ${WRKSRC}/bazel_pypi_hub/BUILD.bazel @${PRINTF} 'def install_deps(**kwargs):\n pass\n' \ > ${WRKSRC}/bazel_pypi_hub/requirements.bzl @${TOUCH} ${WRKSRC}/bazel_pypi_hub/WORKSPACE .for _pypi_pkg in absl_py astor astunparse auditwheel dill flatbuffers gast h5py jax \ keras lit ml_dtypes opt_einsum packaging portpicker protobuf requests \ scipy setuptools tblib termcolor typing_extensions wheel wrapt zstandard @${MKDIR} ${WRKSRC}/bazel_pypi_hub/${_pypi_pkg} @${PRINTF} 'package(default_visibility = ["//visibility:public"])\npy_library(name = "pkg", srcs = [])\npy_library(name = "lib", srcs = [])\npy_library(name = "whl", srcs = [])\nalias(name = "${_pypi_pkg}", actual = ":pkg")\n' \ > ${WRKSRC}/bazel_pypi_hub/${_pypi_pkg}/BUILD.bazel @${TOUCH} ${WRKSRC}/bazel_pypi_hub/${_pypi_pkg}/WORKSPACE .endfor # numpy needs extra cc_library for numpy_headers used by C++ deps @${MKDIR} ${WRKSRC}/bazel_pypi_hub/numpy @${MKDIR} ${WRKSRC}/bazel_pypi_hub/numpy/include @${LN} -sf ${PYTHON_SITELIBDIR}/numpy/_core/include/numpy \ ${WRKSRC}/bazel_pypi_hub/numpy/include/numpy # build_pip_package.py expects site-packages/numpy/{_core,core}/include @${MKDIR} ${WRKSRC}/bazel_pypi_hub/numpy/site-packages/numpy/core @${LN} -sf ${PYTHON_SITELIBDIR}/numpy/_core/include \ ${WRKSRC}/bazel_pypi_hub/numpy/site-packages/numpy/core/include @${PRINTF} 'package(default_visibility = ["//visibility:public"])\npy_library(name = "pkg", srcs = [])\npy_library(name = "lib", srcs = [])\nalias(name = "numpy", actual = ":pkg")\ncc_library(\n name = "numpy_headers",\n hdrs = glob(["include/**/*.h"]),\n includes = ["include"],\n)\n' \ > ${WRKSRC}/bazel_pypi_hub/numpy/BUILD.bazel @${TOUCH} ${WRKSRC}/bazel_pypi_hub/numpy/WORKSPACE do-configure: @cd ${WRKSRC} && ${SETENV} \ PYTHON_BIN_PATH=${PYTHON_CMD} \ PYTHON_LIB_PATH="${PYTHON_SITELIBDIR}" \ KERAS_HOME="${WRKDIR}/.keras" \ TF_NEED_OPENCL_SYCL=0 \ TF_ENABLE_XLA=${XLA_OPT} \ TF_NEED_OPENCL=0 \ TF_NEED_MPI=0 \ TF_NEED_TENSORRT=0 \ TF_NEED_NGRAPH=0 \ TF_NEED_IGNITE=0 \ TF_NEED_ROCM=0 \ TF_NEED_CUDA=0 \ TF_SET_ANDROID_WORKSPACE=0 \ TF_DOWNLOAD_CLANG=0 \ TF_NEED_NCCL=0 \ TF_IGNORE_MAX_BAZEL_VERSION=1 \ - CC_OPT_FLAGS="-march=${CPU_TARGET} -I${LOCALBASE}/include" \ + CC_OPT_FLAGS="${CPU_FLAG}=${CPU_TARGET} -I${LOCALBASE}/include" \ PREFIX="${LOCALBASE}" \ TF_SYSTEM_LIBS="astor_archive astunparse_archive boringssl com_github_googlecloudplatform_google_cloud_cpp \ com_googlesource_code_re2 curl cython dill_archive functools32_archive gast_archive \ gif hwloc icu jsoncpp_git libjpeg_turbo nasm org_sqlite pasta png pybind11 six_archive snappy \ tblib_archive termcolor_archive typing_extensions_archive wrapt zlib" \ ./configure @${REINPLACE_CMD} 's/,com_google_absl//g;s/,absl_py//g;s/absl_py,//g' ${WRKSRC}/.tf_configure.bazelrc post-configure: # BINARY_ALIAS creates a relative symlink for python3 that breaks inside # the poudriere jail (relative path resolves under /wrkdirs/usr/local/… # instead of /usr/local/…). Replace it with an absolute symlink. @${RM} ${WRKDIR}/.bin/python3 @${LN} -s ${PYTHON_CMD} ${WRKDIR}/.bin/python3 do-build: # Fetch rules_java to ensure it is extracted from the Bazel install, then inject # compatibility stubs for rules_java 7.x + protobuf 6.31.1 (which needs 8.x APIs). # Both @rules_java (WORKSPACE) and @@rules_java (Bzlmod canonical = rules_java_builtin) # must have the stubs; protobuf 6.31.1 uses the Bzlmod canonical form. @cd ${WRKSRC} && \ bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} fetch @rules_java//:BUILD @BAZEL_OB=$$(cd ${WRKSRC} && bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} info output_base 2>/dev/null); \ for RJNAME in rules_java rules_java_builtin; do \ RJDIR="$${BAZEL_OB}/external/$${RJNAME}"; \ if [ -d "$${RJDIR}/java/private" ]; then \ ${CP} ${FILESDIR}/rules_java.java.private.proto_support.bzl \ $${RJDIR}/java/private/proto_support.bzl; \ ${CP} ${FILESDIR}/rules_java.java.common.proguard_spec_info.bzl \ $${RJDIR}/java/common/proguard_spec_info.bzl 2>/dev/null || true; \ else \ ${ECHO_MSG} "WARNING: rules_java external dir $${RJNAME} not found; build may fail"; \ fi; \ done # Fetch llvm-project and fix config.bzl: replace Linux-only CPU-based FreeBSD # condition with platform-based @platforms//os:freebsd so exec/tool builds also # use posix_defines (no HAVE_GETAUXVAL / HAVE_MALLINFO) and the correct triple. @cd ${WRKSRC} && \ bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} fetch @@llvm-project//llvm:Support @LLVM_OB=$$(cd ${WRKSRC} && bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} info output_base 2>/dev/null); \ LLVMCONF="$${LLVM_OB}/external/llvm-raw/utils/bazel/llvm-project-overlay/llvm/config.bzl"; \ if [ -f "$${LLVMCONF}" ]; then \ ${PYTHON_CMD} ${PATCHDIR}/fix-llvm-config.py "$${LLVMCONF}"; \ else \ ${ECHO_MSG} "WARNING: llvm config.bzl not found at $${LLVMCONF}; build may fail"; \ fi @cd ${WRKSRC} && \ - bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} build --jobs ${TF_JOBS_NUMBER} ${BAZEL_COPT} --host_copt="-I${LOCALBASE}/include" \ + bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} build --jobs ${TF_JOBS_NUMBER} ${BAZEL_COPT} ${BAZEL_ARCH_DEFINES} --host_copt="-I${LOCALBASE}/include" \ --host_linkopt="-L${LOCALBASE}/lib -lexecinfo" ${BAZEL_LINKOPT} --copt="-I${LOCALBASE}/include" \ --verbose_failures -s \ --distdir=${WRKDIR}/bazel-dist \ //tensorflow/tools/pip_package:wheel @${MKDIR} ${WRKDIR}/whl @${CP} ${WRKSRC}/bazel-bin/tensorflow/tools/pip_package/wheel_house/*.whl \ ${WRKDIR}/whl/ do-install: @${MKDIR} ${STAGEDIR}/${PYTHON_SITELIBDIR} @${UNZIP_NATIVE_CMD} -d ${STAGEDIR}/${PYTHON_SITELIBDIR} ${WRKDIR}/whl/${PORTNAME}-${PORTVERSION}-*.whl post-install: # autoplist: thousands of files, all under ${PYTHON_SITELIBDIR} @cd ${STAGEDIR}${PREFIX} && \ ${FIND} ${PYTHON_SITELIBDIR:C|^${LOCALBASE}/||} -type f -or -type l | ${GREP} -v "egg-info/" >> ${TMPPLIST} do-test: @cd ${WRKSRC} && \ bazel --bazelrc="${WRKDIR}/bazelrc" ${BAZEL_BOOT} test \ --jobs ${TF_JOBS_NUMBER} ${BAZEL_COPT} --host_copt="-I${LOCALBASE}/include" \ --host_linkopt="-L${LOCALBASE}/lib -lexecinfo" ${BAZEL_LINKOPT} --copt="-I${LOCALBASE}/include" \ --verbose_failures \ --distdir=${WRKDIR}/bazel-dist \ --test_output=errors \ --keep_going \ //tensorflow/python/autograph/... test-quick: build @cd ${TEST_WRKSRC} && \ ${SETENV} ${TEST_ENV} ${PYTHON_CMD} ${FILESDIR}/example-quick-training.py # tests as of 2.21.0: Executed 76 out of 76 tests: 76 tests pass. .include diff --git a/science/py-tensorflow/files/cpuinfo-freebsd-alwayslink.patch b/science/py-tensorflow/files/cpuinfo-freebsd-alwayslink.patch index 7423f274a523..96fc57e4f1df 100644 --- a/science/py-tensorflow/files/cpuinfo-freebsd-alwayslink.patch +++ b/science/py-tensorflow/files/cpuinfo-freebsd-alwayslink.patch @@ -1,11 +1,36 @@ diff --git a/BUILD.bazel b/BUILD.bazel --- a/BUILD.bazel +++ b/BUILD.bazel -@@ -182,6 +182,7 @@ +@@ -142,6 +142,7 @@ + ":macos_x86_64_legacy": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, + ":macos_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, + ":freebsd_x86_64": COMMON_SRCS + X86_SRCS + FREEBSD_SRCS + FREEBSD_X86_SRCS, ++ ":freebsd_ppc64le": COMMON_SRCS + FREEBSD_SRCS, + ":windows_x86_64": COMMON_SRCS + X86_SRCS + WINDOWS_X86_SRCS, + ":windows_arm64": COMMON_SRCS + ARM_SRCS + WINDOWS_ARM_SRCS, + ":android_armv7": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS + ANDROID_ARM_SRCS, +@@ -182,6 +183,7 @@ ":macos_x86_64_legacy": False, "//conditions:default": True, }), + alwayslink = True, # Headers must be in textual_hdrs to allow us to set the standard to C99 textual_hdrs = [ "include/cpuinfo.h", +@@ -482,7 +484,16 @@ + + config_setting( + name = "freebsd_x86_64", ++ constraint_values = ["@platforms//cpu:x86_64"], + values = { + "cpu": "freebsd", + }, + ) ++ ++config_setting( ++ name = "freebsd_ppc64le", ++ constraint_values = ["@platforms//cpu:ppc"], ++ values = { ++ "cpu": "freebsd", ++ }, ++) diff --git a/science/py-tensorflow/files/freebsd/BUILD b/science/py-tensorflow/files/freebsd/BUILD index 04a5fda857fd..98aa98aa0100 100644 --- a/science/py-tensorflow/files/freebsd/BUILD +++ b/science/py-tensorflow/files/freebsd/BUILD @@ -1,109 +1,107 @@ # Copyright 2018 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This becomes the BUILD file for @local_config_cc// under FreeBSD and OpenBSD. load(":cc_toolchain_config.bzl", "cc_toolchain_config") load("@rules_cc//cc:defs.bzl", "cc_library", "cc_toolchain", "cc_toolchain_suite") load("@bazel_tools//tools/python:toolchain.bzl", "py_runtime_pair") package(default_visibility = ["//visibility:public"]) cc_library( name = "malloc", ) filegroup( name = "empty", srcs = [], ) # Hardcoded toolchain, legacy behaviour. cc_toolchain_suite( name = "freebsd_clang", toolchains = { "k8": ":cc-compiler-freebsd", "freebsd": ":cc-compiler-freebsd", }, ) cc_toolchain( name = "cc-compiler-freebsd", all_files = ":empty", ar_files = ":empty", as_files = ":empty", compiler_files = ":empty", dwp_files = ":empty", linker_files = ":empty", objcopy_files = ":empty", strip_files = ":empty", supports_param_files = 0, toolchain_config = ":local_freebsd", toolchain_identifier = "local_freebsd", ) cc_toolchain_config( name = "local_freebsd", cpu = "freebsd", ) toolchain( name = "cc-toolchain-freebsd", exec_compatible_with = [ - "@platforms//cpu:x86_64", "@platforms//os:freebsd", ], target_compatible_with = [ - "@platforms//cpu:x86_64", "@platforms//os:freebsd", ], toolchain = ":cc-compiler-freebsd", toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", ) py_runtime( name = "freebsd_python", interpreter_path = "/usr/local/bin/python3.9", python_version = "PY3", visibility = ["//visibility:public"], ) py_runtime_pair( name = "bsd_py_runtime_pair", py2_runtime = None, py3_runtime = ":freebsd_python", ) toolchain( name = "freebsd_py_toolchain", toolchain = ":bsd_py_runtime_pair", toolchain_type = "@bazel_tools//tools/python:toolchain_type", ) load("@rules_python//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain") # Python C/C++ headers toolchain for FreeBSD (satisfies @rules_python//python/cc:toolchain_type) py_cc_toolchain( name = "python_cc_toolchain_impl", headers = "@xla//third_party/python_runtime:headers", python_version = "3.11", ) toolchain( name = "python_cc_toolchain", exec_compatible_with = [ "@platforms//os:freebsd", ], target_compatible_with = [ "@platforms//os:freebsd", ], toolchain = ":python_cc_toolchain_impl", toolchain_type = "@rules_python//python/cc:toolchain_type", ) diff --git a/science/py-tensorflow/files/patch-tensorflow_workspace2.bzl b/science/py-tensorflow/files/patch-tensorflow_workspace2.bzl index a9ba0a253e9f..32124132b727 100644 --- a/science/py-tensorflow/files/patch-tensorflow_workspace2.bzl +++ b/science/py-tensorflow/files/patch-tensorflow_workspace2.bzl @@ -1,34 +1,34 @@ --- tensorflow/workspace2.bzl.orig 2026-03-04 21:33:50 UTC +++ tensorflow/workspace2.bzl @@ -179,6 +179,7 @@ def _tf_repositories(): sha256 = "44bf8a258cfd0d7b500b6058a2bb5c7387c8cebba295cfca985a68d16513f7c8", strip_prefix = "XNNPACK-25b42dfddb0ee22170d73ff0d4b333ea1e6edfeb", urls = tf_mirror_urls("https://github.com/google/XNNPACK/archive/25b42dfddb0ee22170d73ff0d4b333ea1e6edfeb.zip"), -+ patch_file = ["@xla//third_party/xnnpack:freebsd_mmap.patch"], ++ patch_file = ["@xla//third_party/xnnpack:freebsd_mmap.patch", "@xla//third_party/xnnpack:freebsd_ppc_hwcap.patch"], ) # LINT.ThenChange(//tensorflow/lite/tools/cmake/modules/xnnpack.cmake) @@ -202,6 +203,7 @@ def _tf_repositories(): name = "pthreadpool", sha256 = "f602ab141bdc5d5872a79d6551e9063b5bfa7ad6ad60cceaa641de5c45c86d70", strip_prefix = "pthreadpool-0e6ca13779b57d397a5ba6bfdcaa8a275bc8ea2e", + patch_file = ["@xla//third_party/pthreadpool:freebsd_alloca.patch"], urls = tf_mirror_urls("https://github.com/google/pthreadpool/archive/0e6ca13779b57d397a5ba6bfdcaa8a275bc8ea2e.zip"), ) # LINT.ThenChange(//tensorflow/lite/cmake/DownloadPThreadPool.cmake) @@ -210,7 +212,7 @@ def _tf_repositories(): name = "cpuinfo", sha256 = "c0254ce97f7abc778dd2df0aaca1e0506dba1cd514fdb9fe88c07849393f8ef4", strip_prefix = "cpuinfo-8a9210069b5a37dd89ed118a783945502a30a4ae", - patch_file = ["//third_party/cpuinfo:cpuinfo_ppc64le_support.patch"], + patch_file = ["//third_party/cpuinfo:cpuinfo_ppc64le_support.patch", "//third_party/cpuinfo:cpuinfo_freebsd_alwayslink.patch"], urls = tf_mirror_urls("https://github.com/pytorch/cpuinfo/archive/8a9210069b5a37dd89ed118a783945502a30a4ae.zip"), ) @@ -474,6 +476,7 @@ def _tf_repositories(): patch_file = [ "@xla//third_party/grpc:grpc.patch", + "@xla//third_party/grpc:grpc_no_go.patch", ], urls = tf_mirror_urls("https://github.com/grpc/grpc/archive/refs/tags/v1.74.0.tar.gz"), ) diff --git a/science/py-tensorflow/files/patch-third__party_xla_third__party_highwayhash_highwayhash.BUILD b/science/py-tensorflow/files/patch-third__party_xla_third__party_highwayhash_highwayhash.BUILD new file mode 100644 index 000000000000..0131b1d6db1b --- /dev/null +++ b/science/py-tensorflow/files/patch-third__party_xla_third__party_highwayhash_highwayhash.BUILD @@ -0,0 +1,11 @@ +--- third_party/xla/third_party/highwayhash/highwayhash.BUILD.orig 2026-03-04 22:33:50 UTC ++++ third_party/xla/third_party/highwayhash/highwayhash.BUILD +@@ -21,7 +21,7 @@ + + config_setting( + name = "cpu_ppc", +- values = {"cpu": "ppc"}, ++ constraint_values = ["@platforms//cpu:ppc"], + ) + + config_setting( diff --git a/science/py-tensorflow/files/patch-third__party_xla_xla_backends_cpu_codegen_builtin__fp16.h b/science/py-tensorflow/files/patch-third__party_xla_xla_backends_cpu_codegen_builtin__fp16.h new file mode 100644 index 000000000000..8c9d2e1a74a0 --- /dev/null +++ b/science/py-tensorflow/files/patch-third__party_xla_xla_backends_cpu_codegen_builtin__fp16.h @@ -0,0 +1,11 @@ +--- third_party/xla/xla/backends/cpu/codegen/builtin_fp16.h.orig 2026-03-04 22:33:50 UTC ++++ third_party/xla/xla/backends/cpu/codegen/builtin_fp16.h +@@ -16,6 +16,8 @@ + #ifndef XLA_BACKENDS_CPU_CODEGEN_BUILTIN_FP16_H_ + #define XLA_BACKENDS_CPU_CODEGEN_BUILTIN_FP16_H_ + ++#include ++ + // _Float16 always gets us the correct ABI type, so use that if available. + // AArch64 GCC defines __FLT16_MANT_DIG__ even when _Float16 is not available. + #if defined(__FLT16_MANT_DIG__) && \ diff --git a/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_eigen__unary.cc b/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_eigen__unary.cc new file mode 100644 index 000000000000..525dd6c717b9 --- /dev/null +++ b/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_eigen__unary.cc @@ -0,0 +1,12 @@ +--- third_party/xla/xla/codegen/intrinsic/cpp/eigen_unary.cc.orig 2026-03-04 22:33:50 UTC ++++ third_party/xla/xla/codegen/intrinsic/cpp/eigen_unary.cc +@@ -13,7 +13,8 @@ + limitations under the License. + ==============================================================================*/ + +-#if defined(__has_attribute) && __has_attribute(ext_vector_type) && \ ++#if defined(__FLT16_MANT_DIG__) && \ ++ defined(__has_attribute) && __has_attribute(ext_vector_type) && \ + defined(__has_builtin) && __has_builtin(__builtin_vectorelements) + + #include "xla/codegen/intrinsic/cpp/eigen_unary.h" diff --git a/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_vector__ops.h b/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_vector__ops.h new file mode 100644 index 000000000000..adc9dda6f212 --- /dev/null +++ b/science/py-tensorflow/files/patch-third__party_xla_xla_codegen_intrinsic_cpp_vector__ops.h @@ -0,0 +1,12 @@ +--- third_party/xla/xla/codegen/intrinsic/cpp/vector_ops.h.orig 2026-03-04 22:33:50 UTC ++++ third_party/xla/xla/codegen/intrinsic/cpp/vector_ops.h +@@ -16,7 +16,8 @@ + #ifndef XLA_CODEGEN_INTRINSIC_CPP_VECTOR_OPS_H_ + #define XLA_CODEGEN_INTRINSIC_CPP_VECTOR_OPS_H_ + +-#if defined(__has_attribute) && __has_attribute(ext_vector_type) && \ ++#if defined(__FLT16_MANT_DIG__) && \ ++ defined(__has_attribute) && __has_attribute(ext_vector_type) && \ + defined(__has_builtin) && __has_builtin(__builtin_vectorelements) + + #include diff --git a/science/py-tensorflow/files/xnnpack-freebsd-mmap.patch b/science/py-tensorflow/files/xnnpack-freebsd-mmap.patch index 53e6a43e21a5..8fea9541fe0d 100644 --- a/science/py-tensorflow/files/xnnpack-freebsd-mmap.patch +++ b/science/py-tensorflow/files/xnnpack-freebsd-mmap.patch @@ -1,68 +1,69 @@ diff --git a/build_defs.bzl b/build_defs.bzl --- a/build_defs.bzl +++ b/build_defs.bzl @@ -188,7 +188,10 @@ We need this for things like `struct timespec` that are not in c99, but are part of POSIX 1003.1b-1993.""" - return ["_DARWIN_C_SOURCE=1", "_POSIX_C_SOURCE=199309L"] + return select({ + "@platforms//os:freebsd": [], + "//conditions:default": ["_DARWIN_C_SOURCE=1", "_POSIX_C_SOURCE=199309L"], + }) def xnnpack_test_deps_for_library(): """Depencies needed for a library to use gunit.""" @@ -349,6 +352,7 @@ }), copts = copts + select({ "//build_config:linux_k8": gcc_x86_copts, + "//build_config:freebsd_x86_64": gcc_x86_copts, "//build_config:linux_arm": aarch32_copts, "//build_config:linux_armeabi": aarch32_copts, "//build_config:linux_armhf": aarch32_copts, diff --git a/src/memory.c b/src/memory.c --- a/src/memory.c +++ b/src/memory.c @@ -28,6 +28,10 @@ #include #if XNN_HAS_MMAP #include +#endif +/* FreeBSD uses MAP_ANON; provide MAP_ANONYMOUS alias for portability. */ +#if defined(__FreeBSD__) && !defined(MAP_ANONYMOUS) +#define MAP_ANONYMOUS MAP_ANON #endif #include #endif // XNN_PLATFORM_WINDOWS diff --git a/build_config/BUILD.bazel b/build_config/BUILD.bazel --- a/build_config/BUILD.bazel +++ b/build_config/BUILD.bazel -@@ -351,6 +351,11 @@ +@@ -351,6 +351,12 @@ ], ) +config_setting( + name = "freebsd_x86_64", ++ constraint_values = ["@platforms//cpu:x86_64"], + values = {"cpu": "freebsd"}, +) + selects.config_setting_group( name = "x86", match_any = [ @@ -358,6 +363,7 @@ ":android_x86_64", ":ios_x86_64", ":linux_k8", + ":freebsd_x86_64", ":macos_x86_64", ":macos_x86_64_legacy", ":tvos_x86_64", @@ -376,6 +382,7 @@ ":android_x86_64", ":ios_x86_64", ":linux_k8", + ":freebsd_x86_64", ":macos_x86_64", ":macos_x86_64_legacy", ":tvos_x86_64", diff --git a/science/py-tensorflow/files/xnnpack-freebsd-ppc-hwcap.patch b/science/py-tensorflow/files/xnnpack-freebsd-ppc-hwcap.patch new file mode 100644 index 000000000000..09f380362e1e --- /dev/null +++ b/science/py-tensorflow/files/xnnpack-freebsd-ppc-hwcap.patch @@ -0,0 +1,30 @@ +diff --git a/src/configs/hardware-config.c b/src/configs/hardware-config.c +--- a/src/configs/hardware-config.c ++++ b/src/configs/hardware-config.c +@@ -46,6 +46,9 @@ + + #if XNN_ARCH_PPC64 + #include ++ #if defined(__FreeBSD__) ++ #include ++ #endif + #endif + + #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD +@@ -304,8 +307,14 @@ + #endif + + #if XNN_ARCH_PPC64 +- const unsigned long HWCAPs = getauxval(AT_HWCAP); +- const unsigned long HWCAPs_2 = getauxval(AT_HWCAP2); ++ #if defined(__FreeBSD__) ++ unsigned long HWCAPs = 0, HWCAPs_2 = 0; ++ elf_aux_info(AT_HWCAP, &HWCAPs, sizeof(HWCAPs)); ++ elf_aux_info(AT_HWCAP2, &HWCAPs_2, sizeof(HWCAPs_2)); ++ #else ++ const unsigned long HWCAPs = getauxval(AT_HWCAP); ++ const unsigned long HWCAPs_2 = getauxval(AT_HWCAP2); ++ #endif + if (HWCAPs & PPC_FEATURE_HAS_VSX) { + set_arch_flag(xnn_arch_vsx, 1); + }