commit:     7a80ab92aa1025134d96252dc6d4e8d163910227
Author:     Jason Zaman <perfinion <AT> gentoo <DOT> org>
AuthorDate: Sat Nov 17 15:33:49 2018 +0000
Commit:     Jason Zaman <perfinion <AT> gentoo <DOT> org>
CommitDate: Mon Dec 24 09:27:47 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=7a80ab92

bazel.eclass: new eclass for bazel build

Signed-off-by: Jason Zaman <perfinion <AT> gentoo.org>

 eclass/bazel.eclass | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 220 insertions(+)

diff --git a/eclass/bazel.eclass b/eclass/bazel.eclass
new file mode 100644
index 00000000000..ce80ea185e9
--- /dev/null
+++ b/eclass/bazel.eclass
@@ -0,0 +1,220 @@
+# Copyright 1999-2018 Jason Zaman
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: bazel.eclass
+# @MAINTAINER:
+# Jason Zaman <[email protected]>
+# @AUTHOR:
+# Jason Zaman <[email protected]>
+# @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:-0}" in
+       0|1|2|3|4|5|6)
+               die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
+               ;;
+       7)
+               ;;
+       *)
+               die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
+               ;;
+esac
+
+if [[ ! ${_BAZEL_ECLASS} ]]; then
+
+inherit multiprocessing toolchain-funcs
+
+BDEPEND=">=dev-util/bazel-0.20"
+
+# @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)
+               EOF
+
+       if tc-is-cross-compiler; then
+               echo "build --nodistinct_host_configuration" >> "${T}/bazelrc" 
|| die
+       fi
+}
+
+# @FUNCTION: ebazel
+# @USAGE: [<args>...]
+# @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 --bazelrc="${T}/bazelrc" --output_base="${output_base}" 
${@}
+       echo "${*}" >&2
+       "${@}" || die "ebazel failed"
+}
+
+# @FUNCTION: bazel_load_distfiles
+# @USAGE: <distfiles>...
+# @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 ${file} to bazel distdir as 
${word}"
+                               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
+}
+
+_BAZEL_ECLASS=1
+fi

Reply via email to