diff options
author | Martin Väth <mvath@google.com> | 2019-02-05 21:32:45 +0100 |
---|---|---|
committer | Martin Väth <mvath@google.com> | 2019-02-05 21:32:45 +0100 |
commit | 0d46435c8a3852fc81963d987332fda8ac23f88e (patch) | |
tree | 82590514baac7d35f5ffb2963149e881327bb31e /eclass/meson.eclass | |
parent | sys-block/zram-init: Version bump (diff) | |
download | mv-0d46435c8a3852fc81963d987332fda8ac23f88e.tar.gz mv-0d46435c8a3852fc81963d987332fda8ac23f88e.tar.bz2 mv-0d46435c8a3852fc81963d987332fda8ac23f88e.zip |
Re-add meson.eclass since the gentoo repository breaks it again
Signed-off-by: Martin Väth <mvath@google.com>
Diffstat (limited to 'eclass/meson.eclass')
-rw-r--r-- | eclass/meson.eclass | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/eclass/meson.eclass b/eclass/meson.eclass new file mode 100644 index 00000000..0a80c6b6 --- /dev/null +++ b/eclass/meson.eclass @@ -0,0 +1,273 @@ +# Copyright 2017-2018 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: meson.eclass +# @MAINTAINER: +# William Hubbs <williamh@gentoo.org> +# Mike Gilbert <floppym@gentoo.org> +# @SUPPORTED_EAPIS: 6 7 +# @BLURB: common ebuild functions for meson-based packages +# @DESCRIPTION: +# This eclass contains the default phase functions for packages which +# use the meson build system. +# +# @EXAMPLE: +# Typical ebuild using meson.eclass: +# +# @CODE +# EAPI=6 +# +# inherit meson +# +# ... +# +# src_configure() { +# local emesonargs=( +# -Dqt4=$(usex qt4 true false) +# -Dthreads=$(usex threads true false) +# -Dtiff=$(usex tiff true false) +# ) +# meson_src_configure +# } +# +# ... +# +# @CODE + +case ${EAPI:-0} in + 6|7) ;; + *) die "EAPI=${EAPI} is not supported" ;; +esac + +if [[ ${__MESON_AUTO_DEPEND+set} == "set" ]] ; then + # See if we were included already, but someone changed the value + # of MESON_AUTO_DEPEND on us. We could reload the entire + # eclass at that point, but that adds overhead, and it's trivial + # to re-order inherit in eclasses/ebuilds instead. #409611 + if [[ ${__MESON_AUTO_DEPEND} != ${MESON_AUTO_DEPEND} ]] ; then + die "MESON_AUTO_DEPEND changed value between inherits; please inherit meson.eclass first! ${__MESON_AUTO_DEPEND} -> ${MESON_AUTO_DEPEND}" + fi +fi + +if [[ -z ${_MESON_ECLASS} ]]; then + +inherit ninja-utils python-utils-r1 toolchain-funcs + +fi + +EXPORT_FUNCTIONS src_configure src_compile src_test src_install + +if [[ -z ${_MESON_ECLASS} ]]; then +_MESON_ECLASS=1 + +MESON_DEPEND=">=dev-util/meson-0.45.1 + >=dev-util/ninja-1.7.2" + +# @ECLASS-VARIABLE: MESON_AUTO_DEPEND +# @DESCRIPTION: +# Set to 'no' to disable automatically adding to DEPEND. This lets +# ebuilds form conditional depends by using ${MESON_DEPEND} in +# their own DEPEND string. +: ${MESON_AUTO_DEPEND:=yes} +if [[ ${MESON_AUTO_DEPEND} != "no" ]] ; then + if [[ ${EAPI:-0} == [0123456] ]]; then + DEPEND=${MESON_DEPEND} + else + BDEPEND=${MESON_DEPEND} + fi +fi +__MESON_AUTO_DEPEND=${MESON_AUTO_DEPEND} # See top of eclass + +# @ECLASS-VARIABLE: BUILD_DIR +# @DEFAULT_UNSET +# @DESCRIPTION: +# Build directory, location where all generated files should be placed. +# If this isn't set, it defaults to ${WORKDIR}/${P}-build. + +# @ECLASS-VARIABLE: EMESON_SOURCE +# @DEFAULT_UNSET +# @DESCRIPTION: +# The location of the source files for the project; this is the source +# directory to pass to meson. +# If this isn't set, it defaults to ${S} + +# @VARIABLE: emesonargs +# @DEFAULT_UNSET +# @DESCRIPTION: +# Optional meson arguments as Bash array; this should be defined before +# calling meson_src_configure. + + +read -d '' __MESON_ARRAY_PARSER <<"EOF" +import shlex +import sys + +# See http://mesonbuild.com/Syntax.html#strings +def quote(str): + escaped = str.replace("\\\\", "\\\\\\\\").replace("'", "\\\\'") + return "'{}'".format(escaped) + +print("[{}]".format( + ", ".join([quote(x) for x in shlex.split(" ".join(sys.argv[1:]))]))) +EOF + +# @FUNCTION: _meson_env_array +# @INTERNAL +# @DESCRIPTION: +# Parses the command line flags and converts them into an array suitable for +# use in a cross file. +# +# Input: --single-quote=\' --double-quote=\" --dollar=\$ --backtick=\` +# --backslash=\\ --full-word-double="Hello World" +# --full-word-single='Hello World' +# --full-word-backslash=Hello\ World +# --simple --unicode-8=© --unicode-16=𐐷 --unicode-32=𐤅 +# +# Output: ['--single-quote=\'', '--double-quote="', '--dollar=$', +# '--backtick=`', '--backslash=\\', '--full-word-double=Hello World', +# '--full-word-single=Hello World', +# '--full-word-backslash=Hello World', '--simple', '--unicode-8=©', +# '--unicode-16=𐐷', '--unicode-32=𐤅'] +# +_meson_env_array() { + python -c "${__MESON_ARRAY_PARSER}" "$@" +} + +# @FUNCTION: _meson_create_cross_file +# @INTERNAL +# @DESCRIPTION: +# Creates a cross file. meson uses this to define settings for +# cross-compilers. This function is called from meson_src_configure. +_meson_create_cross_file() { + # Reference: http://mesonbuild.com/Cross-compilation.html + + # system roughly corresponds to uname -s (lowercase) + local system=unknown + case ${CHOST} in + *-aix*) system=aix ;; + *-cygwin*) system=cygwin ;; + *-darwin*) system=darwin ;; + *-freebsd*) system=freebsd ;; + *-linux*) system=linux ;; + mingw*|*-mingw*) system=windows ;; + *-solaris*) system=sunos ;; + esac + + local cpu_family=$(tc-arch) + case ${cpu_family} in + amd64) cpu_family=x86_64 ;; + arm64) cpu_family=aarch64 ;; + esac + + # This may require adjustment based on CFLAGS + local cpu=${CHOST%%-*} + + cat > "${T}/meson.${CHOST}.${ABI}" <<-EOF + [binaries] + ar = $(_meson_env_array "$(tc-getAR)") + c = $(_meson_env_array "$(tc-getCC)") + cpp = $(_meson_env_array "$(tc-getCXX)") + fortran = $(_meson_env_array "$(tc-getFC)") + llvm-config = '$(tc-getPROG LLVM_CONFIG llvm-config)' + objc = $(_meson_env_array "$(tc-getPROG OBJC cc)") + objcpp = $(_meson_env_array "$(tc-getPROG OBJCXX c++)") + pkgconfig = '$(tc-getPKG_CONFIG)' + strip = $(_meson_env_array "$(tc-getSTRIP)") + + [properties] + c_args = $(_meson_env_array "${CFLAGS} ${CPPFLAGS}") + c_link_args = $(_meson_env_array "${CFLAGS} ${LDFLAGS}") + cpp_args = $(_meson_env_array "${CXXFLAGS} ${CPPFLAGS}") + cpp_link_args = $(_meson_env_array "${CXXFLAGS} ${LDFLAGS}") + fortran_args = $(_meson_env_array "${FCFLAGS}") + fortran_link_args = $(_meson_env_array "${FCFLAGS} ${LDFLAGS}") + objc_args = $(_meson_env_array "${OBJCFLAGS} ${CPPFLAGS}") + objc_link_args = $(_meson_env_array "${OBJCFLAGS} ${LDFLAGS}") + objcpp_args = $(_meson_env_array "${OBJCXXFLAGS} ${CPPFLAGS}") + objcpp_link_args = $(_meson_env_array "${OBJCXXFLAGS} ${LDFLAGS}") + + [host_machine] + system = '${system}' + cpu_family = '${cpu_family}' + cpu = '${cpu}' + endian = '$(tc-endian)' + EOF +} + +# @FUNCTION: meson_use +# @USAGE: <USE flag> [option name] +# @DESCRIPTION: +# Given a USE flag and meson project option, outputs a string like: +# +# -Doption=true +# -Doption=false +# +# If the project option is unspecified, it defaults to the USE flag. +meson_use() { + usex "$1" "-D${2-$1}=true" "-D${2-$1}=false" +} + +# @FUNCTION: meson_src_configure +# @USAGE: [extra meson arguments] +# @DESCRIPTION: +# This is the meson_src_configure function. +meson_src_configure() { + debug-print-function ${FUNCNAME} "$@" + + # Common args + local mesonargs=( + --buildtype plain + --libdir "$(get_libdir)" + --localstatedir "${EPREFIX}/var/lib" + --prefix "${EPREFIX}/usr" + --sysconfdir "${EPREFIX}/etc" + --wrap-mode nodownload + ) + + if tc-is-cross-compiler || [[ ${ABI} != ${DEFAULT_ABI-${ABI}} ]]; then + _meson_create_cross_file || die "unable to write meson cross file" + mesonargs+=( --cross-file "${T}/meson.${CHOST}.${ABI}" ) + fi + + # https://bugs.gentoo.org/625396 + python_export_utf8_locale + + # Append additional arguments from ebuild + mesonargs+=("${emesonargs[@]}") + + BUILD_DIR="${BUILD_DIR:-${WORKDIR}/${P}-build}" + set -- meson "${mesonargs[@]}" "$@" \ + "${EMESON_SOURCE:-${S}}" "${BUILD_DIR}" + echo "$@" + tc-env_build "$@" || die +} + +# @FUNCTION: meson_src_compile +# @DESCRIPTION: +# This is the meson_src_compile function. +meson_src_compile() { + debug-print-function ${FUNCNAME} "$@" + + eninja -C "${BUILD_DIR}" +} + +# @FUNCTION: meson_src_test +# @DESCRIPTION: +# This is the meson_src_test function. +meson_src_test() { + debug-print-function ${FUNCNAME} "$@" + + eninja -C "${BUILD_DIR}" test +} + +# @FUNCTION: meson_src_install +# @DESCRIPTION: +# This is the meson_src_install function. +meson_src_install() { + debug-print-function ${FUNCNAME} "$@" + + DESTDIR="${D}" eninja -C "${BUILD_DIR}" install + einstalldocs +} + +fi |