From nobody Wed May 8 12:39:47 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+89889+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+89889+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1652899469; cv=none; d=zohomail.com; s=zohoarc; b=NjW7g6FNZxM4TuA8fnuKA6bh8JXlXkuqrRLZcjmB9g/g3OoVkOcSr1zZWfhrmupM1PgC2pM0+abQhmfgPXHpizvami5M4rx8hzhx9DJ7+RklPmrZ2nFFqIU+6FBA/ITugggTPjOCj10fvfYnHqoGTTVbGgEoBp0BrhFtIn7gebE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652899469; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Wr1IHU6/JRpBlfjDaCvmhNmuwoFixFYdi8K0K+tF2oQ=; b=hhAeV3K/jK1E0bhhQ4IDZlv8vb7Aw57hsQHNxlpYtUJRnuppU9c0e9AeKk1q2KF8IswY+45uwcQudLM/KZm+RpWsAThsPSAF4usG7zDZTd/4691SqQYL8JOUmL1BZqW/SZaisZQZKO4taSl5kwO+urObBa95XzFQvQvH9QlYjro= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+89889+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1652899469042640.0744607699327; Wed, 18 May 2022 11:44:29 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id Uuy3YY1788612x9OTI9ka3vK; Wed, 18 May 2022 11:44:27 -0700 X-Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web12.305.1652899464227836100 for ; Wed, 18 May 2022 11:44:26 -0700 X-IronPort-AV: E=McAfee;i="6400,9594,10351"; a="358250848" X-IronPort-AV: E=Sophos;i="5.91,235,1647327600"; d="scan'208";a="358250848" X-Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2022 11:42:40 -0700 X-IronPort-AV: E=Sophos;i="5.91,235,1647327600"; d="scan'208";a="597975304" X-Received: from njayapra-mobl1.gar.corp.intel.com ([10.213.122.139]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2022 11:42:39 -0700 From: "Jayaprakash, N" To: devel@edk2.groups.io Subject: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8: GCC tool chain support Date: Thu, 19 May 2022 00:12:22 +0530 Message-Id: <20220518184222.2153-2-n.jayaprakash@intel.com> In-Reply-To: <20220518184222.2153-1-n.jayaprakash@intel.com> References: <20220518184222.2153-1-n.jayaprakash@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,n.jayaprakash@intel.com X-Gm-Message-State: CnJO8Od0DvTvVI8fJLXctkVlx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1652899467; bh=ELpFpSQXdOD79s3pYBH12Sjm7YOXCt24WBwA6SaZ6vE=; h=Date:From:Reply-To:Subject:To; b=e+IYSmwUQWOrDmzolguxgAtnWYrZ1IYmwvI+bEhnIK9Nsu7xtQsqQdRpz6n3YYumLsz OawjjQ5cqMlrWvrXU7VzjoU7hYaJ/fDIYRG0XX2lW0Ljv901DbycGKcSShKq6vQjSjP+h 657RVNVeNNVYP8ZWtaKnJp7uSMhtBjAjS1s= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1652899469650100007 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3779 This commit contains the changes made to Python interpreter 3.6.8 to cross compile using the GCC tool chain on Ubuntu 20.04 LTS system for UEFI. The ctypes module has been excluded from GCC compilatio= n as it requires additional porting work to use GCC tool chain support for UEFI environme= nt. Added GCC Compilation steps as BKM document to facilitate the environmen= t setup and compilation on Linux using GCC tool chain. Besides this provided a shell= script to generate the usable Python UEFI package with all the dependencies taken = from the build environment. Cc: Rebecca Cran Cc: Michael D Kinney Signed-off-by: Jayaprakash N Reviewed-by: Michael D Kinney --- .../Python-3.6.8/GCCCompilationBKMs.rst | 193 ++++++++++++++++++ .../PyMod-3.6.8/Include/pyconfig.h | 2 +- .../Python-3.6.8/PyMod-3.6.8/Modules/config.c | 7 +- .../PyMod-3.6.8/Modules/getpath.c | 2 +- .../Python/Python-3.6.8/Python368.inf | 21 +- .../Python-3.6.8/create_python368_pkg.sh | 100 +++++++++ 6 files changed, 312 insertions(+), 13 deletions(-) create mode 100644 AppPkg/Applications/Python/Python-3.6.8/GCCCompilationB= KMs.rst create mode 100644 AppPkg/Applications/Python/Python-3.6.8/create_python36= 8_pkg.sh diff --git a/AppPkg/Applications/Python/Python-3.6.8/GCCCompilationBKMs.rst= b/AppPkg/Applications/Python/Python-3.6.8/GCCCompilationBKMs.rst new file mode 100644 index 0000000..ed5fcbe --- /dev/null +++ b/AppPkg/Applications/Python/Python-3.6.8/GCCCompilationBKMs.rst @@ -0,0 +1,193 @@ +1. Introduction +--------------- +This is a Best-Known Methods document capturing the details of build envir= onment setup for compiling the Python UEFI +interpreter version 3.6.8 using GCC tool chain on Linux based operating sy= stems. These BKMs have been tested with WSL2 +(Windows Subsystem for Linux 2) based Ubuntu 20.04 LTS environment on Wind= ows 10. Only 64-bit builds are possible due +to a limitation in the LibC support for GCC compiler tool chain on UEFI. I= f you are working on a Ubuntu 20.04 LTS system +you may skip the sections 1.1 and 1.2 + + +1.1. WSL2 Installation on Windows 10 OS +---------------------------------------- + +The WSL2 environment can be setup by following the instructions given in t= he below webpage +https://pureinfotech.com/install-windows-subsystem-linux-2-windows-10/ + +1.2. Installing Ubuntu 20.04 LTS on WSL2 on Windows 10 OS +---------------------------------------------------------- + +The instructions provided in the below webpage will help in installing the= Ubuntu 20.04 LTS OS environment on WSL2 on Windows 10 OS. +https://www.altisconsulting.com/au/insights/installing-ubuntu-bash-for-win= dows-10-wsl2-setup/ + +2. EDK2 build environment setup +------------------------------- + +You may follow the instructions provided in the below webpage to setup the= edk2 build environment. + +https://github.com/tianocore/tianocore.github.io/wiki/Using-EDK-II-with-Na= tive-GCC + +For the purposes of describing the BKMs, we will be using the following pa= ths. +Edk2 source tree: $HOME/src/edk2 +Native GCC version >=3D4.x compiler installation: /usr/bin/gcc +Intel ASL Compiler installation: /usr/bin/iasl + + +2.1. Installing essential packages for GCC compiler +---------------------------------------------------- + +Install the below required essential packages to facilitate compilation of= the edk2 repo using GCC compiler tool chain. +Several Ubuntu packages will be needed to set up the build environment for= EDK II. + +The following command will install all required packages:: + + bash$ sudo apt-get update + bash$ sudo apt install build-essential + bash$ sudo apt install uuid-dev iasl git nasm python-is-python3 + +Package - Description + * build-essential : Informational list of build-essential packages + * uuid-dev : Universally Unique ID library (headers and static librari= es) + * iasl : Intel ASL compiler/decompiler (also provided by acpica-tools) + * git : Support for git revision control system + * nasm : General-purpose x86 assembler + * python-is-python3 : Ubuntu 20.04 python command is 'python3' but edk= 2 tools use 'python' + +Once the above packages are installed, then follow the instructions in the= webpage to setup the rest of the build +environment +https://github.com/tianocore/tianocore.github.io/wiki/Common-instructions + + +2.2. Cloning edk2 git repo +--------------------------- + +Get the edk2 source tree using Git commands. +Execute the below commands to clone the edk2 git repo:: + bash$ mkdir ~/src + bash$ cd ~/src + bash$ git clone https://github.com/tianocore/edk2 + +This will create a folder named edk2 as a clone of the edk2 git repo. +Execute the below commands to checkout / initialize all the git submodules= :: + bash$ cd ~/src/edk2 + bash$ git submodule update --init + +The above command initializes all the submodules in the git repo +The below commands help to setup the environment variables required for bu= ilding the edk2 repo:: + =20 + bash$ make -C BaseTools + bash$ . edksetup.sh + +Run the below make command from ~/src folder i.e change working directory = to ~/src and run the make command as given below :: + + bash$ cd ~/src + bash$ make -C edk2/BaseTools + +Setup build shell environment :: + + bash$ cd ~/src/edk2 + bash$ export EDK_TOOLS_PATH=3D$HOME/src/edk2/BaseTools + bash$ . edksetup.sh BaseTools + + +Set Build Target Information +For the Conf/target.txt file, find the following lines: +ACTIVE_PLATFORM =3D Nt32Pkg/Nt32Pkg.dsc + +TOOL_CHAIN_TAG =3D MYTOOLS + +And change the corresponding lines to match these: + +ACTIVE_PLATFORM =3D MdeModulePkg/MdeModulePkg.dsc + +TOOL_CHAIN_TAG =3D GCC5 + +Install GCC5 on Ubuntu 20.04 LTS by downloading it from +https://askubuntu.com/questions/1235819/ubuntu-20-04-gcc-version-lower-tha= n-gcc-7 + +This requires latest version of the nasm tool to be installed. +The nasm latest version >=3D 2.15.05 + +Debian package for nasm 2.15.05 is available at + +https://ubuntu.pkgs.org/21.10/ubuntu-universe-amd64/nasm_2.15.05-1_amd64.d= eb.html + +Download it using the wget command as given below:: + + bash$ sudo wget http://archive.ubuntu.com/ubuntu/pool/universe/n/n= asm/nasm_2.15.05-1_amd64.deb + + +Install the the above downloaded nasm debian package using the following c= ommand:: + + bash$ sudo dpkg -i nasm_2.15.05-1_amd64.deb + +2.3. Install additional packages required for building edk2 with GCC +--------------------------------------------------------------------- + +Install additional package required for building edk2 repo:: + =20 + bash$ sudo apt install libx11-dev + bash$ sudo apt install libxext-dev + + +2.4 Clone edk2-libc and copy the contents to edk2 +-------------------------------------------------- + +Now clone the edk2-libc git repo by following / executing the below comman= ds:: + =20 + bash$ cd ~/src + bash$ git clone https://github.com/tianocore/edk2-libc.git + bash$ export PACKAGES_PATH=3D$HOME/src/edk2:$HOME/src/edk2-libc + + +Verify that you can build the hello world application from AppPkg under ed= k2-libc by running the following commands +Build hello.inf from edk2-libc applications:: + =20 + $bash build -p AppPkg/AppPkg.dsc -m AppPkg/Applications/Hello/Hell= o.inf + +Copy the contents of edk2-libc to edk2 folder:: + =20 + bash$ cp -rf ~/src/edk2-libc/* ~/src/edk2/ + +2.5. Build Python Interpreter using GCC +---------------------------------------- +Uncomment the line containing following inf file name in AppPkg/AppPkg.dsc= file +AppPkg/Applications/Python/Python-3.6.8/Python368.inf + +Execute the below command to build the X64 version of the Python 3.6.8 int= erpreter using GCC tool chain:: + =20 + bash$ cd AppPkg/Applications/Python/Python-3.6.8/ + bash$ python srcprep.py + bash$ cd ~/src/edk2 + bash$ build -a X64 -b RELEASE -p AppPkg/AppPkg.dsc -m AppPkg/Appli= cations/Python/Python-3.6.8/Python368.inf + or + bash$ build -a X64 -b RELEASE -p AppPkg/AppPkg.dsc + + +2.5 Create Python UEFI package with all dependencies +----------------------------------------------------- + +To create an usable Python UEFI package with all the dependencies from the= build environment, +you can use the bash shell script create_python368_pkg.sh available under = /AppPkg/Applications/Python/Python-3.6.8 +folder. + +Use the following commands to create Python UEFI package:: + + bash$ cd ~/src/edk2/AppPkg/Applications/Python/Python-3.6.8/ + bash$ chmod 777 create_python368_pkg.sh + ./create_python368_pkg.sh GCC5 RELEASE X64 myPyUEFI + +where GCC5 refers to the tool chain, RELEASE refers to the build type, X64= refers to the architecture +myPyUEFI refers to the name of the folder where the Python UEFI package ne= eds to be created. + +When you run the create_python368_pkg.sh without any parameters it lists t= he help +information as shown below: + +Shell Script to create Python EFI Package. + +Usage: ./create_python368_pkg.sh + +Where + * ToolChain : name of the tool chain such as GCC5 + * Target : build type such as RELEASE, DEBUG + * Architecture : Architecture such as X64 + * OutFolder : Output directory for creating the package diff --git a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Include/py= config.h b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Include/pyco= nfig.h index d4685da..9d08982 100644 --- a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Include/pyconfig.h +++ b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Include/pyconfig.h @@ -870,7 +870,7 @@ #undef HAVE_THREAD_H =20 /* Define to 1 if you have the 'timegm' function. */ -#undef HAVE_TIMEGM +#define HAVE_TIMEGM 1 =20 /* Define to 1 if you have the 'times' function. */ #undef HAVE_TIMES diff --git a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/co= nfig.c b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/config= .c index 0e7f65e..7217a80 100644 --- a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/config.c +++ b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/config.c @@ -83,7 +83,10 @@ extern PyObject* PyInit__stat(void); extern PyObject* PyInit__opcode(void); extern PyObject* PyInit_faulthandler(void); // _ctypes +#if defined(UEFI_MSVC_32) || defined(UEFI_MSVC_64) extern PyObject* PyInit__ctypes(void); +#endif + extern PyObject* init_sqlite3(void); =20 // EfiPy @@ -155,7 +158,9 @@ struct _inittab _PyImport_Inittab[] =3D { {"_string", PyInit__string}, {"_stat", PyInit__stat}, {"_opcode", PyInit__opcode}, - { "_ctypes", PyInit__ctypes }, +#if defined(UEFI_MSVC_32) || defined(UEFI_MSVC_64) + { "_ctypes", PyInit__ctypes }, +#endif /* Sentinel */ {0, 0} }; diff --git a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/ge= tpath.c b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/getpa= th.c index ad10784..7ee4d5e 100644 --- a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/getpath.c +++ b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Modules/getpath.c @@ -112,7 +112,7 @@ #endif =20 =20 -#define SIFY_I( x ) L#x +#define SIFY_I( x ) L"" #x #define SIFY( y ) SIFY_I( y ) =20 #ifndef PREFIX diff --git a/AppPkg/Applications/Python/Python-3.6.8/Python368.inf b/AppPkg= /Applications/Python/Python-3.6.8/Python368.inf index 4ab0cd3..207b907 100644 --- a/AppPkg/Applications/Python/Python-3.6.8/Python368.inf +++ b/AppPkg/Applications/Python/Python-3.6.8/Python368.inf @@ -251,23 +251,24 @@ Modules/zlib Modules/zlib/zutil.c # =20 #Modules/ctypes - PyMod-$(PYTHON_VERSION)/Modules/_ctypes/_ctypes.c # - Modules/_ctypes/stgdict.c # - Modules/_ctypes/libffi_msvc/prep_cif.c # - PyMod-$(PYTHON_VERSION)/Modules/_ctypes/malloc_closure.c # - PyMod-$(PYTHON_VERSION)/Modules/_ctypes/libffi_msvc/ffi.c # - Modules/_ctypes/cfield.c # - PyMod-$(PYTHON_VERSION)/Modules/_ctypes/callproc.c # - Modules/_ctypes/callbacks.c # + PyMod-$(PYTHON_VERSION)/Modules/_ctypes/_ctypes.c | MSFT # + Modules/_ctypes/stgdict.c | MSFT # + Modules/_ctypes/libffi_msvc/prep_cif.c | MSFT# + PyMod-$(PYTHON_VERSION)/Modules/_ctypes/malloc_closure.c | MSFT # + PyMod-$(PYTHON_VERSION)/Modules/_ctypes/libffi_msvc/ffi.c | MSFT # + Modules/_ctypes/cfield.c | MSFT # + PyMod-$(PYTHON_VERSION)/Modules/_ctypes/callproc.c | MSFT # + Modules/_ctypes/callbacks.c | MSFT # =20 [Sources.IA32] - Modules/_ctypes/libffi_msvc/win32.c # + Modules/_ctypes/libffi_msvc/win32.c | MSFT # =20 [Sources.X64] - Modules/_ctypes/libffi_msvc/win64.asm # + Modules/_ctypes/libffi_msvc/win64.asm | MSFT # =20 [BuildOptions] MSFT:*_*_*_CC_FLAGS =3D /GL- /Oi- /wd4018 /wd4054 /wd4055 /wd4101 /wd413= 1 /wd4152 /wd4204 /wd4210 /wd4244 /wd4267 /wd4305 /wd4310 /wd4389 /wd4701 /= wd4702 /wd4706 /wd4456 /wd4312 /wd4457 /wd4459 /wd4474 /wd4476 /I$(WORKSPAC= E)\AppPkg\Applications\Python\Python-3.6.8\Include /DHAVE_MEMMOVE /DUSE_PYE= XPAT_CAPI /DXML_STATIC -D UEFI /WX- /DXML_POOR_ENTROPY /DUEFI_C_SOURCE + GCC:*_*_*_CC_FLAGS =3D -Wno-unused-function -Wno-format -Wno-error -fno-= strict-aliasing -I$(WORKSPACE)/AppPkg/Applications/Python/Python-3.6.8/Incl= ude -DHAVE_MEMMOVE -DUSE_PYEXPAT_CAPI -DXML_STATIC -DXML_POOR_ENTROPY =20 [BuildOptions.IA32] MSFT:*_*_*_CC_FLAGS =3D /DUEFI_MSVC_32 diff --git a/AppPkg/Applications/Python/Python-3.6.8/create_python368_pkg.s= h b/AppPkg/Applications/Python/Python-3.6.8/create_python368_pkg.sh new file mode 100644 index 0000000..f529fa4 --- /dev/null +++ b/AppPkg/Applications/Python/Python-3.6.8/create_python368_pkg.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +TOOL_CHAIN_TAG=3D$1 +TARGET=3D$2 +ARCH=3D$3 +OUT_FOLDER=3D$4 + +function usage { + echo + echo Shell Script to create Python EFI Package. + echo + echo=20 + echo "Usage: $0 " + echo "Where " + echo " ToolChain : name of the tool chain such as GCC5" + echo " Target : build type such as RELEASE, DEBUG" + echo " Architecture : Architecture such as X64" + echo " OutFolder : Output directory for creating the package" + echo +} + +function error { + echo Failed to Create Python EFI Package + echo Python368.efi application is not available at "Build/AppPkg/$TARG= ET"_"$TOOL_CHAIN_TAG/$ARCH/" + echo Follow the instructions in Py368ReadMe.txt to build Python interp= reter + echo Then use this script to create a Python EFI package +} + + +# Validate the ToolChain input=20 +if [ -z $TOOL_CHAIN_TAG ]=20 +then + echo Invalid command line arguments passed, please see the below usage= instructions + usage + exit +fi + +# Validate the Target input=20 +if [ -z $TARGET ] +then + echo Invalid command line arguments passed, please see the below usage= instructions + usage + exit +fi + +# Validate the Architecture input +if [ -z $ARCH ] +then=20 + echo Invalid command line arguments passed, please see the below usage= instructions + usage + exit +fi + +# Validate the OutFolder input=20 +if [ -z $OUT_FOLDER ] +then + echo Invalid command line arguments passed, please see the below usage= instructions + usage + exit +fi + +cd ../../../../ +PYTHON_BIN=3D"Build/AppPkg/$TARGET"_"$TOOL_CHAIN_TAG/$ARCH/Python368.efi" +if [ ! -f $PYTHON_BIN ] +then + error + exit +fi + + +# create /EFI/Tools folder in the Output folder if it doesn't exists +if [ ! -d $OUT_FOLDER/EFI/Tools ] +then + mkdir -p $OUT_FOLDER/EFI/Tools +fi + +cp -f $PYTHON_BIN $OUT_FOLDER/EFI/Tools/ + +if [ ! -d $OUT_FOLDER/EFI/StdLib/lib/python36.8 ] +then=20 + mkdir -p $OUT_FOLDER/EFI/StdLib/lib/python36.8 +fi + +if [ ! -d $OUT_FOLDER/EFI/StdLib/etc ] +then + mkdir -p $OUT_FOLDER/EFI/StdLib/etc +fi + +cp -rf AppPkg/Applications/Python/Python-3.6.8/Lib/* $OUT_FOLDER/EFI/StdL= ib/lib/python36.8/ +cp -rf StdLib/Efi/StdLib/etc/* $OUT_FOLDER/EFI/StdLib/etc/=20 + +if [ ${OUT_FOLDER:0:1} =3D=3D "/" ] +then=20 + echo Python EFI package available at $OUT_FOLDER +else + echo Python EFI package available at `pwd`/$OUT_FOLDER +fi + + + --=20 2.33.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#89889): https://edk2.groups.io/g/devel/message/89889 Mute This Topic: https://groups.io/mt/91193074/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-