Subject: Re: [PATCH 2/5] gnu: webrtc-for-telegram-desktop: Update to a5fbc9.

From: Liliana Marie Prikler <[email-masked]>
Date: Thu, 08 Sep 2022 16:29:51 +0200

Am Donnerstag, dem 08.09.2022 um 08:57 +0800 schrieb Hilton Chain:
> 
> * gnu/packages/telegram.scm (webrtc-for-telegram-desktop):
> Update to a5fbc9123e056e611e69acf0ceb4252ddd838adb.
> Use abseil-cpp-for-webrtc-for-telegram-desktop for abseil-cpp.
> [patches]:
> Add missing <cstdint.h> header.
> Add flag for disabling X11.
Mention the patches first in the ChangeLog, then you can just say "Add
[patch basename]".
> [snippet]:
> Don't keep these files: openh264, usrsctp, libvpx.
> Remove use of bundled openh264.
Can be shortened to "Remove bundled openh264, ..."
> [#:configure-flags]: Comment out.
> [#:phases]:
> Drop bundled libvpx.
You might want to do this in the snippet.
> Copy crc32c.
> Use cmake tool for compilation and installation (and use ninja).
You should still be able to produce Unix Makefiles with CMake.  If
ninja is really required, invoke it as ninja.
> [inputs]:
> Simplify.
> Drop unneeded inputs.
> Add external-sources variable for managing recursive checkouts.
> Add crc32c.
I think it's wiser to declare the external sources as variables, e.g.
(define libyuv-for-telegram-desktop (origin ...))
and then just refer to those variables in the post-unpack unpack step
via G-Expressions.
> [native-inputs]:
> Add ninja.
> Drop perl.
> [propagated-inputs]: Move libraries also needed by telegram-desktop
> here from
> inputs.
> [license]: Update according to source tree updates.
> 
> * gnu/packages/patches/webrtc-for-telegram-desktop-add-missing-
> cstdint.patch:
> New file.
> * gnu/packages/patches/webrtc-for-telegram-desktop-allow-disabling-
> X11.patch:
> New file.
> * gnu/local.mk: Add patches.
> ---
Please avoid gratuitous newlines in the ChangeLog.

>  gnu/local.mk                                  |   2 +
>  ...telegram-desktop-add-missing-cstdint.patch |  21 +++
>  ...telegram-desktop-allow-disabling-X11.patch | 123 +++++++++++++
>  gnu/packages/telegram.scm                     | 171 ++++++++++------
> --
>  4 files changed, 242 insertions(+), 75 deletions(-)
>  create mode 100644 gnu/packages/patches/webrtc-for-telegram-desktop-
> add-missing-cstdint.patch
>  create mode 100644 gnu/packages/patches/webrtc-for-telegram-desktop-
> allow-disabling-X11.patch
> 
> diff --git a/gnu/local.mk b/gnu/local.mk
> index 19102113c9..d0e5aeb125 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -1966,6 +1966,8 @@ dist_patch_DATA
> =                                         \
>    %D%/packages/patches/warsow-qfusion-fix-bool-return-
> type.patch       \
>    %D%/packages/patches/webkitgtk-adjust-bubblewrap-paths.patch \
>    %D%/packages/patches/webrtc-audio-processing-big-
> endian.patch        \
> +  %D%/packages/patches/webrtc-for-telegram-desktop-add-missing-
> cstdint.patch \
> +  %D%/packages/patches/webrtc-for-telegram-desktop-allow-disabling-
> X11.patch \
>    %D%/packages/patches/websocketpp-fix-for-cmake-3.15.patch    \
>    %D%/packages/patches/widelands-add-missing-map-include.patch \
>    %D%/packages/patches/widelands-system-wide_minizip.patch     \
> diff --git a/gnu/packages/patches/webrtc-for-telegram-desktop-add-
> missing-cstdint.patch b/gnu/packages/patches/webrtc-for-telegram-
> desktop-add-missing-cstdint.patch
> new file mode 100644
> index 0000000000..9dee9cf8e3
> --- /dev/null
> +++ b/gnu/packages/patches/webrtc-for-telegram-desktop-add-missing-
> cstdint.patch
> @@ -0,0 +1,21 @@
> +From 86d2bcd7afb8706663d29e30f65863de5a626142 Mon Sep 17 00:00:00
> 2001
> +From: Xiretza <[email-masked]>
> +Date: Sun, 15 May 2022 12:47:41 +0200
> +Subject: [PATCH] fix(h265_pps_parser): fix missing cstdint include
> +
> +---
> + src/common_video/h265/h265_pps_parser.h | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/common_video/h265/h265_pps_parser.h
> b/src/common_video/h265/h265_pps_parser.h
> +index 28c95ea9..c180b1b9 100644
> +--- a/src/common_video/h265/h265_pps_parser.h
> ++++ b/src/common_video/h265/h265_pps_parser.h
> +@@ -12,6 +12,7 @@
> + #define COMMON_VIDEO_H265_PPS_PARSER_H_
> +
> + #include "absl/types/optional.h"
> ++#include <cstdint>
> +
> + namespace rtc {
> + class BitBuffer;
> diff --git a/gnu/packages/patches/webrtc-for-telegram-desktop-allow-
> disabling-X11.patch b/gnu/packages/patches/webrtc-for-telegram-
> desktop-allow-disabling-X11.patch
> new file mode 100644
> index 0000000000..977f72475f
> --- /dev/null
> +++ b/gnu/packages/patches/webrtc-for-telegram-desktop-allow-
> disabling-X11.patch
> @@ -0,0 +1,123 @@
> +Add -DTG_OWT_USE_X11
> +
> +Allows disabling X11 desktop capturing independently of pipewire
> support, for
> +the few people that run wayland without any X11 support whatsoever.
> +
> +This setup is untested, but supported by the GNI build system, see:
> +* src/modules/desktop_capture/BUILD.gn (option
> rtc_use_x11_extensions)
> +
> +Toggling the WEBRTC_USE_X11 define also affects some files under
> +src/modules/audio_device, but that falls under "X11 support",
> regardless...
> +
> +diff --git a/CMakeLists.txt b/CMakeLists.txt
> +index 2e081ae7..c269177b 100644
> +--- a/CMakeLists.txt
> ++++ b/CMakeLists.txt
> +@@ -24,13 +24,14 @@ endif()
> +
> + option(BUILD_SHARED_LIBS "Builds shared libraries instead of
> static." OFF)
> + option(TG_OWT_USE_PROTOBUF "Use protobuf to generate additional
> headers. Useful for packaged build." ${BUILD_SHARED_LIBS})
> ++cmake_dependent_option(TG_OWT_USE_X11 "Use X11 for desktop capture
> on non-Apple Unix."  ON "UNIX; NOT APPLE" OFF)
> + cmake_dependent_option(TG_OWT_USE_PIPEWIRE "Use pipewire for
> desktop capture." ON "UNIX; NOT APPLE" OFF)
> + cmake_dependent_option(TG_OWT_DLOPEN_PIPEWIRE "dlopen pipewire for
> desktop capture." ${not_packaged_build} TG_OWT_USE_PIPEWIRE OFF)
> + option(TG_OWT_BUILD_AUDIO_BACKENDS "Build webrtc audio backends."
> OFF)
> +
> + if (BUILD_SHARED_LIBS)
> +     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
> +-    message(WARNING
> ++    message(DEBUG
> +         "tg_owt is a fork of Google's webrtc library and is
> developed by them as a static library without stable ABI in mind."
> +         "The feature of building tg_owt as a shared library is
> community maintained, it may and will break at any time without
> guarantee to work again."
> +         "Please reconsider your decision. Good luck."
> +@@ -96,6 +97,10 @@ endif()
> + add_library(tg_owt)
> + init_target(tg_owt)
> +
> ++if (TG_OWT_USE_X11)
> ++    link_x11(tg_owt)
> ++endif()
> ++
> + if (TG_OWT_USE_PIPEWIRE)
> +     if (TG_OWT_DLOPEN_PIPEWIRE)
> +         include(cmake/generate_stubs.cmake)
> +@@ -188,10 +193,6 @@ endif()
> + include(cmake/libwebrtcbuild.cmake)
> + target_link_libraries(tg_owt PUBLIC tg_owt::libwebrtcbuild)
> +
> +-if (UNIX AND NOT APPLE)
> +-    link_x11(tg_owt)
> +-endif()
> +-
> + function(add_sublibrary postfix)
> +     add_library(tg_owt_${postfix} OBJECT)
> +     init_feature_target(tg_owt_${postfix} ${postfix})
> +@@ -2369,6 +2370,39 @@ if (NOT TG_OWT_USE_PROTOBUF)
> +     )
> + endif()
> +
> ++if (NOT TG_OWT_USE_X11)
> ++    remove_target_sources(tg_owt ${webrtc_loc}
> ++        # src/modules/desktop_capture/BUILD.gn
> (rtc_use_x11_extensions)
> ++       
> modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.cc
> ++       
> modules/desktop_capture/linux/x11/mouse_cursor_monitor_x11.h
> ++        modules/desktop_capture/linux/x11/screen_capturer_x11.cc
> ++        modules/desktop_capture/linux/x11/screen_capturer_x11.h
> ++        modules/desktop_capture/linux/x11/shared_x_display.cc
> ++        modules/desktop_capture/linux/x11/shared_x_display.h
> ++        modules/desktop_capture/linux/x11/window_capturer_x11.cc
> ++        modules/desktop_capture/linux/x11/window_capturer_x11.h
> ++        modules/desktop_capture/linux/x11/window_finder_x11.cc
> ++        modules/desktop_capture/linux/x11/window_finder_x11.h
> ++        modules/desktop_capture/linux/x11/window_list_utils.cc
> ++        modules/desktop_capture/linux/x11/window_list_utils.h
> ++        modules/desktop_capture/linux/x11/x_atom_cache.cc
> ++        modules/desktop_capture/linux/x11/x_atom_cache.h
> ++        modules/desktop_capture/linux/x11/x_error_trap.cc
> ++        modules/desktop_capture/linux/x11/x_error_trap.h
> ++        modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
> ++        modules/desktop_capture/linux/x11/x_server_pixel_buffer.h
> ++        modules/desktop_capture/linux/x11/x_window_property.cc
> ++        modules/desktop_capture/linux/x11/x_window_property.h
> ++
> ++        # screen_drawer_linux.cc depends on x11, rest are revdeps
> ++        modules/desktop_capture/screen_drawer.cc
> ++        modules/desktop_capture/screen_drawer.h
> ++        modules/desktop_capture/screen_drawer_linux.cc
> ++        modules/desktop_capture/screen_drawer_lock_posix.cc
> ++        modules/desktop_capture/screen_drawer_lock_posix.h
> ++    )
> ++endif()
> ++
> + if (NOT TG_OWT_USE_PIPEWIRE)
> +     remove_target_sources(tg_owt ${webrtc_loc}
> +        
> modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
> +diff --git a/cmake/libwebrtcbuild.cmake b/cmake/libwebrtcbuild.cmake
> +index 4d037f4b..388b7aa9 100644
> +--- a/cmake/libwebrtcbuild.cmake
> ++++ b/cmake/libwebrtcbuild.cmake
> +@@ -29,6 +29,13 @@ INTERFACE
> +     BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0
> + )
> +
> ++if (TG_OWT_USE_X11)
> ++    target_compile_definitions(libwebrtcbuild
> ++    INTERFACE
> ++        WEBRTC_USE_X11
> ++    )
> ++endif()
> ++
> + if (TG_OWT_USE_PIPEWIRE)
> +     target_compile_definitions(libwebrtcbuild
> +     INTERFACE
> +@@ -65,11 +72,6 @@ else()
> +         INTERFACE
> +             WEBRTC_MAC
> +         )
> +-    else()
> +-        target_compile_definitions(libwebrtcbuild
> +-        INTERFACE
> +-            WEBRTC_USE_X11
> +-        )
> +     endif()
> +
> +     if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
> diff --git a/gnu/packages/telegram.scm b/gnu/packages/telegram.scm
> index 25d6a3e226..d339bae017 100644
> --- a/gnu/packages/telegram.scm
> +++ b/gnu/packages/telegram.scm
> @@ -30,6 +30,7 @@ (define-module (gnu packages telegram)
>    #:use-module (gnu packages digest)
>    #:use-module (gnu packages fcitx)
>    #:use-module (gnu packages fcitx5)
> +  #:use-module (gnu packages gl)
>    #:use-module (gnu packages glib)
>    #:use-module (gnu packages gnome)
>    #:use-module (gnu packages gnupg)
> @@ -43,6 +44,7 @@ (define-module (gnu packages telegram)
>    #:use-module (gnu packages linux)
>    #:use-module (gnu packages lxqt)
>    #:use-module (gnu packages lua)
> +  #:use-module (gnu packages ninja)
>    #:use-module (gnu packages perl)
>    #:use-module (gnu packages pkg-config)
>    #:use-module (gnu packages protobuf)
> @@ -58,11 +60,13 @@ (define-module (gnu packages telegram)
>    #:use-module (gnu packages tls)
>    #:use-module (gnu packages video)
>    #:use-module (gnu packages web)
> +  #:use-module (gnu packages xdisorg)
>    #:use-module (gnu packages xiph)
>    #:use-module (gnu packages xorg)
>    #:use-module ((guix licenses) #:prefix license:)
>    #:use-module (guix packages)
>    #:use-module (guix utils)
> +  #:use-module (guix gexp)
>    #:use-module (guix git-download)
>    #:use-module (guix build-system cmake)
>    #:use-module (guix build-system copy)
> @@ -83,9 +87,12 @@ (define-public abseil-cpp-for-webrtc-for-telegram-
> desktop
>            ((#:configure-flags flags)
>             `(cons* "-DCMAKE_CXX_STANDARD=17" ,flags))))))))
> 
> +;; NOTE: Here's Telegram Desktop's official build guide.
> +;;
> https://github.com/telegramdesktop/tdesktop/wiki/The-Packaged-Building-Mode
>  (define-public webrtc-for-telegram-desktop
> -  (let ((commit "91d836dc84a16584c6ac52b36c04c0de504d9c34")
> -        (revision "166"))
> +  (let ((abseil-cpp abseil-cpp-for-webrtc-for-telegram-desktop)
> +        (commit "a5fbc9123e056e611e69acf0ceb4252ddd838adb")
> +        (revision "167"))
>      (hidden-package
>       (package
>         (name "webrtc-for-telegram-desktop")
> @@ -96,94 +103,110 @@ (define-public webrtc-for-telegram-desktop
>            (method git-fetch)
>            (uri
>             (git-reference
> -            (url "https://github.com/desktop-app/tg_owt.git")
> +            (url "https://github.com/desktop-app/tg_owt")
>              (commit commit)))
>            (file-name
>             (git-file-name name version))
>            (sha256
> -           (base32
> "0plwdp6xgxi27hif5j7kpq425cidxyxbbga3z2f64dsninwy5p1x"))
> +           (base32
> "12qirihhabv46vn27dpw7dz0smlngb7wqjpypa9fm6k2zvf5py32"))
>            (modules '((guix build utils)
>                       (ice-9 ftw)
>                       (srfi srfi-1)))
> +          (patches
> +           (search-patches
> +            ;; https://github.com/desktop-app/tg_owt/pull/101
> +            "webrtc-for-telegram-desktop-add-missing-cstdint.patch"
> +            ;; Picked from Gentoo's repository.
> +            ;; TODO: There's also a patch for using standalone
> crc32c, we can
> +            ;; grab that patch once crc32c's been packaged.
> +            "webrtc-for-telegram-desktop-allow-disabling-
> X11.patch"))
>            (snippet
>             `(begin
>                (let ((keep
> -                     '( ;; Custom forks which are incompatible with
> the ones in Guix.
> -                       "abseil-cpp" "libsrtp" "openh264" "rnnoise"
> +                     '(;; Custom forks which are incompatible with
> the ones in Guix.
> +                       "abseil-cpp" "libsrtp" "rnnoise"
>                         ;; Not available in Guix.
> -                       "pffft" "usrsctp"
> -                       ;; Has cmake support files for libvpx input.
> -                       "libvpx")))
> +                       "pffft")))
>                  (with-directory-excursion "src/third_party"
>                    (for-each delete-file-recursively
>                              (lset-difference string=?
>                                               (scandir ".")
> -                                             (cons* "." ".."
> keep))))
> -                #t)))))
> +                                             (cons* "." ".."
> keep)))))
> +              ;; Force using standalone openh264.
> +              (substitute* "CMakeLists.txt"
> +               
> (("\\include\\(cmake\\/libopenh264\\.cmake\\)")""))))))
>         (build-system cmake-build-system)
>         (arguments
> -        `(#:tests? #f                   ; No target
> -          #:configure-flags
> -          (list
> -           "-DCMAKE_C_FLAGS=-fPIC"
> -           "-DCMAKE_CXX_FLAGS=-fPIC")
> -          #:phases
> -          (modify-phases %standard-phases
> -            (add-after 'unpack 'copy-inputs
> -              (lambda* (#:key inputs outputs #:allow-other-keys)
> -                (let* ((libvpx-from (assoc-ref inputs "libvpx"))
> -                       (libyuv-from (assoc-ref inputs "libyuv"))
> -                       (libvpx-to (string-append (getcwd)
> -                                                
> "/src/third_party/libvpx/source/libvpx"))
> -                       (libyuv-to (string-append (getcwd)
> -                                                
> "/src/third_party/libyuv")))
> -                  (copy-recursively libvpx-from libvpx-to)
> -                  (copy-recursively libyuv-from libyuv-to))
> -                #t)))))
> -       (native-inputs
> -        `(("perl" ,perl)
> -          ("pkg-config" ,pkg-config)
> -          ("python" ,python-wrapper)
> -          ("yasm" ,yasm)))
> +        (list #:tests? #f                   ; No target
> +              ;; NOTE: Options commented are default values.
> +              ;; See also: comments in inputs.
> +              ;; #:configure-flags
> +              ;; #~'("-DTG_OWT_USE_PIPEWIRE=ON"
> +              ;;     "-DTG_OWT_USE_X11=ON"
> +              ;;     "-DTG_OWT_USE_PROTOBUF=ON")
> +              #:phases
> +              #~(modify-phases %standard-phases
> +                  (add-after 'unpack 'copy-inputs
> +                    (lambda* (#:key inputs outputs #:allow-other-
> keys)
> +                      (let* ((libyuv-from (assoc-ref inputs
> "libyuv"))
> +                             (crc32c-from (assoc-ref inputs
> "crc32c"))
> +                             (libyuv-to (string-append (getcwd)
> +                                                      
> "/src/third_party/libyuv"))
> +                             (crc32c-to (string-append (getcwd)
> +                                                      
> "/src/third_party/crc32c/src")))
> +                        (copy-recursively libyuv-from libyuv-to)
> +                        (copy-recursively crc32c-from crc32c-to))))
> +                  (replace 'build
> +                    (lambda* (#:key (make-flags '()) (parallel-
> build? #t)
> +                              #:allow-other-keys)
> +                      (apply invoke "cmake" "--build" "."
> +                             `(,@(if parallel-build?
> +                                     `("-j" ,(number->string
> (parallel-job-count)))
> +                                     '())
> +                               ,@make-flags))))
> +                  (replace 'install
> +                    (lambda* (#:key (make-flags '()) #:allow-other-
> keys)
> +                      (apply invoke "cmake" "--install" "." make-
> flags))))))
>         (inputs
> -        `(("alsa" ,alsa-lib)
> -          ("ffmpeg" ,ffmpeg)
> -          ("libjpeg" ,libjpeg-turbo)
> -          ("glib" ,glib)
> -          ("libvpx"
> -           ,(origin
> -              (method git-fetch)
> -              (uri
> -               (git-reference
> -                (url
> "https://chromium.googlesource.com/webm/libvpx")
> -                (commit
> "5b63f0f821e94f8072eb483014cfc33b05978bb9")))
> -              (file-name
> -               (git-file-name "libvpx-for-webrtc-for-telegram-
> desktop" version))
> -              (sha256
> -               (base32
> "1psvxaddihlw1k5n0anxif3qli6zyw2sa2ywn6mkb8six9myrp68"))))
> -          ("libyuv"
> -           ,(origin
> -              (method git-fetch)
> -              (uri
> -               (git-reference
> -                (url
> "https://chromium.googlesource.com/libyuv/libyuv")
> -                (commit
> "ad890067f661dc747a975bc55ba3767fe30d4452")))
> -              (file-name
> -               (git-file-name "libyuv-for-webrtc-for-telegram-
> desktop" version))
> -              (sha256
> -               (base32
> "01knnk4h247rq536097n9n3s3brxlbby3nv3ppdgsqfda3k159ll"))))
> -          ("libxcomposite" ,libxcomposite)
> -          ("libxdamage" ,libxdamage)
> -          ("libxrender" ,libxrender)
> -          ("libxrandr" ,libxrandr)
> -          ("openssl" ,openssl)
> -          ("opus" ,opus)
> -          ("pipewire" ,pipewire)
> -          ("protobuf" ,protobuf)
> -          ("pulseaudio" ,pulseaudio)
> -          ("x11" ,libx11)
> -          ("xext" ,libxext)
> -          ("xtst" ,libxtst)))
> +        (let ((external-sources
> +               `(("libyuv"
> +                  ,(origin
> +                     (method git-fetch)
> +                     (uri (git-reference
> +                           (url
> "https://chromium.googlesource.com/libyuv/libyuv")
> +                           (commit
> "ad890067f661dc747a975bc55ba3767fe30d4452")))
> +                     (file-name
> +                      (git-file-name "libyuv-for-webrtc-for-
> telegram-desktop" version))
> +                     (sha256
> +                      (base32
> "01knnk4h247rq536097n9n3s3brxlbby3nv3ppdgsqfda3k159ll"))))
> +                 ("crc32c"
> +                  ,(origin
> +                     (method git-fetch)
> +                     (uri (git-reference
> +                           (url "https://github.com/google/crc32c")
> +                           (commit
> "21fc8ef30415a635e7351ffa0e5d5367943d4a94")))
> +                     (file-name
> +                      (git-file-name "crc32c-for-webrtc-for-
> telegram-desktop" version))
> +                     (sha256
> +                      (base32
> "0cddf8z7v33gfb2k60lkzwa97g20m1v81cnvllm3q9ylpnx8g6f4")))))))
> +          (modify-inputs external-sources
> +            (prepend openh264           ;Required
> +                     protobuf           ;TG_OWT_USE_PROTOBUF
> +                     glib               ;TG_OWT_USE_PIPEWIRE
> +                     libdrm
> +                     libglvnd
> +                     mesa
> +                     pipewire-0.3
> +                     libxcomposite      ;TG_OWT_USE_X11
> +                     libxdamage
> +                     libxext
> +                     libxfixes
> +                     libxrandr
> +                     libxrender
> +                     libxtst))))
> +       (native-inputs (list ninja python-wrapper pkg-config yasm))
> +       (propagated-inputs
> +        (list abseil-cpp ffmpeg libjpeg-turbo libvpx openssl opus))
Avoid propagating inputs.  Instead patch invocations where needed.
>         (synopsis "WebRTC support for Telegram Desktop")
>         (description "WebRTC-for-Telegram-Desktop is a custom WebRTC
> fork by
>  Telegram project, for its use in telegram desktop client.")
> @@ -194,13 +217,11 @@ (define-public webrtc-for-telegram-desktop
>           license:asl2.0
>           ;; LibYuv
>           (license:non-copyleft
> "file:///src/third_party/libyuv/LICENSE")
> -         ;; OpenH264
> -         license:bsd-2
>           ;; PFFFT
>           (license:non-copyleft
> "file:///src/third_party/pffft/LICENSE")
>           ;; RnNoise
>           license:gpl3
> -         ;; LibSRTP, LibVPx, UsrSCTP and Others
> +         ;; LibSRTP, Crc32c and Others
>           license:bsd-3))))))
> 
>  (define-public rlottie-for-telegram-desktop
> --
> 2.37.2
> 
Cheers