Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package nodejs-electron for openSUSE:Factory 
checked in at 2024-05-12 22:54:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/nodejs-electron (Old)
 and      /work/SRC/openSUSE:Factory/.nodejs-electron.new.1880 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "nodejs-electron"

Sun May 12 22:54:10 2024 rev:117 rq:1173455 version:29.3.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/nodejs-electron/nodejs-electron.changes  
2024-05-10 12:06:13.883870258 +0200
+++ 
/work/SRC/openSUSE:Factory/.nodejs-electron.new.1880/nodejs-electron.changes    
    2024-05-13 01:19:26.547354337 +0200
@@ -1,0 +2,9 @@
+Sat May 11 22:35:19 UTC 2024 - Bruno Pitrus <brunopit...@hotmail.com>
+
+- nodejs-electron-devel:
+  * Introduce /usr/libexec/electron-node wrapper scripts
+  * Introduce `electron_rebuild`, `electron_check_native`
+    and `electron_check_native_unstable` RPM macros to ease packaging Electron 
apps
+  * Correct some injected compiler flags (common.gypi-compiler.patch)
+
+-------------------------------------------------------------------

New:
----
  common.gypi-compiler.patch

BETA DEBUG BEGIN:
  New:    and `electron_check_native_unstable` RPM macros to ease packaging 
Electron apps
  * Correct some injected compiler flags (common.gypi-compiler.patch)
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ nodejs-electron.spec ++++++
--- /var/tmp/diff_new_pack.4a0Lzk/_old  2024-05-13 01:19:32.003554090 +0200
+++ /var/tmp/diff_new_pack.4a0Lzk/_new  2024-05-13 01:19:32.003554090 +0200
@@ -192,6 +192,12 @@
 %endif
 
 
+%if 0%{?suse_version}
+%{expand:%%global NODEJS_DEFAULT_VER %(echo %{nodejs_version}|sed 's/\..*//')}
+%else
+%global NODEJS_DEFAULT_VER %nil
+%endif
+
 # We always ship the following bundled libraries as part of Electron despite a 
system version being available in either openSUSE or Fedora:
 # Name         | Path in tarball                   | Reason
 # 
-------------+-----------------------------------+---------------------------------------
@@ -238,6 +244,7 @@
 # PATCHES for openSUSE-specific things (compiler flags, paths, etc.)
 Patch0:         chromium-102-compiler.patch
 Patch1:         fpic.patch
+Patch2:         common.gypi-compiler.patch
 Patch3:         gcc-enable-lto.patch
 Patch7:         chromium-91-java-only-allowed-in-android-builds.patch
 # Always disable use_thin_lto which is an lld feature
@@ -438,6 +445,9 @@
 %else
 BuildRequires:  npm
 %endif
+%if 0%{?suse_version}
+BuildRequires: nodejs-packaging
+%endif
 BuildRequires:  pkgconfig
 BuildRequires:  plasma-wayland-protocols
 BuildRequires:  python3-json5
@@ -679,6 +689,11 @@
 Group:          Development/Libraries/C and C++
 Requires:       nodejs-electron%{_isa} = %{version}
 Requires:       pkgconfig(zlib)
+%if 0%{?suse_version}
+Requires:       npm%{NODEJS_DEFAULT_VER}
+%else
+Requires:       nodejs-npm
+%endif
 
 
 %description devel
@@ -1373,10 +1388,83 @@
 
 cp -lrvT out/Release/gen/node_headers/include/node 
%{buildroot}%{_includedir}/electron
 
+# Electron has a little known feature that make it work like a nodejs binary.
+# We make use of it in the %%electron_rebuild macro which builds all 
dependencies in node_modules against Electron's headers.
+# Not all scripts work when run under electron,
+# but importantly npm/yarn and GYP do.
+mkdir -pv %{buildroot}%{_libexecdir}/electron-node
+
+
+cat <<EOF > %{buildroot}%{_libexecdir}/electron-node/node
+#!/bin/sh
+ELECTRON_RUN_AS_NODE=1 exec %{_libdir}/electron/electron "\$@"
+EOF
+
+# HACK: This will refer to /usr/bin/npm17 on openSUSE, /usr/bin/npm on Fedora 
which are Node scripts
+cat <<EOF >%{buildroot}%{_libexecdir}/electron-node/npm
+#!/bin/sh
+exec %{_libexecdir}/electron-node/node %{_bindir}/npm%{NODEJS_DEFAULT_VER} 
"\$@"
+EOF
+
+cat <<EOF > %{buildroot}%{_libexecdir}/electron-node/npx
+#!/bin/sh
+exec %{_libexecdir}/electron-node/node %{_bindir}/npx%{NODEJS_DEFAULT_VER} 
"\$@"
+EOF
+
+# On Fedora, /usr/bin/yarn is a node script which means it needs to be wrapped 
too. On openSUSE, it is a shell script.
+%if 0%{?fedora}
+cat <<EOF > %{buildroot}%{_libexecdir}/electron-node/yarn
+#!/bin/sh
+exec %{_libexecdir}/electron-node/node %{_bindir}/yarn "\$@"
+EOF
+%endif
+chmod -v 0755 %{buildroot}%{_libexecdir}/electron-node/*
+
 # Install electron.macros
 mkdir -p %{buildroot}%{_rpmconfigdir}/macros.d
 cp /dev/stdin %{buildroot}%{_rpmconfigdir}/macros.d/macros.electron <<"EOF"
+# Ensure rebuilds when electron major changes.
 %%electron_req Requires: electron%{_isa}(abi) = %{abi_version}
+
+# Build native modules against Electron. This should be done as the first step 
in ‰build. You must set CFLAGS/LDFLAGS previously.
+# You can call it multiple times in different directories and pass more 
parameters to it (seen in vscode)
+%%electron_rebuild PATH="%{_libexecdir}/electron-node:$PATH" npm rebuild 
--verbose --foreground-scripts --nodedir=%{_includedir}/electron
+
+# Sanity check that native modules load. You must include this in ‰check if 
the package includes native modules (possibly in addition to actual test suites)
+# These do, in order:
+# 1. Detect underlinking (missing dependencies)
+# 2. Detect accidental linking to libuv which must not be used (Electron 
exports its own incompatible version)
+# 3. Actually load each module
+
+# This one should be paired with a simple `Requires: nodejs-electron%{_isa}` 
in requirements.
+%%electron_check_native \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX sh 
-c '! ldd -d -r XXX | \\\
+    grep    '\\''^undefined symbol'\\'' | \\\
+    grep -v '\\''^undefined symbol: napi_'\\'' | \\\
+    grep -v '\\''^undefined symbol: uv_'\\'' ' \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX sh 
-c '! objdump -p XXX | grep -F libuv.so.1' \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX env 
ELECTRON_RUN_AS_NODE=1 %{_libdir}/electron/electron -e 'require("XXX")'
+
+# This one allows use of unstable APIs and should be paired with the 
`‰electron_req` macro in requirements.
+%%electron_check_native_unstable \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX sh 
-c '! ldd -d -r XXX | \\\
+    grep    '\\''^undefined symbol'\\'' | \\\
+    grep -v '\\''^undefined symbol: node_'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZN12v8_inspector'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZN2v8'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZN4node'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZN5cppgc'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZN8electron'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZNK12v8_inspector'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZNK2v8'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZNK4node'\\'' | \\\
+    grep -v '\\''^undefined symbol: _ZNK5cppgc'\\'' | \\\
+    grep -v '\\''^undefined symbol: napi_'\\'' | \\\
+    grep -v '\\''^undefined symbol: uv_'\\'' ' \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX sh 
-c '! objdump -p XXX | grep -F libuv.so.1' \
+  find '%%{buildroot}' -type f -name '*.node' -print0 | xargs -0 -t -IXXX env 
ELECTRON_RUN_AS_NODE=1 %{_libdir}/electron/electron -e 'require("XXX")'
+
+
 EOF
 chmod -v 644 %{buildroot}%{_rpmconfigdir}/macros.d/macros.electron
 
@@ -1420,6 +1508,13 @@
 %files devel
 %{_includedir}/electron
 %{_rpmconfigdir}/macros.d/macros.electron
+%dir %{_libexecdir}/electron-node
+%{_libexecdir}/electron-node/node
+%{_libexecdir}/electron-node/npm
+%{_libexecdir}/electron-node/npx
+%if 0%{?fedora}
+%{_libexecdir}/electron-node/yarn
+%endif
 
 %files doc
 %doc electron/README.md

++++++ common.gypi-compiler.patch ++++++
--- src/third_party/electron_node/common.gypi.orig      2024-05-09 
09:30:23.202414200 +0000
+++ src/third_party/electron_node/common.gypi   2024-05-10 17:53:01.801592000 
+0000
@@ -428,10 +428,15 @@
         'ldflags': [ '-pthread' ],
       }],
       [ 'OS in "linux freebsd openbsd solaris android aix os400 cloudabi"', {
-        'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
+        # Add some useful flags which need to be specified on all modules 
anyway.
+        # `-fpic -fno-semantic-interposition` is the best relocation model for 
code that will live in a dlopened library
+        # If a downstream package needs capital `-fPIC` (unlikely) it can 
still override this (unlike CFLAGS which are injected at the very end)
+        # `-fvisibility=hidden` is something we're adding to fix downstream 
overzealous exports.
+        # The electron headers annotate their visibility correctly, but many 
third-party code does not which leads to bloated builds.
+        'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', '-fpic', 
'-fno-semantic-interposition', '-fvisibility=hidden' ],
         'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++17' ],
         'defines': [ '__STDC_FORMAT_MACROS' ],
-        'ldflags': [ '-rdynamic' ],
+        #'ldflags': [ '-rdynamic' ], this is totally bogus — we are building 
a plugin, not a plugin host
         'target_conditions': [
           # The 1990s toolchain on SmartOS can't handle thin archives.
           ['_type=="static_library" and OS=="solaris"', {
@@ -608,29 +613,7 @@
           '-Wl,--export-dynamic',
         ],
       }],
-      # if node is built as an executable,
-      #      the openssl mechanism for keeping itself "dload"-ed to ensure 
proper
-      #      atexit cleanup does not apply
-      ['node_shared_openssl!="true" and node_shared!="true"', {
-        'defines': [
-          # `OPENSSL_NO_PINSHARED` prevents openssl from dload
-          #      current node executable,
-          #      see https://github.com/nodejs/node/pull/21848
-          #      or https://github.com/nodejs/node/issues/27925
-          'OPENSSL_NO_PINSHARED'
-        ],
-      }],
-      ['node_shared_openssl!="true"', {
-        # `OPENSSL_THREADS` is defined via GYP for openSSL for all 
architectures.
-        'defines': [
-          'OPENSSL_THREADS',
-        ],
-      }],
-      ['node_shared_openssl!="true" and openssl_no_asm==1', {
-        'defines': [
-          'OPENSSL_NO_ASM',
-        ],
-      }],
+      # Electron does not export its openssl fork (boringssl). Removing these 
defines which are bogus and can interfere with modules actually using openssl 
(signal-desktop is known to use it)
       ['OS == "zos"', {
         'defines': [
           '_XOPEN_SOURCE_EXTENDED',

Reply via email to