From d9d391f65e9caf0f248ac92dea2d841cf026c7df Mon Sep 17 00:00:00 2001 From: Andreas Billmeier Date: Sat, 9 Mar 2024 09:38:45 +0100 Subject: [PATCH] bazel.eclass: added from main archive (for old tensorflow) Signed-off-by: Andreas Billmeier --- README.md | 4 +- eclass/bazel.eclass | 227 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 eclass/bazel.eclass diff --git a/README.md b/README.md index 143a86033..ee908b447 100644 --- a/README.md +++ b/README.md @@ -617,12 +617,12 @@ A daily compile test is run at Github with Python 3.9 to catch general faults. E ## Licenses This repository itself is released under GPL-3 (like most Gentoo repositories), all work on the depending components under the licenses they came from. Perhaps you came here because I filed an issue at your component about a bad or missing license. It is easy to [assign a license](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-license-to-a-repository). During cleanups and license investigations I have been asked often which license to choose. I am not a lawyer, but I can offer the following table, counted over this repository, perhaps this helps your decision. If a package has more than one license listed, all of them are counted. -There are 1827 Ebuilds in total, 1816 of them have in total 1835 (42 different) licenses assigned. +There are 1830 Ebuilds in total, 1819 of them have in total 1838 (42 different) licenses assigned. |License| Ebuilds using it| |-------|-----| |MIT|1038| -|Apache-2.0|410| +|Apache-2.0|413| |GPL-3|120| |BSD|103| |LGPL-3|24| diff --git a/eclass/bazel.eclass b/eclass/bazel.eclass new file mode 100644 index 000000000..bdf61fa34 --- /dev/null +++ b/eclass/bazel.eclass @@ -0,0 +1,227 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: bazel.eclass +# @MAINTAINER: +# Jason Zaman +# @AUTHOR: +# Jason Zaman +# @SUPPORTED_EAPIS: 8 +# @BLURB: Utility functions for packages using Bazel Build +# @DESCRIPTION: +# A utility eclass providing functions to run the Bazel Build system. +# +# This eclass does not export any phase functions. + +case ${EAPI} in + 8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; +esac + +if [[ ! ${_BAZEL_ECLASS} ]]; then +_BAZEL_ECLASS=1 + +inherit multiprocessing toolchain-funcs + +if [[ ${CATEGORY}/${PN} != "dev-build/bazel" ]]; then + BDEPEND=">=dev-build/bazel-0.20" +fi + +# @ECLASS_VARIABLE: BAZEL_BINARY +# @DESCRIPTION: +# The program to invoke for bazel. Defaults to `bazel`. Useful if you have +# multiple bazel installations on your machine that differ in verson suffix, +# e.g., `bazel-5`, `bazel-6`. +BAZEL_BINARY="${BAZEL_BINARY:-bazel}" + +# @FUNCTION: bazel_get_flags +# @DESCRIPTION: +# Obtain and print the bazel flags for target and host *FLAGS. +# +# To add more flags to this, append the flags to the +# appropriate variable before calling this function +bazel_get_flags() { + local i fs=() + for i in ${CFLAGS}; do + fs+=( "--conlyopt=${i}" ) + done + for i in ${BUILD_CFLAGS}; do + fs+=( "--host_conlyopt=${i}" ) + done + for i in ${CXXFLAGS}; do + fs+=( "--cxxopt=${i}" ) + done + for i in ${BUILD_CXXFLAGS}; do + fs+=( "--host_cxxopt=${i}" ) + done + for i in ${CPPFLAGS}; do + fs+=( "--conlyopt=${i}" "--cxxopt=${i}" ) + done + for i in ${BUILD_CPPFLAGS}; do + fs+=( "--host_conlyopt=${i}" "--host_cxxopt=${i}" ) + done + for i in ${LDFLAGS}; do + fs+=( "--linkopt=${i}" ) + done + for i in ${BUILD_LDFLAGS}; do + fs+=( "--host_linkopt=${i}" ) + done + echo "${fs[*]}" +} + +# @FUNCTION: bazel_setup_bazelrc +# @DESCRIPTION: +# Creates the bazelrc with common options that will be passed +# to bazel. This will be called by ebazel automatically so +# does not need to be called from the ebuild. +bazel_setup_bazelrc() { + if [[ -f "${T}/bazelrc" ]]; then + return + fi + + # F: fopen_wr + # P: /proc/self/setgroups + # Even with standalone enabled, the Bazel sandbox binary is run for feature test: + # https://github.com/bazelbuild/bazel/blob/7b091c1397a82258e26ab5336df6c8dae1d97384/src/main/java/com/google/devtools/build/lib/sandbox/LinuxSandboxedSpawnRunner.java#L61 + # https://github.com/bazelbuild/bazel/blob/76555482873ffcf1d32fb40106f89231b37f850a/src/main/tools/linux-sandbox-pid1.cc#L113 + addpredict /proc + + mkdir -p "${T}/bazel-cache" || die + mkdir -p "${T}/bazel-distdir" || die + + cat > "${T}/bazelrc" <<-EOF || die + startup --batch + + # dont strip HOME, portage sets a temp per-package dir + build --action_env HOME + + # make bazel respect MAKEOPTS + build --jobs=$(makeopts_jobs) + build --compilation_mode=opt --host_compilation_mode=opt + + # FLAGS + build $(bazel_get_flags) + + # Use standalone strategy to deactivate the bazel sandbox, since it + # conflicts with FEATURES=sandbox. + build --spawn_strategy=standalone --genrule_strategy=standalone + test --spawn_strategy=standalone --genrule_strategy=standalone + + build --strip=never + build --verbose_failures --noshow_loading_progress + test --verbose_test_summary --verbose_failures --noshow_loading_progress + + # make bazel only fetch distfiles from the cache + fetch --repository_cache="${T}/bazel-cache/" --distdir="${T}/bazel-distdir/" + build --repository_cache="${T}/bazel-cache/" --distdir="${T}/bazel-distdir/" + + build --define=PREFIX=${EPREFIX}/usr + build --define=LIBDIR=\$(PREFIX)/$(get_libdir) + build --define=INCLUDEDIR=\$(PREFIX)/include + EOF + + if tc-is-cross-compiler; then + echo "build --distinct_host_configuration" >> "${T}/bazelrc" || die + else + echo "build --nodistinct_host_configuration" >> "${T}/bazelrc" || die + fi +} + +# @FUNCTION: ebazel +# @USAGE: [...] +# @DESCRIPTION: +# Run bazel with the bazelrc and output_base. +# +# output_base will be specific to $BUILD_DIR (if unset, $S). +# bazel_setup_bazelrc will be called and the created bazelrc +# will be passed to bazel. +# +# Will automatically die if bazel does not exit cleanly. +ebazel() { + bazel_setup_bazelrc + + # Use different build folders for each multibuild variant. + local output_base="${BUILD_DIR:-${S}}" + output_base="${output_base%/}-bazel-base" + mkdir -p "${output_base}" || die + + set -- "${BAZEL_BINARY}" --bazelrc="${T}/bazelrc" --output_base="${output_base}" ${@} + echo "${*}" >&2 + "${@}" || die "ebazel failed" +} + +# @FUNCTION: bazel_load_distfiles +# @USAGE: ... +# @DESCRIPTION: +# Populate the bazel distdir to fetch from since it cannot use +# the network. Bazel looks in distdir but will only look for the +# original filename, not the possibly renamed one that portage +# downloaded. If the line has -> we to rename it back. This also +# handles use-conditionals that SRC_URI does. +# +# Example: +# @CODE +# bazel_external_uris="http://a/file-2.0.tgz +# python? ( http://b/1.0.tgz -> foo-1.0.tgz )" +# SRC_URI="http://c/${PV}.tgz +# ${bazel_external_uris}" +# +# src_unpack() { +# unpack ${PV}.tgz +# bazel_load_distfiles "${bazel_external_uris}" +# } +# @CODE +bazel_load_distfiles() { + local file="" + local rename=0 + + [[ "${@}" ]] || die "Missing args" + mkdir -p "${T}/bazel-distdir" || die + + for word in ${@} + do + if [[ "${word}" == "->" ]]; then + # next word is a dest filename + rename=1 + elif [[ "${word}" == ")" ]]; then + # close conditional block + continue + elif [[ "${word}" == "(" ]]; then + # open conditional block + continue + elif [[ "${word}" == ?(\!)[A-Za-z0-9]*([A-Za-z0-9+_@-])\? ]]; then + # use-conditional block + # USE-flags can contain [A-Za-z0-9+_@-], and start with alphanum + # https://dev.gentoo.org/~ulm/pms/head/pms.html#x1-200003.1.4 + # ?(\!) matches zero-or-one !'s + # *(...) zero-or-more characters + # ends with a ? + continue + elif [[ ${rename} -eq 1 ]]; then + # Make sure the distfile is used + if [[ "${A}" == *"${word}"* ]]; then + echo "Copying ${word} to bazel distdir as ${file}" + ln -s "${DISTDIR}/${word}" "${T}/bazel-distdir/${file}" || die + fi + rename=0 + file="" + else + # another URL, current one may or may not be a rename + # if there was a previous one, its not renamed so copy it now + if [[ -n "${file}" && "${A}" == *"${file}"* ]]; then + echo "Copying ${file} to bazel distdir" + ln -s "${DISTDIR}/${file}" "${T}/bazel-distdir/${file}" || die + fi + # save the current URL, later we will find out if its a rename or not. + file="${word##*/}" + fi + done + + # handle last file + if [[ -n "${file}" ]]; then + echo "Copying ${file} to bazel distdir" + ln -s "${DISTDIR}/${file}" "${T}/bazel-distdir/${file}" || die + fi +} + +fi