dev-util/meson: Uprev to 0.57.2

This is a requirement for the latest upstream meson.eclass, which
fixes some cros-compilation issues needed to uprev x11-libs/gdk-pixbuf

Meson now has a new dependency: meson-format-array, which is also
pulled in by this CL.

The meson eclass is synced with upstream commit
5bf2727139974d789e1a3b3a10d3a6e85ffd6c62

BUG=chromium:1215974
TEST=CQ

Cq-Depend: 2939413, chrome-internal:3890064
Change-Id: I556fc6ab1aef12ab44561121f7c601a449bace68
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/overlays/portage-stable/+/2939905
Tested-by: Fergus Dall <sidereal@google.com>
Commit-Queue: Fergus Dall <sidereal@google.com>
Reviewed-by: David Munro <davidmunro@google.com>
Reviewed-by: Chris McDonald <cjmcdonald@chromium.org>
Reviewed-by: Nicholas Verne <nverne@chromium.org>
diff --git a/dev-util/meson-format-array/files/meson-format-array b/dev-util/meson-format-array/files/meson-format-array
new file mode 100644
index 0000000..d2bf49b
--- /dev/null
+++ b/dev-util/meson-format-array/files/meson-format-array
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+# Copyright 2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+import itertools
+import shlex
+import sys
+
+def quote(s):
+    return "'" + s.replace("\\", "\\\\").replace("'", "\\'") + "'"
+
+def main(args):
+    # Split each argument according to shell rules
+    args = (shlex.split(x) for x in args)
+
+    # Flatten the resulting list of lists
+    args = itertools.chain.from_iterable(args)
+
+    # Add quotes and escape embedded quotes
+    args = (quote(x) for x in args)
+
+    # Format the result
+    print("[" + ", ".join(args) + "]")
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
diff --git a/dev-util/meson-format-array/meson-format-array-0.ebuild b/dev-util/meson-format-array/meson-format-array-0.ebuild
new file mode 100644
index 0000000..e4cf00a
--- /dev/null
+++ b/dev-util/meson-format-array/meson-format-array-0.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{6..9} )
+
+inherit python-r1
+
+DESCRIPTION="Format shell expressions into a meson array"
+HOMEPAGE="https://wiki.gentoo.org/wiki/No_homepage"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+RDEPEND="${PYTHON_DEPS}"
+S="${WORKDIR}"
+
+src_install() {
+	python_foreach_impl python_doscript "${FILESDIR}"/meson-format-array
+}
diff --git a/dev-util/meson-format-array/metadata.xml b/dev-util/meson-format-array/metadata.xml
new file mode 100644
index 0000000..d35a395
--- /dev/null
+++ b/dev-util/meson-format-array/metadata.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>floppym@gentoo.org</email>
+		<name>Mike Gilbert</name>
+	</maintainer>
+	<stabilize-allarches/>
+</pkgmetadata>
diff --git a/dev-util/meson/Manifest b/dev-util/meson/Manifest
index 56d8beb..765d085 100644
--- a/dev-util/meson/Manifest
+++ b/dev-util/meson/Manifest
@@ -1 +1 @@
-DIST meson-0.55.3.tar.gz 1740465 BLAKE2B 7d121f5d2bf487ae3c38be5ddccde6900134b9d0ea47868aac5625449e18a1a97ae0012849b795187221632cd3ac343097ef29b282753a1e8bd871c393d5c0e8 SHA512 afb0bb25b367e681131d920995124df4b06f6d144ae1a95ebec27be13e06fefbd95840e0287cd1d84bdbb8d9c115b589a833d847c60926f55e0f15749cf66bae
+DIST meson-0.57.2.tar.gz 1853721 BLAKE2B 9c167a21745719589a165e7ffc31007bd6307b347027f390fd660b2f44b5a2e6d8f36e999e15fa4b28ae269ddb0bb3897e0297288c59b62cc493aad058126293 SHA512 a3b0bf3d5e1d1b7ac7c97313f43046c94aa2a6b21964958569c89764dfda08db166adb89d48cbfad735bd472114587a71089d5e8b4f0fce04c3289da21b3f40e
diff --git a/dev-util/meson/meson-0.55.3.ebuild b/dev-util/meson/meson-0.57.2.ebuild
similarity index 94%
rename from dev-util/meson/meson-0.55.3.ebuild
rename to dev-util/meson/meson-0.57.2.ebuild
index d60e981..61a15fd 100644
--- a/dev-util/meson/meson-0.55.3.ebuild
+++ b/dev-util/meson/meson-0.57.2.ebuild
@@ -1,4 +1,4 @@
-# Copyright 2016-2020 Gentoo Authors
+# Copyright 2016-2021 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=7
@@ -78,6 +78,9 @@
 		# test_cross_file_system_paths
 		unset XDG_DATA_HOME
 
+		# 'test cases/unit/73 summary' expects 80 columns
+		export COLUMNS=80
+
 		${EPYTHON} -u run_tests.py
 	) || die "Testing failed with ${EPYTHON}"
 }
diff --git a/dev-util/meson/metadata.xml b/dev-util/meson/metadata.xml
index d762c3a..aba1d26 100644
--- a/dev-util/meson/metadata.xml
+++ b/dev-util/meson/metadata.xml
@@ -1,4 +1,4 @@
-<?xml version='1.0' encoding='UTF-8'?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
 <pkgmetadata>
 	<maintainer type="person">
diff --git a/eclass/meson.eclass b/eclass/meson.eclass
index fa859ac..c9a5e0b 100644
--- a/eclass/meson.eclass
+++ b/eclass/meson.eclass
@@ -1,4 +1,4 @@
-# Copyright 2017-2019 Gentoo Authors
+# Copyright 2017-2021 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 # @ECLASS: meson.eclass
@@ -23,9 +23,9 @@
 #
 # src_configure() {
 # 	local emesonargs=(
-# 		-Dqt4=$(usex qt4 true false)
-# 		-Dthreads=$(usex threads true false)
-# 		-Dtiff=$(usex tiff true false)
+# 		$(meson_use qt4)
+# 		$(meson_feature threads)
+# 		$(meson_use bindist official_branding)
 # 	)
 # 	meson_src_configure
 # }
@@ -43,6 +43,10 @@
 
 inherit multiprocessing ninja-utils python-utils-r1 toolchain-funcs
 
+if [[ ${EAPI} == 6 ]]; then
+	inherit eapi7-ver
+fi
+
 fi
 
 EXPORT_FUNCTIONS src_configure src_compile src_test src_install
@@ -50,8 +54,10 @@
 if [[ -z ${_MESON_ECLASS} ]]; then
 _MESON_ECLASS=1
 
-MESON_DEPEND=">=dev-util/meson-0.48.2
-	>=dev-util/ninja-1.7.2"
+MESON_DEPEND=">=dev-util/meson-0.56.0
+	>=dev-util/ninja-1.8.2
+	dev-util/meson-format-array
+"
 
 if [[ ${EAPI:-0} == [6] ]]; then
 	DEPEND=${MESON_DEPEND}
@@ -84,19 +90,11 @@
 # Optional meson test arguments as Bash array; this should be defined before
 # calling meson_src_test.
 
-
-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
+# @VARIABLE: MYMESONARGS
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# User-controlled environment variable containing arguments to be passed to
+# meson in meson_src_configure.
 
 # @FUNCTION: _meson_env_array
 # @INTERNAL
@@ -117,20 +115,20 @@
 #          '--unicode-16=𐐷', '--unicode-32=𐤅']
 #
 _meson_env_array() {
-	python -c "${__MESON_ARRAY_PARSER}" "$@"
+	meson-format-array "$@"
 }
 
-# @FUNCTION: _meson_create_cross_file
+# @FUNCTION: _meson_get_machine_info
+# @USAGE: <tuple>
+# @RETURN: system/cpu_family/cpu variables
 # @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
+# Translate toolchain tuple into machine values for meson.
+_meson_get_machine_info() {
+	local tuple=$1
 
 	# system roughly corresponds to uname -s (lowercase)
-	local system=unknown
-	case ${CHOST} in
+	case ${tuple} in
 		*-aix*)          system=aix ;;
 		*-cygwin*)       system=cygwin ;;
 		*-darwin*)       system=darwin ;;
@@ -140,29 +138,49 @@
 		*-solaris*)      system=sunos ;;
 	esac
 
-	local cpu_family=$(tc-arch)
+	cpu_family=$(tc-arch "${tuple}")
 	case ${cpu_family} in
 		amd64) cpu_family=x86_64 ;;
 		arm64) cpu_family=aarch64 ;;
+		riscv)
+			case ${tuple} in
+				riscv32*) cpu_family=riscv32 ;;
+				riscv64*) cpu_family=riscv64 ;;
+			esac ;;
 	esac
 
 	# This may require adjustment based on CFLAGS
-	local cpu=${CHOST%%-*}
+	cpu=${tuple%%-*}
+}
 
-	cat > "${T}/meson.${CHOST}.${ABI}" <<-EOF
+# @FUNCTION: _meson_create_cross_file
+# @RETURN: path to 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() {
+	local system cpu_family cpu
+	_meson_get_machine_info "${CHOST}"
+
+	local fn=${T}/meson.${CHOST}.${ABI}.ini
+
+	cat > "${fn}" <<-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)'
+	nm = $(_meson_env_array "$(tc-getNM)")
 	objc = $(_meson_env_array "$(tc-getPROG OBJC cc)")
+	objcopy = $(_meson_env_array "$(tc-getOBJCOPY)")
 	objcpp = $(_meson_env_array "$(tc-getPROG OBJCXX c++)")
 	pkgconfig = '$(tc-getPKG_CONFIG)'
 	strip = $(_meson_env_array "$(tc-getSTRIP)")
 	windres = $(_meson_env_array "$(tc-getRC)")
 
-	[properties]
+	[built-in options]
 	c_args = $(_meson_env_array "${CFLAGS} ${CPPFLAGS}")
 	c_link_args = $(_meson_env_array "${CFLAGS} ${LDFLAGS}")
 	cpp_args = $(_meson_env_array "${CXXFLAGS} ${CPPFLAGS}")
@@ -174,12 +192,72 @@
 	objcpp_args = $(_meson_env_array "${OBJCXXFLAGS} ${CPPFLAGS}")
 	objcpp_link_args = $(_meson_env_array "${OBJCXXFLAGS} ${LDFLAGS}")
 
+	[properties]
+	needs_exe_wrapper = true
+	sys_root = '${SYSROOT}'
+	pkg_config_libdir = '${PKG_CONFIG_LIBDIR:-${EPREFIX}/usr/$(get_libdir)/pkgconfig}'
+
 	[host_machine]
 	system = '${system}'
 	cpu_family = '${cpu_family}'
 	cpu = '${cpu}'
-	endian = '$(tc-endian)'
+	endian = '$(tc-endian "${CHOST}")'
 	EOF
+
+	echo "${fn}"
+}
+
+# @FUNCTION: _meson_create_native_file
+# @RETURN: path to native file
+# @INTERNAL
+# @DESCRIPTION:
+# Creates a native file. meson uses this to define settings for
+# native compilers. This function is called from meson_src_configure.
+_meson_create_native_file() {
+	local system cpu_family cpu
+	_meson_get_machine_info "${CBUILD}"
+
+	local fn=${T}/meson.${CBUILD}.${ABI}.ini
+
+	cat > "${fn}" <<-EOF
+	[binaries]
+	ar = $(_meson_env_array "$(tc-getBUILD_AR)")
+	c = $(_meson_env_array "$(tc-getBUILD_CC)")
+	cpp = $(_meson_env_array "$(tc-getBUILD_CXX)")
+	fortran = $(_meson_env_array "$(tc-getBUILD_PROG FC gfortran)")
+	llvm-config = '$(tc-getBUILD_PROG LLVM_CONFIG llvm-config)'
+	nm = $(_meson_env_array "$(tc-getBUILD_NM)")
+	objc = $(_meson_env_array "$(tc-getBUILD_PROG OBJC cc)")
+	objcopy = $(_meson_env_array "$(tc-getBUILD_OBJCOPY)")
+	objcpp = $(_meson_env_array "$(tc-getBUILD_PROG OBJCXX c++)")
+	pkgconfig = '$(tc-getBUILD_PKG_CONFIG)'
+	strip = $(_meson_env_array "$(tc-getBUILD_STRIP)")
+	windres = $(_meson_env_array "$(tc-getBUILD_PROG RC windres)")
+
+	[built-in options]
+	c_args = $(_meson_env_array "${BUILD_CFLAGS} ${BUILD_CPPFLAGS}")
+	c_link_args = $(_meson_env_array "${BUILD_CFLAGS} ${BUILD_LDFLAGS}")
+	cpp_args = $(_meson_env_array "${BUILD_CXXFLAGS} ${BUILD_CPPFLAGS}")
+	cpp_link_args = $(_meson_env_array "${BUILD_CXXFLAGS} ${BUILD_LDFLAGS}")
+	fortran_args = $(_meson_env_array "${BUILD_FCFLAGS}")
+	fortran_link_args = $(_meson_env_array "${BUILD_FCFLAGS} ${BUILD_LDFLAGS}")
+	objc_args = $(_meson_env_array "${BUILD_OBJCFLAGS} ${BUILD_CPPFLAGS}")
+	objc_link_args = $(_meson_env_array "${BUILD_OBJCFLAGS} ${BUILD_LDFLAGS}")
+	objcpp_args = $(_meson_env_array "${BUILD_OBJCXXFLAGS} ${BUILD_CPPFLAGS}")
+	objcpp_link_args = $(_meson_env_array "${BUILD_OBJCXXFLAGS} ${BUILD_LDFLAGS}")
+
+	[properties]
+	needs_exe_wrapper = false
+	pkg_config_libdir = '${BUILD_PKG_CONFIG_LIBDIR:-${EPREFIX}/usr/$(get_libdir)/pkgconfig}'
+
+	[build_machine]
+	system = '${system}'
+	cpu_family = '${cpu_family}'
+	cpu = '${cpu}'
+	endian = '$(tc-endian "${CBUILD}")'
+	EOF
+
+	echo "${fn}"
 }
 
 # @FUNCTION: meson_use
@@ -215,32 +293,90 @@
 meson_src_configure() {
 	debug-print-function ${FUNCNAME} "$@"
 
-	# Common args
+	local BUILD_CFLAGS=${BUILD_CFLAGS}
+	local BUILD_CPPFLAGS=${BUILD_CPPFLAGS}
+	local BUILD_CXXFLAGS=${BUILD_CXXFLAGS}
+	local BUILD_FCFLAGS=${BUILD_FCFLAGS}
+	local BUILD_OBJCFLAGS=${BUILD_OBJCFLAGS}
+	local BUILD_OBJCXXFLAGS=${BUILD_OBJCXXFLAGS}
+	local BUILD_LDFLAGS=${BUILD_LDFLAGS}
+	local BUILD_PKG_CONFIG_LIBDIR=${BUILD_PKG_CONFIG_LIBDIR}
+	local BUILD_PKG_CONFIG_PATH=${BUILD_PKG_CONFIG_PATH}
+
+	if tc-is-cross-compiler; then
+		: ${BUILD_CFLAGS:=-O1 -pipe}
+		: ${BUILD_CXXFLAGS:=-O1 -pipe}
+		: ${BUILD_FCFLAGS:=-O1 -pipe}
+		: ${BUILD_OBJCFLAGS:=-O1 -pipe}
+		: ${BUILD_OBJCXXFLAGS:=-O1 -pipe}
+	else
+		: ${BUILD_CFLAGS:=${CFLAGS}}
+		: ${BUILD_CPPFLAGS:=${CPPFLAGS}}
+		: ${BUILD_CXXFLAGS:=${CXXFLAGS}}
+		: ${BUILD_FCFLAGS:=${FCFLAGS}}
+		: ${BUILD_LDFLAGS:=${LDFLAGS}}
+		: ${BUILD_OBJCFLAGS:=${OBJCFLAGS}}
+		: ${BUILD_OBJCXXFLAGS:=${OBJCXXFLAGS}}
+		: ${BUILD_PKG_CONFIG_LIBDIR:=${PKG_CONFIG_LIBDIR}}
+		: ${BUILD_PKG_CONFIG_PATH:=${PKG_CONFIG_PATH}}
+	fi
+
 	local mesonargs=(
+		meson setup
 		--buildtype plain
 		--libdir "$(get_libdir)"
 		--localstatedir "${EPREFIX}/var/lib"
 		--prefix "${EPREFIX}/usr"
 		--sysconfdir "${EPREFIX}/etc"
 		--wrap-mode nodownload
-		)
+		--build.pkg-config-path "${BUILD_PKG_CONFIG_PATH}${BUILD_PKG_CONFIG_PATH:+:}${EPREFIX}/usr/share/pkgconfig"
+		--pkg-config-path "${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}${EPREFIX}/usr/share/pkgconfig"
+		--native-file "$(_meson_create_native_file)"
+	)
 
-	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}" )
+	if tc-is-cross-compiler; then
+		mesonargs+=( --cross-file "$(_meson_create_cross_file)" )
 	fi
 
+	BUILD_DIR="${BUILD_DIR:-${WORKDIR}/${P}-build}"
+
+	# Handle quoted whitespace
+	eval "local -a MYMESONARGS=( ${MYMESONARGS} )"
+
+	mesonargs+=(
+		# Arguments from ebuild
+		"${emesonargs[@]}"
+
+		# Arguments passed to this function
+		"$@"
+
+		# Arguments from user
+		"${MYMESONARGS[@]}"
+
+		# Source directory
+		"${EMESON_SOURCE:-${S}}"
+
+		# Build directory
+		"${BUILD_DIR}"
+	)
+
+	# Used by symbolextractor.py
+	# https://bugs.gentoo.org/717720
+	tc-export NM
+	tc-getPROG READELF readelf >/dev/null
+
 	# https://bugs.gentoo.org/625396
 	python_export_utf8_locale
 
-	# Append additional arguments from ebuild
-	mesonargs+=("${emesonargs[@]}")
+	# https://bugs.gentoo.org/721786
+	local -x BOOST_INCLUDEDIR="${BOOST_INCLUDEDIR-${EPREFIX}/usr/include}"
+	local -x BOOST_LIBRARYDIR="${BOOST_LIBRARYDIR-${EPREFIX}/usr/$(get_libdir)}"
 
-	BUILD_DIR="${BUILD_DIR:-${WORKDIR}/${P}-build}"
-	set -- meson "${mesonargs[@]}" "$@" \
-		"${EMESON_SOURCE:-${S}}" "${BUILD_DIR}"
-	echo "$@"
-	tc-env_build "$@" || die
+	(
+		export -n {C,CPP,CXX,F,OBJC,OBJCXX,LD}FLAGS PKG_CONFIG_{LIBDIR,PATH}
+		echo "${mesonargs[@]}" >&2
+		"${mesonargs[@]}"
+	) || die
 }
 
 # @FUNCTION: meson_src_compile
@@ -284,7 +420,10 @@
 	debug-print-function ${FUNCNAME} "$@"
 
 	DESTDIR="${D}" eninja -C "${BUILD_DIR}" install "$@"
+
+	pushd "${S}" > /dev/null || die
 	einstalldocs
+	popd > /dev/null || die
 }
 
 fi