#
# This helper is for templates using meson.
#
do_patch() {
	: ${meson_crossfile:=xbps_meson.cross}

	if [ "$CROSS_BUILD" ]; then
		_MESON_TARGET_ENDIAN=little
		# drop the -musl suffix to the target cpu, meson doesn't recognize it
		_MESON_TARGET_CPU=${XBPS_TARGET_MACHINE/-musl/}
		case "$XBPS_TARGET_MACHINE" in
			mips|mips-musl|mipshf-musl)
				_MESON_TARGET_ENDIAN=big
				_MESON_CPU_FAMILY=mips
				;;
			armv*)
				_MESON_CPU_FAMILY=arm
				;;
			i686*)
				_MESON_CPU_FAMILY=x86
				;;
			ppc64le*)
				_MESON_CPU_FAMILY=ppc64
				;;
			ppc64*)
				_MESON_TARGET_ENDIAN=big
				_MESON_CPU_FAMILY=ppc64
				;;
			ppcle*)
				_MESON_CPU_FAMILY=ppc
				;;
			ppc*)
				_MESON_TARGET_ENDIAN=big
				_MESON_CPU_FAMILY=ppc
				;;
			*)
				# if we reached here that means that the cpu and cpu_family
				# are the same like 'x86_64' and 'aarch64'
				_MESON_CPU_FAMILY=${_MESON_TARGET_CPU}
				;;
		esac

		# Record cross-compiling information in cross file.
		# CFLAGS and LDFLAGS must be set as c_args and c_link_args.
		cat > ${meson_crossfile} <<EOF
[binaries]
c = '${CC}'
cpp = '${CXX}'
ar = '${XBPS_CROSS_TRIPLET}-gcc-ar'
nm = '${NM}'
ld = '${LD}'
strip = '${STRIP}'
readelf = '${READELF}'
objcopy = '${OBJCOPY}'
pkgconfig = '${PKG_CONFIG}'
rust = ['rustc', '--target', '${RUST_TARGET}' ,'--sysroot', '${XBPS_CROSS_BASE}/usr']
g-ir-scanner = '${XBPS_CROSS_BASE}/usr/bin/g-ir-scanner'
g-ir-compiler = '${XBPS_CROSS_BASE}/usr/bin/g-ir-compiler'
g-ir-generate = '${XBPS_CROSS_BASE}/usr/bin/g-ir-generate'
llvm-config = '/usr/bin/llvm-config'
cups-config = '${XBPS_CROSS_BASE}/usr/bin/cups-config'

[properties]
needs_exe_wrapper = true

[built-in options]
c_args = ['$(echo ${CFLAGS} | sed -r "s/\s+/','/g")']
c_link_args = ['$(echo ${LDFLAGS} | sed -r "s/\s+/','/g")']

cpp_args = ['$(echo ${CXXFLAGS} | sed -r "s/\s+/','/g")']
cpp_link_args = ['$(echo ${LDFLAGS} | sed -r "s/\s+/','/g")']

[host_machine]
system = 'linux'
cpu_family = '${_MESON_CPU_FAMILY}'
cpu = '${_MESON_TARGET_CPU}'
endian = '${_MESON_TARGET_ENDIAN}'
EOF
		if [[ $build_helper = *"qemu"* ]]; then
			sed -e "/\[binaries\]/ a exe_wrapper = '/usr/bin/qemu-${XBPS_TARGET_QEMU_MACHINE}-static'" \
				-i ${meson_crossfile}
		fi

		unset _MESON_CPU_FAMILY _MESON_TARGET_CPU _MESON_TARGET_ENDIAN
	fi
}

do_configure() {
	: ${meson_cmd:=meson}
	: ${meson_builddir:=build}
	: ${meson_crossfile:=xbps_meson.cross}

	if [ "$CROSS_BUILD" ]; then
		configure_args+=" --cross-file=${meson_crossfile}"
	fi

	# binutils ar needs a plugin when LTO is used on static libraries, so we
	# have to use the gcc-ar wrapper that calls the correct plugin.
	# As seen in https://github.com/mesonbuild/meson/issues/1646 (and its
	# solution, https://github.com/mesonbuild/meson/pull/1649), meson fixed
	# issues with static libraries + LTO by defaulting to gcc-ar themselves.
	# We also force gcc-ar usage in the crossfile above.
	export AR="gcc-ar"

	# unbuffered output for continuous logging
	PYTHONUNBUFFERED=1 ${meson_cmd} setup \
		--prefix=/usr \
		--libdir=/usr/lib${XBPS_TARGET_WORDSIZE} \
		--libexecdir=/usr/libexec \
		--bindir=/usr/bin \
		--sbindir=/usr/bin \
		--includedir=/usr/include \
		--datadir=/usr/share \
		--mandir=/usr/share/man \
		--infodir=/usr/share/info \
		--localedir=/usr/share/locale \
		--sysconfdir=/etc \
		--localstatedir=/var \
		--sharedstatedir=/var/lib \
		--buildtype=plain \
		--auto-features=auto \
		--wrap-mode=nodownload \
		-Db_lto=true -Db_ndebug=true \
		-Db_staticpic=true \
		${configure_args} . ${meson_builddir}
}

do_build() {
	: ${make_cmd:=ninja}
	: ${make_build_target:=all}
	: ${meson_builddir:=build}

	${make_cmd} -C ${meson_builddir} ${makejobs} ${make_build_args} ${make_build_target}
}

do_check() {
	: ${make_cmd:=ninja}
	: ${make_check_target:=test}
	: ${meson_builddir:=build}

	${make_check_pre} ${make_cmd} -C ${meson_builddir} ${makejobs} ${make_check_args} ${make_check_target}
}

do_install() {
	: ${make_cmd:=ninja}
	: ${make_install_target:=install}
	: ${meson_builddir:=build}

	DESTDIR=${DESTDIR} ${make_cmd} -C ${meson_builddir} ${make_install_args} ${make_install_target}
}
