Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Petazzoni via buildroot <buildroot@buildroot.org>
To: Adam Duskett <adam.duskett@amarulasolutions.com>
Cc: Angelo Compagnucci <angelo@amarulasolutions.com>,
	Michael Trimarchi <michael@amarulasolutions.com>,
	Asaf Kahlon <asafka7@gmail.com>,
	buildroot@buildroot.org
Subject: Re: [Buildroot] [PATCH/next vRFCv2 3/3] package/flutter-engine: new package
Date: Tue, 8 Aug 2023 19:56:21 +0200	[thread overview]
Message-ID: <20230808195621.1c5d4242@windsurf> (raw)
In-Reply-To: <20230808003527.1469175-4-adam.duskett@amarulasolutions.com>

Hello Adam,

On Mon,  7 Aug 2023 18:35:27 -0600
Adam Duskett <adam.duskett@amarulasolutions.com> wrote:

>   I have asked the flutter project to release full tarballs suitable for
>   compiling here: https://github.com/flutter/flutter/issues/130734

Thanks for having started this conversation with upstream, very good.

>  N:	Adam Duskett <adam.duskett@amarulasolutions.com>
>  F:	package/depot-tools
> +F:	package/flutter-engine

Missed that minor nit on the depot-tools patch, but applicable here as
well: directory paths in DEVELOPERS end with a final slash, i.e
package/depot-tools/.


> diff --git a/package/flutter-engine/0004-pkg-config.py-do-not-prepend-sysroot-path.patch b/package/flutter-engine/0004-pkg-config.py-do-not-prepend-sysroot-path.patch
> new file mode 100644
> index 0000000000..94da49fdf8
> --- /dev/null
> +++ b/package/flutter-engine/0004-pkg-config.py-do-not-prepend-sysroot-path.patch
> @@ -0,0 +1,34 @@
> +From 51e8fed854fd9d373bb9b20d7ed8e7cf6ef12312 Mon Sep 17 00:00:00 2001
> +From: Adam Duskett <aduskett@gmail.com>
> +Date: Wed, 19 Jul 2023 11:48:59 -0700
> +Subject: [PATCH] pkg-config.py: do not prepend sysroot path
> +
> +The pkg-config script provided by Buildroot already includes the sysroot
> +path, causing the pkg-config.py script to double prepend the sysroot path.
> +
> +IE: output/host/.../sysroot/output/host/.../sysroot
> +
> +Upstream: Buildroot specific
> +Signed-off-by: Adam Duskett <aduskett@gmail.com>

Actually, I don't see how this is Buildroot specific. We simply use the
standard PKG_CONFIG_SYSROOT_DIR variable. So it's what their
pkg-config.py script is doing that doesn't make sense: they shouldn't
prepend the sysroot themselves, but let pkg-config obey to the
PKG_CONFIG_SYSROOT_DIR variable.

Note: I'm not going to block the merging on this. But perhaps this is
something to report upstream.


> diff --git a/package/flutter-engine/Config.in b/package/flutter-engine/Config.in
> new file mode 100644
> index 0000000000..ba59e1c8ac
> --- /dev/null
> +++ b/package/flutter-engine/Config.in
> @@ -0,0 +1,60 @@
> +config BR2_PACKAGE_FLUTTER_ENGINE
> +	bool "flutter-engine"
> +	# Flutter includes a patched copy of clang which is mandatory to use for
> +	# compiling. However, we should still depend on LLVM_ARCH_SUPPORTS as it
> +	# gives a complete list of supported clang architectures.
> +	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS

One thing that bothers me a little bit here is that there is nothing
that guarantees us the clang copy in flutter-engine is in sync with the
copy in flutter-engine. Therefore, we might update
package/llvm-project/llvm to a newer version, which supports a new CPU
architecture, update BR2_PACKAGE_LLVM_ARCH_SUPPORTS to include the
newer architecture... but the copy in flutter-engine is older and
doesn't (yet) include that new CPU architecture.

> +	depends on BR2_TOOLCHAIN_USES_GLIBC
> +	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5
> +	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL # pthreads
> +	depends on BR2_INSTALL_LIBSTDCPP
> +	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::shared_future
> +	depends on !BR2_STATIC_LIBS
> +	depends on BR2_USE_WCHAR # std::wstring
> +	depends on BR2_HOST_GCC_AT_LEAST_5

We need the whole world! \o/

> +	depends on BR2_PACKAGE_HAS_LIBGL || BR2_PACKAGE_HAS_LIBGLES
> +	select BR2_PACKAGE_HOST_DEPOT_TOOLS
> +	select BR2_PACKAGE_FREETYPE

Minor nit: alphabetic ordering?

> +if BR2_PACKAGE_FLUTTER_ENGINE
> +
> +config BR2_PACKAGE_FLUTTER_ENGINE_ARTIFACTS
> +	bool "build the development artifacts"
> +	help
> +	  Build the development artifacts used for compiling
> +	  flutter applications. This significantly increases the time
> +	  to compile.

Could you clarify what those artifacts are? I don't really care about
"compiling flutter applications" on the target, I want to do that on
the host.

> +endif #if BR2_PACKAGE_FLUTTER_ENGINE
> +
> +comment "flutter-engine needs an OpenGL backend"
				 ^^^ an OpenGL or OpenGLES

	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS

needed here as well to not show the comment when not relevant.

> +	depends on !BR2_PACKAGE_HAS_LIBGL && !BR2_PACKAGE_HAS_LIBGLES

> diff --git a/package/flutter-engine/flutter-engine.mk b/package/flutter-engine/flutter-engine.mk
> new file mode 100644
> index 0000000000..b5b99c4cad
> --- /dev/null
> +++ b/package/flutter-engine/flutter-engine.mk
> @@ -0,0 +1,239 @@
> +################################################################################
> +#
> +# flutter-engine
> +#
> +################################################################################
> +
> +# Flutter-engine has a release on the GitHub page. However, that release is
> +# only for Google. Its intended purpose is for the gclient tool provided by
> +# Google in their depot-tools package. To use the source code, we must use
> +# gclient to download the flutter-engine source code along with several other
> +# projects. Unfortunately, the Buildroot download system does not have the
> +# capability of using gclient, and considering this package is the only
> +# package that uses gclient, we side-step the entire download process and
> +# perform the following steps if a tarball does not exist already:
> +#
> +#  - Copy the pre-made gclient config file to a temporary scratch directory.
> +#  - Run gclient sync to generate a source directory with the proper
> +#    flutter-engine source code in the correct places.
> +#  - Run mk_tar_gz to create a tarball.
> +#  - Copy the tarball to the $(FLUTTER_ENGINE_DL_DIR) directory to create a
> +#    tarball.
> +#
> +# There is no hash provided, as the gn binary (used for configuration) relies
> +# on the .git directories. As such, a reproducible tarball is not possible.
> +FLUTTER_ENGINE_VERSION = 3.10.6
> +
> +# There is nothing for Buildroot to download. This is handled by gclient.
> +FLUTTER_ENGINE_SITE =
> +FLUTTER_ENGINE_SOURCE =
> +FLUTTER_ENGINE_LICENSE = BSD-3-Clause
> +FLUTTER_ENGINE_LICENSE_FILES = LICENSE
> +FLUTTER_ENGINE_TARBALL_PATH = $(FLUTTER_ENGINE_DL_DIR)/flutter-$(FLUTTER_ENGINE_VERSION).tar.gz
> +FLUTTER_ENGINE_INSTALL_STAGING = YES
> +FLUTTER_ENGINE_DOWNLOAD_DEPENDENCIES = host-depot-tools
> +FLUTTER_ENGINE_DEPENDENCIES = \
> +	host-ninja \
> +	host-pkgconf \
> +	freetype \
> +	zlib
> +
> +# Dispatch all architectures of flutter
> +ifeq ($(BR2_i386),y)
> +FLUTTER_ENGINE_TARGET_ARCH = x86
> +FLUTTER_ENGINE_TARGET_TRIPPLE = x86-linux
> +else ifeq ($(BR2_x86_64),y)
> +FLUTTER_ENGINE_TARGET_ARCH = x64
> +FLUTTER_ENGINE_TARGET_TRIPPLE = x86_64-linux
> +else ifeq ($(BR2_arm)$(BR2_armeb),y)
> +FLUTTER_ENGINE_TARGET_ARCH = arm
> +FLUTTER_ENGINE_TARGET_TRIPPLE = arm-linux
> +else ifeq ($(BR2_aarch64),y)
> +FLUTTER_ENGINE_TARGET_ARCH = arm64
> +FLUTTER_ENGINE_TARGET_TRIPPLE = aarch64-linux
> +endif

So perhaps this the full list of supported CPU architectures? This is
already a subset of the ones in BR2_PACKAGE_LLVM_ARCH_SUPPORTS:
BR2_riscv is not handled here. So it does confirm my point above: using
BR2_PACKAGE_LLVM_ARCH_SUPPORTS is probably not correct.

> +ifeq ($(BR2_ENABLE_RUNTIME_DEBUG),y)
> +FLUTTER_ENGINE_RUNTIME_MODE=debug
> +else
> +FLUTTER_ENGINE_RUNTIME_MODE=release
> +endif
> +
> +FLUTTER_ENGINE_BUILD_DIR = \
> +	$(@D)/out/linux_$(FLUTTER_ENGINE_RUNTIME_MODE)_$(FLUTTER_ENGINE_TARGET_ARCH)
> +
> +FLUTTER_ENGINE_INSTALL_FILES = \
> +	libflutter_engine.so \
> +	libflutter_linux_gtk.so
> +
> +# Flutter engine includes a bundled patched clang that must be used for
> +# compiling or else there are linking errors.
> +FLUTTER_ENGINE_CLANG_PATH = $(@D)/buildtools/linux-x64/clang
> +
> +FLUTTER_ENGINE_CONF_OPTS = \
> +	--clang \
> +	--depot-tools $(HOST_DIR)/share/depot_tools \
> +	--embedder-for-target \
> +	--linux-cpu $(FLUTTER_ENGINE_TARGET_ARCH) \
> +	--no-build-embedder-examples \
> +	--no-clang-static-analyzer \
> +	--no-enable-unittests \
> +	--no-goma \
> +	--no-prebuilt-dart-sdk \
> +	--runtime-mode $(FLUTTER_ENGINE_RUNTIME_MODE) \
> +	--target-os linux \
> +	--target-sysroot $(STAGING_DIR) \
> +	--target-toolchain $(FLUTTER_ENGINE_CLANG_PATH) \
> +	--target-triple $(FLUTTER_ENGINE_TARGET_TRIPPLE)
> +
> +ifeq ($(BR2_arm)$(BR2_armeb),y)
> +FLUTTER_ENGINE_CONF_OPTS += \
> +	--arm-float-abi $(call qstrip,$(BR2_GCC_TARGET_FLOAT_ABI))
> +endif
> +
> +# We must specify a full path to ccache and a full path to the flutter-engine
> +# provided clang in order to use ccache, or else flutter-engine will error out
> +# attempting to find ccache in the target-toolchain provided path.
> +ifeq ($(BR2_CCACHE),y)
> +define FLUTTER_ENGINE_COMPILER_PATH_FIXUP
> +	$(SED) "s%cc =.*%cc = \"$(HOST_DIR)/bin/ccache $(FLUTTER_ENGINE_CLANG_PATH)/bin/clang\""%g \
> +		$(@D)/build/toolchain/custom/BUILD.gn
> +
> +	$(SED) "s%cxx =.*%cxx = \"$(HOST_DIR)/bin/ccache $(FLUTTER_ENGINE_CLANG_PATH)/bin/clang++\""%g \
> +		$(@D)/build/toolchain/custom/BUILD.gn
> +endef
> +FLUTTER_ENGINE_PRE_CONFIGURE_HOOKS += FLUTTER_ENGINE_COMPILER_PATH_FIXUP
> +endif
> +
> +ifeq ($(BR2_ENABLE_LTO),y)
> +FLUTTER_ENGINE_CONF_OPTS += --lto
> +else
> +FLUTTER_ENGINE_CONF_OPTS += --no-lto
> +endif
> +
> +ifeq ($(BR2_OPTIMIZE_0),y)
> +FLUTTER_ENGINE_CONF_OPTS += --unoptimized
> +endif
> +
> +ifeq ($(BR2_STRIP_strip),y)
> +FLUTTER_ENGINE_CONF_OPTS += --stripped
> +else
> +FLUTTER_ENGINE_CONF_OPTS += --no-stripped
> +endif

Please use --no-stripped unconditionally, and let Buildroot do the
stripping.


> +ifeq ($(BR2_PACKAGE_MESA3D),y)
> +FLUTTER_ENGINE_DEPENDENCIES += mesa3d
> +endif

Why do you have something specific to mesa3d here? mesa3d is an OpenGL
or OpenGLES provider, so:

+ifeq ($(BR2_PACKAGE_HAS_LIBGL),y)
+FLUTTER_ENGINE_DEPENDENCIES += libgl
+endif
+
+ifeq ($(BR2_PACKAGE_HAS_LIBGLES),y)
+FLUTTER_ENGINE_DEPENDENCIES += libgles
+endif

already deals with it.

> +# There is no --disable-vulkan option
> +ifeq ($(BR2_PACKAGE_MESA3D_VULKAN_DRIVER),y)
> +FLUTTER_ENGINE_CONF_OPTS += --enable-vulkan
> +endif

At some point we will probably want some kind of virtual package for
vulkan, but as it doesn't exist today, good enough for now.


> +# Generate a tarball if one does not already exist.
> +define FLUTTER_ENGINE_GENERATE_TARBALL
> +	PATH=$(BR_PATH):$(HOST_DIR)/share/depot_tools \
> +	PYTHONPATH=$(HOST_DIR)/lib/python$(PYTHON3_VERSION_MAJOR) \
> +	$(FLUTTER_ENGINE_PKGDIR)/gen-tarball \
> +		--dot-gclient $(FLUTTER_ENGINE_PKGDIR)/dot-gclient \
> +		--jobs $(PARALLEL_JOBS) \
> +		--scratch-dir $(@D)/dl-tmp \
> +		--tarball $(FLUTTER_ENGINE_TARBALL_PATH) \
> +		--version $(FLUTTER_ENGINE_VERSION)
> +endef
> +FLUTTER_ENGINE_POST_DOWNLOAD_HOOKS += FLUTTER_ENGINE_GENERATE_TARBALL

I was going to ask: why is this a post-download hook rather than an
override of the entire download step. Turns out we don't have anything
like <pkg>_DOWNLOAD_CMDS that we can override. It's a pity, cause it
would be the right thing to do here. Here again: I'm not making this a
requirement at all for your patch to  be merged.

> +define FLUTTER_ENGINE_EXTRACT_CMDS
> +	gzip -d -c $(FLUTTER_ENGINE_TARBALL_PATH) | tar --strip-components 1 -C $(@D) -xf -
> +endef

If I understand correctly, we cannot let the default <pkg>_EXTRACT_CMDS
do its job because <pkg>_SOURCE is empty. And <pkg>_SOURCE is empty to
prevent the default download step from downloading stuff. So here
again, being able to override the download step would allow us to set
<pkg>_SOURCE, and therefore be able to use the default extract commands.

> +define FLUTTER_ENGINE_CONFIGURE_CMDS
> +	cd $(@D)/ && \

Drop slash after cd $(@D)/

> +define FLUTTER_ENGINE_INSTALL_STAGING_CMDS
> +	$(foreach i,$(FLUTTER_ENGINE_INSTALL_FILES),
> +		$(Q)if [ -e $(FLUTTER_ENGINE_BUILD_DIR)/$(i) ]; then \
> +			$(INSTALL) -D -m 0755 $(FLUTTER_ENGINE_BUILD_DIR)/$(i) \
> +				$(STAGING_DIR)/usr/lib/$(i); \

Can FLUTTER_ENGINE_INSTALL_FILES be built in a bit of a smarter way to
avoid having the conditional here?

+FLUTTER_ENGINE_INSTALL_FILES = \
+	libflutter_engine.so \
+	libflutter_linux_gtk.so

Isn't libflutter_linux_gtk.so produced only when Gtk support is
available?

> diff --git a/package/flutter-engine/gen-tarball b/package/flutter-engine/gen-tarball
> new file mode 100755
> index 0000000000..572c055bea
> --- /dev/null
> +++ b/package/flutter-engine/gen-tarball
> @@ -0,0 +1,108 @@
> +#!/usr/bin/env bash
> +# Call gclient and generate a flutter-engine source tarball if one does not
> +# already exist.
> +#
> +# Author: Adam Duskett <adam.duskett@amarulasolutions.com>
> +set -eu
> +
> +DL_DIR=
> +DOT_GCLIENT=
> +JOBS=
> +SCRATCH_DIR=
> +TARBALL=
> +VERSION=
> +
> +# shellcheck disable=SC1091
> +. ./support/download/helpers
> +
> +# Print status messages in the same style Buildroot prints.
> +message() {
> +  term_bold="$(tput smso 2>/dev/null)"
> +  term_reset="$(tput rmso 2>/dev/null)"
> +  echo "${term_bold}>>> flutter-engine ${VERSION} ${1}${term_reset}"
> +}
> +
> +parse_opts(){
> +  local o O opts
> +
> +  o='d:j:s:t:v:'
> +  O='dot-gclient:,jobs:,scratch-dir:,tarball:,version:'
> +  opts="$(getopt -o "${o}" -l "${O}" -- "${@}")"
> +  eval set -- "${opts}"
> +
> +  while [ ${#} -gt 0 ]; do
> +    case "${1}" in
> +    (-d|--dot-gclient)
> +      DOT_GCLIENT="${2}"
> +      shift 2
> +      ;;
> +    (-j|--jobs)
> +      JOBS="${2}"
> +      shift 2
> +      ;;
> +    (-s|--scratch-dir)
> +      SCRATCH_DIR="${2}"
> +      shift 2
> +      ;;
> +    (-t|--tarball)
> +      DL_DIR=$(dirname "${2}")
> +      TARBALL="${2}"
> +      shift 2
> +      ;;
> +    (-v|--version)
> +      VERSION="${2}"
> +      shift 2
> +      ;;
> +    (--)
> +      shift
> +      break
> +      ;;
> +    esac
> +  done
> +}
> +
> +copy_dot_gclient(){
> +  rm -rf "${SCRATCH_DIR}"
> +  mkdir -p "${SCRATCH_DIR}"
> +  install -D -m 0755 "${DOT_GCLIENT}" "${SCRATCH_DIR}"/.gclient
> +  sed "s%!FLUTTER_VERSION!%${VERSION}%g" -i "${SCRATCH_DIR}"/.gclient
> +}
> +
> +run_gclient() {
> +  local gclient="${HOST_DIR}"/share/depot_tools/gclient.py
> +  if [[ ! -e "${gclient}" ]]; then
> +    message "${gclient} does not exist. Is host-depot-tools built and installed?"
> +    exit 1
> +  fi
> +  message "Downloading"
> +  cd "${SCRATCH_DIR}"
> +  "${gclient}" \
> +    sync \
> +    --delete_unversioned_trees \
> +    --no-history \
> +    --reset \
> +    --shallow \
> +    -j"${JOBS}"
> +}
> +
> +gen_tarball(){
> +  message "Generating tarball"
> +  mkdir -p "${DL_DIR}"
> +  mk_tar_gz \
> +    "${SCRATCH_DIR}"/src \
> +    flutter-"${VERSION}" \
> +    "$(git -C "${SCRATCH_DIR}"/src log -1 --pretty=format:%ci)" \
> +    "${TARBALL}"
> +  rm -rf "${SCRATCH_DIR}"
> +}
> +
> +main() {
> +  parse_opts "${@}"
> +  if [ ! -e "${TARBALL}" ]; then

I'm not sure about this condition. Why is there? If the tarball is
already there, I would expect this tool to re-generate it and overwrite
it, rather than "do nothing".

Thanks for this work. Seriously, it looks quite good, and close to a
state where it can be merged. I think it no longer needs to be in the
"RFC" state.

Thanks!

Thomas
-- 
Thomas Petazzoni, co-owner and CEO, Bootlin
Embedded Linux and Kernel engineering and training
https://bootlin.com
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

  reply	other threads:[~2023-08-08 17:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08  0:35 [Buildroot] [PATCH/next vRFCv2 0/3] Initial flutter packages Adam Duskett
2023-08-08  0:35 ` [Buildroot] [PATCH/next vRFCv2 1/3] package/python-httplib2: add host variant Adam Duskett
2023-08-08  0:35 ` [Buildroot] [PATCH/next vRFCv2 2/3] package/depot-tools: new package Adam Duskett
2023-08-08 17:33   ` Thomas Petazzoni via buildroot
2023-08-08  0:35 ` [Buildroot] [PATCH/next vRFCv2 3/3] package/flutter-engine: " Adam Duskett
2023-08-08 17:56   ` Thomas Petazzoni via buildroot [this message]
2023-08-09 20:22     ` Yann E. MORIN
2023-08-09 20:55       ` Thomas Petazzoni via buildroot
2023-08-08 19:37 ` [Buildroot] [PATCH/next vRFCv2 0/3] Initial flutter packages Thomas Petazzoni via buildroot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230808195621.1c5d4242@windsurf \
    --to=buildroot@buildroot.org \
    --cc=adam.duskett@amarulasolutions.com \
    --cc=angelo@amarulasolutions.com \
    --cc=asafka7@gmail.com \
    --cc=michael@amarulasolutions.com \
    --cc=thomas.petazzoni@bootlin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox