aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-wam/cef/cef_git.bb
diff options
context:
space:
mode:
authorRoger Zanoni <rzanoni@igalia.com>2023-06-22 09:15:24 +0200
committerRoger Zanoni <rzanoni@igalia.com>2023-07-18 15:28:52 +0200
commit7a7c0e1f4c62ab976dfd2a58d33ed93d62c587d3 (patch)
tree09969ca71e2d5954435cd7f72cc7b1372bc312f3 /recipes-wam/cef/cef_git.bb
parent49cf21e8cfb685dbb0c7843d468d7ed44e886c11 (diff)
[wam][cef] Add the CEF recipe
This change makes it possible to build applications that depend on libcef, and also adds a few changes picked from our previous implementation that enables the applications to communicate with the agl-compositor. Bug-AGL: SPEC-3872 Signed-off-by: Roger Zanoni <rzanoni@igalia.com> Change-Id: I215138b8f5d63da84ada2f8c006f4025f0b3fafb
Diffstat (limited to 'recipes-wam/cef/cef_git.bb')
-rw-r--r--recipes-wam/cef/cef_git.bb320
1 files changed, 320 insertions, 0 deletions
diff --git a/recipes-wam/cef/cef_git.bb b/recipes-wam/cef/cef_git.bb
new file mode 100644
index 000000000..1d1d83cdb
--- /dev/null
+++ b/recipes-wam/cef/cef_git.bb
@@ -0,0 +1,320 @@
+require gn-utils.inc
+
+LICENSE = "Apache-2.0 & BSD-3-Clause & LGPL-2.0-only & LGPL-2.1-only"
+
+LIC_FILES_CHKSUM = "\
+ file://LICENSE;md5=c408a301e3407c3803499ce9290515d6 \
+ file://third_party/blink/renderer/core/LICENSE-LGPL-2;md5=36357ffde2b64ae177b2494445b79d21 \
+ file://third_party/blink/renderer/core/LICENSE-LGPL-2.1;md5=a778a33ef338abbaf8b8a7c36b6eec80 \
+"
+CHROMIUM_URL = "github.com/rogerzanoni/chromium108.git"
+CHROMIUM_VERSION = "108.0.5359.125"
+BRANCH_chromium108 = "5359"
+# Taken from https://bitbucket.org/chromiumembedded/cef/src/5615/CHROMIUM_BUILD_COMPATIBILITY.txt
+SRCREV_chromium108 = "fe6cbc05f1ec805339364b0df0e8be925a991a80"
+SRCREV_cef = "a98cd4cdc0fdc49b6c38ba10cec800922745441e"
+GN_TARGET_CPU = "${@gn_arch_name('${TUNE_ARCH}')}"
+
+PV = "${CHROMIUM_VERSION}.${BRANCH_chromium108}+git"
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/files/cef:"
+FILESEXTRAPATHS:prepend := "${THISDIR}/files/chromium:"
+
+SRC_URI = "\
+ git://${CHROMIUM_URL};branch=${BRANCH_chromium108};protocol=https;rev=${SRCREV_chromium108};name=chromium108;destsuffix=git/chromium/src \
+ file://0001-sql-relax-constraints-on-VirtualCursor-layout.patch \
+ file://0002-Don-t-look-for-depot_tools-in-chrommium-s-third_part.patch \
+ file://0003-Remove-the-GN-settings-done-for-clang-that-conflict-.patch \
+ file://0004-Don-t-use-DRI-for-renesas.patch \
+ file://0005-Add-the-essential-parts-of-wayland-extensions-and-ag.patch \
+ file://0006-Add-webos-agl-waylandwindow-window-tree-host-essenti.patch \
+ file://0007-Only-bind-to-agl_shell-if-it-s-the-browser-process.patch \
+ file://0008-Add-a-method-to-check-if-the-agl-window-is-configure.patch \
+ file://0009-Start-using-agl-shell-version-4.patch \
+ \
+ git://bitbucket.org/chromiumembedded/cef.git;branch=${BRANCH_chromium108};protocol=https;rev=${SRCREV_cef};name=cef;destsuffix=git/chromium/src/cef \
+ file://0001-Add-an-option-to-use-an-output-directory-outside-src.patch;patchdir=cef \
+ file://0002-Add-an-option-to-override-the-default-distrib-direct.patch;patchdir=cef \
+ file://0003-Add-an-option-to-use-an-alternative-base-output-dire.patch;patchdir=cef \
+ file://0004-Add-an-option-to-bypass-sysroot-checking-and-force.patch;patchdir=cef \
+ file://0005-Linux-Fix-build-without-X11-fixes-issue-3431.patch;patchdir=cef \
+ file://0006-Add-AGL-wayland-window-related-calls.patch;patchdir=cef \
+ file://0007-Add-a-method-to-check-if-the-agl-window-is-configure.patch;patchdir=cef \
+ file://0008-Add-the-SetActivateRegion-method.patch;patchdir=cef \
+ file://0009-Allow-passing-the-app_id-on-widget-creation.patch;patchdir=cef \
+ file://0010-Update-generated-api-wrapper-files.patch;patchdir=cef \
+"
+
+BASE_DIR = "${WORKDIR}/git/chromium"
+CHROMIUM_DIR = "${BASE_DIR}/src"
+CEF_DIR = "${CHROMIUM_DIR}/cef"
+DEPOT_TOOLS_DIR="${STAGING_DIR_NATIVE}${datadir}/depot_tools"
+S = "${BASE_DIR}/src"
+B = "${WORKDIR}/build"
+
+OUT_PATH = "${B}/out/Release_GN_${GN_TARGET_CPU}"
+DIST_PATH = "${OUT_PATH}/dist/cef-minimal_${GN_TARGET_CPU}"
+CEF_DATA_PATH = "${datadir}/cef"
+
+DEPENDS:append = " curl clang-native gperf-native wayland dbus libcxx compiler-rt libxkbcommon nss nss-native atk at-spi2-atk libdrm pango cairo virtual/egl qemu-native pciutils glib-2.0 pkgconfig-native pulseaudio"
+
+do_sync[depends] += "depot-tools-wam-native:do_populate_sysroot"
+do_configure[depends] += "depot-tools-wam-native:do_populate_sysroot"
+do_compile[depends] += "depot-tools-wam-native:do_populate_sysroot"
+
+DOWNLOAD_PGO_PROFILES="False"
+
+# Adapted from CEF's tools/gclient_hooks.py
+python do_gclient_config() {
+ import os
+ # Create gclient configuration file.
+ gclient_file = os.path.join(d.expand('${BASE_DIR}'), '.gclient')
+ # Exclude unnecessary directories. Intentionally written without newlines.
+ gclient_spec = \
+ "solutions = [{"+\
+ "'managed': False,"+\
+ "'name': 'src', "+\
+ "'url': '" + d.expand('https://${CHROMIUM_URL}') + "', "+\
+ "'custom_vars': {"+\
+ d.expand("'checkout_pgo_profiles': '${DOWNLOAD_PGO_PROFILES}'") +\
+ "}, "+\
+ "'custom_deps': {"+\
+ "'build': None, "+\
+ "'build/scripts/command_wrapper/bin': None, "+\
+ "'build/scripts/gsd_generate_index': None, "+\
+ "'build/scripts/private/data/reliability': None, "+\
+ "'build/scripts/tools/deps2git': None, "+\
+ "'build/third_party/lighttpd': None, "+\
+ "'commit-queue': None, "+\
+ "'depot_tools': None, "+\
+ "'src/chrome_frame/tools/test/reference_build/chrome': None, "+\
+ "'src/chrome/tools/test/reference_build/chrome_linux': None, "+\
+ "'src/chrome/tools/test/reference_build/chrome_mac': None, "+\
+ "'src/chrome/tools/test/reference_build/chrome_win': None, "+\
+ "}, "+\
+ "'deps_file': 'DEPS', "+\
+ "'safesync_url': ''"+\
+ "}]"
+
+ with open(gclient_file, 'w+', encoding='utf-8') as fp:
+ fp.write(gclient_spec)
+}
+addtask do_gclient_config after do_unpack before do_configure
+
+# Mostly adapted from CEF's tools/automate/automate-git.py
+do_sync[network] = "1"
+python do_sync() {
+ import os
+ def cef_run(command_line, working_dir):
+ import subprocess
+ env = os.environ
+ env['PATH'] = d.expand("${DEPOT_TOOLS_DIR}") + os.pathsep + env['PATH']
+ env['DEPOT_TOOLS_UPDATE'] = "0"
+ env['GCLIENT_PY3'] = "1"
+
+ subprocess.check_output(command_line.split(),
+ cwd=working_dir,
+ env=env,
+ shell=False,
+ stderr=subprocess.STDOUT)
+
+ def cef_apply_patch(name, patches_path=os.path.join(d.expand("${CEF_DIR}"), 'patch', 'patches')):
+ patch_file = os.path.join(patches_path, name)
+ if not os.path.exists(patch_file + ".patch"):
+ # Attempt to apply the patch file.
+ patch_tool = os.path.join(d.expand("${CEF_DIR}"), 'tools', 'patcher.py')
+ cef_run('%s %s --patch-file "%s" --patch-dir "%s"' %
+ ("python3", patch_tool, patch_file, d.expand("${CHROMIUM_DIR}")),
+ d.expand("${CHROMIUM_DIR}"))
+
+ def cef_apply_deps_patch():
+ """ Patch the Chromium DEPS file before `gclient sync` if necessary. """
+ deps_path = os.path.join(d.expand("${CHROMIUM_DIR}"), 'DEPS')
+ if os.path.isfile(deps_path):
+ cef_apply_patch('DEPS')
+ else:
+ raise Exception("Path does not exist: DEPS")
+
+ def cef_apply_runhooks_patch():
+ """ Patch the Chromium runhooks files before `gclient runhooks` if necessary. """
+ cef_apply_patch('runhooks')
+
+ # CEF automation script usually applies
+ # applies patches before running sync and
+ # runhooks. This is taken directly from the
+ # automation script
+ def cef_do_sync():
+ cef_apply_deps_patch()
+ cef_run("gclient sync --reset --nohooks --jobs 16", d.expand("${CHROMIUM_DIR}"))
+ cef_apply_runhooks_patch()
+ cef_run("gclient runhooks --jobs 16", d.expand("${CHROMIUM_DIR}"))
+
+ cef_do_sync()
+}
+addtask do_sync after do_gclient_config before do_configure
+
+# gn defaults from CEF wiki, except for use_sysroot
+GN_DEFINES = "use_sysroot=false \
+ symbol_level=0 \
+ is_cfi=false \
+ use_thin_lto=false \
+"
+
+# Disable GTK and prevent cef from
+# building its gtk demos
+GN_DEFINES:append = " \
+ use_gtk=false \
+ cef_use_gtk=false \
+"
+
+GN_DEFINES:append = " \
+ treat_warnings_as_errors=false \
+ is_component_build=false \
+ use_cups=false \
+ use_kerberos=false \
+ use_ozone=true \
+ use_xkbcommon=true \
+ use_wayland_gbm=true \
+ use_gnome_keyring=false \
+ enable_remoting=false \
+"
+
+# ozone options
+GN_DEFINES:append = " \
+ use_ozone=true \
+ ozone_auto_platforms=false \
+ ozone_platform_headless=true \
+ ozone_platform_wayland=true \
+ ozone_platform_x11=false \
+ use_system_minigbm=true \
+ use_system_libdrm=true \
+ use_system_libwayland=true \
+"
+
+GN_DEFINES:append = " \
+ dcheck_always_on=false \
+ is_debug=false \
+ is_official_build=false \
+"
+
+GN_DEFINES:append = " \
+ use_egl=true \
+ use_glib=true \
+ use_dri=false \
+"
+
+# Disable PGO optimizations
+GN_DEFINES:append = " chrome_pgo_phase=0 "
+
+RUNTIME = "llvm"
+TOOLCHAIN = "clang"
+TOOLCHAIN:class-native = "clang"
+
+BUILD_AR:toolchain-clang = "llvm-ar"
+BUILD_CC:toolchain-clang = "clang"
+BUILD_CXX:toolchain-clang = "clang++"
+BUILD_LD:toolchain-clang = "clang"
+
+COMPATIBLE_MACHINE = "(-)"
+COMPATIBLE_MACHINE:aarch64 = "(.*)"
+COMPATIBLE_MACHINE:armv6 = "(.*)"
+COMPATIBLE_MACHINE:armv7a = "(.*)"
+COMPATIBLE_MACHINE:armv7ve = "(.*)"
+COMPATIBLE_MACHINE:x86 = "(.*)"
+COMPATIBLE_MACHINE:x86-64 = "(.*)"
+
+GN_DEFINES:append = ' \
+ use_lld=true \
+ use_gold=false \
+ gold_path="" \
+ is_clang=true \
+ clang_use_chrome_plugins=false \
+ clang_base_path="${STAGING_BINDIR_NATIVE}" \
+ host_toolchain=\"//build/toolchain/cros:host\" \
+ use_custom_libcxx_for_host=false \
+ cros_host_ar=\"${BUILD_AR}\" \
+ cros_host_cc=\"${BUILD_CC}\" \
+ cros_host_cxx=\"${BUILD_CXX}\" \
+ cros_host_ld=\"${BUILD_CXX}\" \
+ cros_host_extra_cppflags=\"${BUILD_CPPFLAGS}\" \
+ cros_host_extra_cxxflags=\"${BUILD_CXXFLAGS}\" \
+ cros_host_extra_ldflags=\"${BUILD_LDFLAGS}\" \
+ custom_toolchain=\"//build/toolchain/cros:target\" \
+ use_custom_libcxx=false \
+ target_cpu=\"${GN_TARGET_CPU}\" \
+ cros_target_ar=\"${AR}\" \
+ cros_target_cc=\"${CC}\" \
+ cros_target_cxx=\"${CXX}\" \
+ cros_target_ld=\"${CXX}\" \
+ cros_target_extra_cppflags=\"${CPPFLAGS}\" \
+ cros_target_extra_cxxflags=\"${CXXFLAGS}\" \
+ cros_target_extra_ldflags=\"${LDFLAGS}\" \
+ v8_snapshot_toolchain=\"//build/toolchain/cros:v8_snapshot\" \
+ cros_v8_snapshot_ar=\"${BUILD_AR}\" \
+ cros_v8_snapshot_cc=\"${BUILD_CC}\" \
+ cros_v8_snapshot_cxx=\"${BUILD_CXX}\" \
+ cros_v8_snapshot_cppflags=\"${CPPFLAGS}\" \
+ cros_v8_snapshot_cxxflags=\"${CXXFLAGS}\" \
+ cros_v8_snapshot_ldflags=\"${LDFLAGS}\" \
+ use_v8_context_snapshot=false \
+'
+
+PACKAGECONFIG ??= "upower use-egl"
+PACKAGECONFIG[use-egl] = ",,virtual/egl virtual/libgles2"
+PACKAGECONFIG[upower] = ",,,upower"
+
+GN_DEFINES:append = ' \
+ ${PACKAGECONFIG_CONFARGS} \
+'
+
+do_configure () {
+ bbnote "do_configure:"
+ bbnote "Base out path: ${B}"
+
+ export DEPOT_TOOLS_UPDATE=0
+ export GCLIENT_PY3=1
+ export PATH="${DEPOT_TOOLS_DIR}:$PATH"
+ export GN_DEFINES="${GN_DEFINES}"
+
+ cd ${S}/cef
+ python3 tools/gclient_hook.py --base-out-path ${B} --bypass-sysroot-check
+}
+
+do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+"
+do_compile () {
+ if [ ! -f ${OUT_PATH}/build.ninja ]; then
+ do_configure
+ fi
+
+ export PATH="${DEPOT_TOOLS_DIR}:$PATH"
+ export PATH="$PATH:${S}/third_party/ninja"
+ ninja ${PARALLEL_MAKE} -C ${OUT_PATH} libcef chrome_sandbox
+}
+
+do_install () {
+ cd ${S}/cef
+ python3 tools/make_distrib.py --output-dir ${OUT_PATH}/dist \
+ --dist-path-name cef-minimal \
+ --base-out-path ${B} \
+ --no-docs \
+ --no-symbols \
+ --no-archive \
+ --ninja-build \
+ --minimal \
+ --${GN_TARGET_CPU}-build \
+ --ozone
+
+ install -d ${D}${CEF_DATA_PATH}
+
+ cp -R --no-dereference --preserve=mode,links -v ${DIST_PATH}/* ${D}${CEF_DATA_PATH}
+ # TODO(rzanoni): Follow the wiki instructions to install the sandbox
+}
+
+# TODO: fix QA issues, libraries in the wrong location
+FILES:${PN} += " \
+ ${CEF_DATA_PATH} \
+"
+
+INSANE_SKIP:${PN} += "libdir"
+
+PROVIDES:${PN} += "cef"