p7zip: upgraded package to upstream

Upgraded app-arch/p7zip to version 16.02-r8.

BUG=None
TEST=CQ passes

Change-Id: Iefda44b33766e95f6090af4e62e5ec45ba129d62
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/overlays/portage-stable/+/2925215
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Sergey Frolov <sfrolov@google.com>
diff --git a/app-arch/p7zip/Manifest b/app-arch/p7zip/Manifest
index df39623..29b37f2 100644
--- a/app-arch/p7zip/Manifest
+++ b/app-arch/p7zip/Manifest
@@ -1 +1 @@
-DIST p7zip_16.02_src_all.tar.bz2 4239909 SHA256 5eb20ac0e2944f6cb9c2d51dd6c4518941c185347d4089ea89087ffdd6e2341f SHA512 d2c4d53817f96bb4c7683f42045198d4cd509cfc9c3e2cb85c8d9dc4ab6dfa7496449edeac4e300ecf986a9cbbc90bd8f8feef8156895d94617c04e507add55f WHIRLPOOL b22f4dce96505094ffdee0963fa7e5fd75e92f2c920f2e69e18eff60a2ad9d4757c3512c8d4e7c4848a36212f54637a963ff41fc5c00bb7381f43220662108b9
+DIST p7zip_16.02_src_all.tar.bz2 4239909 BLAKE2B 075356fba5284cbb124e30c36364a910ae5a7ac6bee8a8fb682c5a7ce2f1870ef83d3160c84f8dabad1d616c13d642cba1f19fb9384160d21590cf678dd8f1a6 SHA512 d2c4d53817f96bb4c7683f42045198d4cd509cfc9c3e2cb85c8d9dc4ab6dfa7496449edeac4e300ecf986a9cbbc90bd8f8feef8156895d94617c04e507add55f
diff --git a/app-arch/p7zip/files/CVE-2018-10115.patch b/app-arch/p7zip/files/CVE-2018-10115.patch
new file mode 100644
index 0000000..7d9c4bf
--- /dev/null
+++ b/app-arch/p7zip/files/CVE-2018-10115.patch
@@ -0,0 +1,311 @@
+From: Robert Luberda <robert@debian.org>
+Date: Tue, 29 May 2018 23:59:09 +0200
+Subject: Fix CVE-2018-10115
+
+Apply "patch" taken from https://landave.io/files/patch_7zip_CVE-2018-10115.txt
+
+
+Bugs-Debian: https://bugs.debian.org/897674
+---
+ CPP/7zip/Compress/Rar1Decoder.cpp | 16 +++++++++++-----
+ CPP/7zip/Compress/Rar1Decoder.h   |  3 ++-
+ CPP/7zip/Compress/Rar2Decoder.cpp | 17 +++++++++++++----
+ CPP/7zip/Compress/Rar2Decoder.h   |  3 ++-
+ CPP/7zip/Compress/Rar3Decoder.cpp | 19 +++++++++++++++----
+ CPP/7zip/Compress/Rar3Decoder.h   |  3 ++-
+ CPP/7zip/Compress/Rar5Decoder.cpp |  8 ++++++++
+ CPP/7zip/Compress/Rar5Decoder.h   |  1 +
+ 8 files changed, 54 insertions(+), 16 deletions(-)
+
+diff --git a/CPP/7zip/Compress/Rar1Decoder.cpp b/CPP/7zip/Compress/Rar1Decoder.cpp
+index 68030c7..8c890c8 100644
+--- a/CPP/7zip/Compress/Rar1Decoder.cpp
++++ b/CPP/7zip/Compress/Rar1Decoder.cpp
+@@ -29,7 +29,7 @@ public:
+ };
+ */
+ 
+-CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { }
++CDecoder::CDecoder(): _isSolid(false), _solidAllowed(false), _errorMode(false) { }
+ 
+ void CDecoder::InitStructures()
+ {
+@@ -345,7 +345,7 @@ void CDecoder::GetFlagsBuf()
+ 
+ void CDecoder::InitData()
+ {
+-  if (!m_IsSolid)
++  if (!_isSolid)
+   {
+     AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0;
+     AvrPlc = 0x3500;
+@@ -391,6 +391,11 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+   if (inSize == NULL || outSize == NULL)
+     return E_INVALIDARG;
+ 
++  if (_isSolid && !_solidAllowed)
++    return S_FALSE;
++
++  _solidAllowed = false;
++
+   if (!m_OutWindowStream.Create(kHistorySize))
+     return E_OUTOFMEMORY;
+   if (!m_InBitStream.Create(1 << 20))
+@@ -398,13 +403,13 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+ 
+   m_UnpackSize = (Int64)*outSize;
+   m_OutWindowStream.SetStream(outStream);
+-  m_OutWindowStream.Init(m_IsSolid);
++  m_OutWindowStream.Init(_isSolid);
+   m_InBitStream.SetStream(inStream);
+   m_InBitStream.Init();
+ 
+   // CCoderReleaser coderReleaser(this);
+   InitData();
+-  if (!m_IsSolid)
++  if (!_isSolid)
+   {
+     _errorMode = false;
+     InitStructures();
+@@ -475,6 +480,7 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+   }
+   if (m_UnpackSize < 0)
+     return S_FALSE;
++  _solidAllowed = true;
+   return m_OutWindowStream.Flush();
+ }
+ 
+@@ -491,7 +497,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
+ {
+   if (size < 1)
+     return E_INVALIDARG;
+-  m_IsSolid = ((data[0] & 1) != 0);
++  _isSolid = ((data[0] & 1) != 0);
+   return S_OK;
+ }
+ 
+diff --git a/CPP/7zip/Compress/Rar1Decoder.h b/CPP/7zip/Compress/Rar1Decoder.h
+index 01b606b..8abb3a3 100644
+--- a/CPP/7zip/Compress/Rar1Decoder.h
++++ b/CPP/7zip/Compress/Rar1Decoder.h
+@@ -38,7 +38,8 @@ public:
+   UInt32 LastLength;
+ 
+   Int64 m_UnpackSize;
+-  bool m_IsSolid;
++  bool _isSolid;
++  bool _solidAllowed;
+   bool _errorMode;
+ 
+   UInt32 ReadBits(int numBits);
+diff --git a/CPP/7zip/Compress/Rar2Decoder.cpp b/CPP/7zip/Compress/Rar2Decoder.cpp
+index 0580c8d..be8d842 100644
+--- a/CPP/7zip/Compress/Rar2Decoder.cpp
++++ b/CPP/7zip/Compress/Rar2Decoder.cpp
+@@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20;
+ static const UInt32 kWindowReservSize = (1 << 22) + 256;
+ 
+ CDecoder::CDecoder():
+-  m_IsSolid(false),
++  _isSolid(false),
++  _solidAllowed(false),
+   m_TablesOK(false)
+ {
+ }
+@@ -320,6 +321,10 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+   if (inSize == NULL || outSize == NULL)
+     return E_INVALIDARG;
+ 
++  if (_isSolid && !_solidAllowed)
++    return S_FALSE;
++  _solidAllowed = false;
++
+   if (!m_OutWindowStream.Create(kHistorySize))
+     return E_OUTOFMEMORY;
+   if (!m_InBitStream.Create(1 << 20))
+@@ -330,12 +335,12 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+   UInt64 pos = 0, unPackSize = *outSize;
+   
+   m_OutWindowStream.SetStream(outStream);
+-  m_OutWindowStream.Init(m_IsSolid);
++  m_OutWindowStream.Init(_isSolid);
+   m_InBitStream.SetStream(inStream);
+   m_InBitStream.Init();
+ 
+   // CCoderReleaser coderReleaser(this);
+-  if (!m_IsSolid)
++  if (!_isSolid)
+   {
+     InitStructures();
+     if (unPackSize == 0)
+@@ -343,6 +348,7 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+       if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
+         if (!ReadTables())
+           return S_FALSE;
++      _solidAllowed = true;
+       return S_OK;
+     }
+     if (!ReadTables())
+@@ -386,6 +392,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
+ 
+   if (!ReadLastTables())
+     return S_FALSE;
++
++  _solidAllowed = true;
++
+   return m_OutWindowStream.Flush();
+ }
+ 
+@@ -402,7 +411,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
+ {
+   if (size < 1)
+     return E_INVALIDARG;
+-  m_IsSolid = ((data[0] & 1) != 0);
++  _isSolid = ((data[0] & 1) != 0);
+   return S_OK;
+ }
+ 
+diff --git a/CPP/7zip/Compress/Rar2Decoder.h b/CPP/7zip/Compress/Rar2Decoder.h
+index 0e9005f..370bce2 100644
+--- a/CPP/7zip/Compress/Rar2Decoder.h
++++ b/CPP/7zip/Compress/Rar2Decoder.h
+@@ -138,7 +138,8 @@ class CDecoder :
+   Byte m_LastLevels[kMaxTableSize];
+ 
+   UInt64 m_PackSize;
+-  bool m_IsSolid;
++  bool _isSolid;
++  bool _solidAllowed;
+   bool m_TablesOK;
+ 
+   void InitStructures();
+diff --git a/CPP/7zip/Compress/Rar3Decoder.cpp b/CPP/7zip/Compress/Rar3Decoder.cpp
+index 6cb8a6a..7b85833 100644
+--- a/CPP/7zip/Compress/Rar3Decoder.cpp
++++ b/CPP/7zip/Compress/Rar3Decoder.cpp
+@@ -92,7 +92,8 @@ CDecoder::CDecoder():
+   _writtenFileSize(0),
+   _vmData(0),
+   _vmCode(0),
+-  m_IsSolid(false),
++  _isSolid(false),
++  _solidAllowed(false),
+   _errorMode(false)
+ {
+   Ppmd7_Construct(&_ppmd);
+@@ -821,7 +822,7 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
+ {
+   _writtenFileSize = 0;
+   _unsupportedFilter = false;
+-  if (!m_IsSolid)
++  if (!_isSolid)
+   {
+     _lzSize = 0;
+     _winPos = 0;
+@@ -840,12 +841,15 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
+   if (_errorMode)
+     return S_FALSE;
+ 
+-  if (!m_IsSolid || !TablesRead)
++  if (!_isSolid || !TablesRead)
+   {
+     bool keepDecompressing;
+     RINOK(ReadTables(keepDecompressing));
+     if (!keepDecompressing)
++    {
++      _solidAllowed = true;
+       return S_OK;
++    }
+   }
+ 
+   for (;;)
+@@ -870,6 +874,9 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
+     if (!keepDecompressing)
+       break;
+   }
++
++  _solidAllowed = true;
++
+   RINOK(WriteBuf());
+   UInt64 packSize = m_InBitStream.BitDecoder.GetProcessedSize();
+   RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
+@@ -890,6 +897,10 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream
+     if (!inSize)
+       return E_INVALIDARG;
+ 
++    if (_isSolid && !_solidAllowed)
++      return S_FALSE;
++    _solidAllowed = false;
++
+     if (!_vmData)
+     {
+       _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax);
+@@ -928,7 +939,7 @@ STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
+ {
+   if (size < 1)
+     return E_INVALIDARG;
+-  m_IsSolid = ((data[0] & 1) != 0);
++  _isSolid = ((data[0] & 1) != 0);
+   return S_OK;
+ }
+ 
+diff --git a/CPP/7zip/Compress/Rar3Decoder.h b/CPP/7zip/Compress/Rar3Decoder.h
+index 2f72d7d..32c8943 100644
+--- a/CPP/7zip/Compress/Rar3Decoder.h
++++ b/CPP/7zip/Compress/Rar3Decoder.h
+@@ -191,7 +191,8 @@ class CDecoder:
+   CRecordVector<CTempFilter *>  _tempFilters;
+   UInt32 _lastFilter;
+ 
+-  bool m_IsSolid;
++  bool _isSolid;
++  bool _solidAllowed;
+   bool _errorMode;
+ 
+   bool _lzMode;
+diff --git a/CPP/7zip/Compress/Rar5Decoder.cpp b/CPP/7zip/Compress/Rar5Decoder.cpp
+index dc8830f..a826d5a 100644
+--- a/CPP/7zip/Compress/Rar5Decoder.cpp
++++ b/CPP/7zip/Compress/Rar5Decoder.cpp
+@@ -72,6 +72,7 @@ CDecoder::CDecoder():
+     _writtenFileSize(0),
+     _dictSizeLog(0),
+     _isSolid(false),
++    _solidAllowed(false),
+     _wasInit(false),
+     _inputBuf(NULL)
+ {
+@@ -801,7 +802,10 @@ HRESULT CDecoder::CodeReal()
+   */
+ 
+   if (res == S_OK)
++  {
++    _solidAllowed = true;
+     res = res2;
++  }
+      
+   if (res == S_OK && _unpackSize_Defined && _writtenFileSize != _unpackSize)
+     return S_FALSE;
+@@ -821,6 +825,10 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream
+ {
+   try
+   {
++    if (_isSolid && !_solidAllowed)
++      return S_FALSE;
++    _solidAllowed = false;
++
+     if (_dictSizeLog >= sizeof(size_t) * 8)
+       return E_NOTIMPL;
+ 
+diff --git a/CPP/7zip/Compress/Rar5Decoder.h b/CPP/7zip/Compress/Rar5Decoder.h
+index b0a4dd1..3db5018 100644
+--- a/CPP/7zip/Compress/Rar5Decoder.h
++++ b/CPP/7zip/Compress/Rar5Decoder.h
+@@ -271,6 +271,7 @@ class CDecoder:
+   Byte _dictSizeLog;
+   bool _tableWasFilled;
+   bool _isSolid;
++  bool _solidAllowed;
+   bool _wasInit;
+ 
+   UInt32 _reps[kNumReps];
diff --git a/app-arch/p7zip/files/WimHandler.cpp.patch b/app-arch/p7zip/files/WimHandler.cpp.patch
new file mode 100644
index 0000000..db7d73a
--- /dev/null
+++ b/app-arch/p7zip/files/WimHandler.cpp.patch
@@ -0,0 +1,11 @@
+--- ./CPP/7zip/Archive/Wim/WimHandler.cpp	2016-06-11 11:08:06.000000000 +0300
++++ ./CPP/7zip/Archive/Wim/WimHandler.cpp.new	2020-01-22 09:36:59.671803569 +0300
+@@ -298,7 +298,7 @@ STDMETHODIMP CHandler::GetArchivePropert
+ 
+       AString res;
+ 
+-      bool numMethods = 0;
++      int numMethods = 0;
+       for (unsigned i = 0; i < ARRAY_SIZE(k_Methods); i++)
+       {
+         if (methodMask & ((UInt32)1 << i))
diff --git a/app-arch/p7zip/p7zip-16.02-r2.ebuild b/app-arch/p7zip/p7zip-16.02-r8.ebuild
similarity index 68%
rename from app-arch/p7zip/p7zip-16.02-r2.ebuild
rename to app-arch/p7zip/p7zip-16.02-r8.ebuild
index 5c68bd7..cd648a8 100644
--- a/app-arch/p7zip/p7zip-16.02-r2.ebuild
+++ b/app-arch/p7zip/p7zip-16.02-r8.ebuild
@@ -1,37 +1,36 @@
-# Copyright 1999-2018 Gentoo Foundation
+# Copyright 1999-2021 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
-WX_GTK_VER="3.0"
-
-inherit toolchain-funcs wxwidgets
+WX_GTK_VER="3.0-gtk3"
+inherit multilib toolchain-funcs wrapper wxwidgets xdg
 
 DESCRIPTION="Port of 7-Zip archiver for Unix"
 HOMEPAGE="http://p7zip.sourceforge.net/"
 SRC_URI="mirror://sourceforge/${PN}/${PN}_${PV}_src_all.tar.bz2"
+S="${WORKDIR}/${PN}_${PV}"
 
 LICENSE="LGPL-2.1 rar? ( unRAR )"
 SLOT="0"
 KEYWORDS="*"
 IUSE="abi_x86_x32 doc kde +pch rar static wxwidgets"
-
 REQUIRED_USE="kde? ( wxwidgets )"
 
 RDEPEND="wxwidgets? ( x11-libs/wxGTK:${WX_GTK_VER}[X] )"
-DEPEND="${RDEPEND}
+DEPEND="${RDEPEND}"
+BDEPEND="
 	abi_x86_x32? ( >=dev-lang/yasm-1.2.0-r1 )
 	amd64? ( dev-lang/yasm )
 	x86? ( dev-lang/nasm )"
 
-S=${WORKDIR}/${PN}_${PV}
-
-DOCS=( ChangeLog README TODO )
-
 PATCHES=(
 	"${FILESDIR}"/${P}-darwin.patch
+	"${FILESDIR}"/CVE-2016-9296.patch
 	"${FILESDIR}"/CVE-2017-17969.patch
 	"${FILESDIR}"/CVE-2018-5996.patch
+	"${FILESDIR}"/CVE-2018-10115.patch
+	"${FILESDIR}"/WimHandler.cpp.patch
 )
 
 src_prepare() {
@@ -42,11 +41,12 @@
 	fi
 
 	sed \
-		-e 's:-m32 ::g' \
-		-e 's:-m64 ::g' \
-		-e 's:-pipe::g' \
-		-e '/ALLFLAGS/s:-s ::' \
-		-e "/OPTFLAGS=/s:=.*:=${CXXFLAGS}:" \
+		-e 's|-m32 ||g' \
+		-e 's|-m64 ||g' \
+		-e 's|-pipe||g' \
+		-e "/[ALL|OPT]FLAGS/s|-s||;/OPTIMIZE/s|-s||" \
+		-e "/CFLAGS=/s|=|+=|" \
+		-e "/CXXFLAGS=/s|=|+=|" \
 		-i makefile* || die
 
 	# remove non-free RAR codec
@@ -57,7 +57,7 @@
 			-e '/Rar/d' \
 			-e '/RAR/d' \
 			-i makefile* CPP/7zip/Bundles/Format7zFree/makefile || die
-		rm -rf CPP/7zip/Compress/Rar || die
+		rm -r CPP/7zip/Compress/Rar || die
 	fi
 
 	if use abi_x86_x32; then
@@ -71,7 +71,7 @@
 		# Mac OS X needs this special makefile, because it has a non-GNU
 		# linker, it doesn't matter so much for bitwidth, for it doesn't
 		# do anything with it
-		cp -f makefile.macosx_llvm_64bits makefile.machine
+		cp -f makefile.macosx_llvm_64bits makefile.machine || die
 		# bundles have extension .bundle but don't die because USE=-rar
 		# removes the Rar directory
 		sed -i -e '/strcpy(name/s/\.so/.bundle/' \
@@ -81,7 +81,7 @@
 			$(use rar && echo CPP/7zip/Compress/Rar/makefile.list) || die
 	elif use x86-fbsd; then
 		# FreeBSD needs this special makefile, because it hasn't -ldl
-		sed -e 's/-lc_r/-pthread/' makefile.freebsd > makefile.machine
+		sed -e 's/-lc_r/-pthread/' makefile.freebsd > makefile.machine || die
 	fi
 
 	if use static; then
@@ -89,9 +89,9 @@
 	fi
 
 	if use kde || use wxwidgets; then
-		need-wxwidgets unicode
+		setup-wxwidgets unicode
 		einfo "Preparing dependency list"
-		emake depend
+		emake CC=$(tc-getCC) CXX=$(tc-getCXX) depend
 	fi
 }
 
@@ -99,7 +99,6 @@
 	emake CC=$(tc-getCC) CXX=$(tc-getCXX) all3
 	if use kde || use wxwidgets; then
 		emake CC=$(tc-getCC) CXX=$(tc-getCXX) -- 7zG
-#		emake -- 7zFM
 	fi
 }
 
@@ -108,25 +107,20 @@
 }
 
 src_install() {
-	# this wrappers can not be symlinks, p7zip should be called with full path
-	make_wrapper 7zr "/usr/$(get_libdir)/${PN}/7zr"
-	make_wrapper 7za "/usr/$(get_libdir)/${PN}/7za"
-	make_wrapper 7z "/usr/$(get_libdir)/${PN}/7z"
+	# these wrappers cannot be symlinks, p7zip should be called with full path
+	make_wrapper 7zr /usr/$(get_libdir)/p7zip/7zr
+	make_wrapper 7za /usr/$(get_libdir)/p7zip/7za
+	make_wrapper 7z /usr/$(get_libdir)/p7zip/7z
 
 	if use kde || use wxwidgets; then
-		make_wrapper 7zG "/usr/$(get_libdir)/${PN}/7zG"
-#		make_wrapper 7zFM "/usr/$(get_libdir)/${PN}/7zFM"
-
-#		make_desktop_entry 7zFM "${PN} FM" ${PN} "GTK;Utility;Archiving;Compression"
+		make_wrapper 7zG /usr/$(get_libdir)/p7zip/7zG
 
 		dobin GUI/p7zipForFilemanager
-		exeinto /usr/$(get_libdir)/${PN}
-#		doexe bin/7z{G,FM}
+		exeinto /usr/$(get_libdir)/p7zip
 		doexe bin/7zG
 
-		insinto /usr/$(get_libdir)/${PN}
+		insinto /usr/$(get_libdir)/p7zip
 		doins -r GUI/Lang
-		doins -r DOC/MANUAL
 
 		insinto /usr/share/icons/hicolor/16x16/apps/
 		newins GUI/p7zip_16_ok.png p7zip.png
@@ -135,29 +129,26 @@
 			rm GUI/kde4/p7zip_compress.desktop || die
 			insinto /usr/share/kservices5/ServiceMenus
 			doins GUI/kde4/*.desktop
-			dodir /usr/share/kde4/services/ServiceMenus # drop these lines after konqueror:4/krusader:4 are gone
-			for item in "${ED}"usr/share/kservices5/ServiceMenus/*.desktop; do
-				item="$(basename ${item})"
-				dosym "/usr/share/kservices5/ServiceMenus/${item}" "/usr/share/kde4/services/ServiceMenus/${item}"
-			done
 		fi
 	fi
 
 	dobin contrib/gzip-like_CLI_wrapper_for_7z/p7zip
 	doman contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1
 
-	exeinto /usr/$(get_libdir)/${PN}
+	exeinto /usr/$(get_libdir)/p7zip
 	doexe bin/7z bin/7za bin/7zr bin/7zCon.sfx
 	doexe bin/*$(get_modname)
 	if use rar; then
-		exeinto /usr/$(get_libdir)/${PN}/Codecs/
+		exeinto /usr/$(get_libdir)/p7zip/Codecs
 		doexe bin/Codecs/*$(get_modname)
 	fi
 
 	doman man1/7z.1 man1/7za.1 man1/7zr.1
 
+	dodoc ChangeLog README TODO
 	if use doc; then
 		dodoc DOC/*.txt
-		dohtml -r DOC/MANUAL/*
+		docinto html
+		dodoc -r DOC/MANUAL/.
 	fi
 }
diff --git a/eclass/wrapper.eclass b/eclass/wrapper.eclass
new file mode 100644
index 0000000..399c7cc
--- /dev/null
+++ b/eclass/wrapper.eclass
@@ -0,0 +1,59 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: wrapper.eclass
+# @MAINTAINER:
+# base-system@gentoo.org
+# @BLURB: create a shell wrapper script
+
+if [[ -z ${_WRAPPER_ECLASS} ]]; then
+_WRAPPER_ECLASS=1
+
+# @FUNCTION: make_wrapper
+# @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
+# @DESCRIPTION:
+# Create a shell wrapper script named wrapper in installpath
+# (defaults to the bindir) to execute target (default of wrapper)
+# by first optionally setting LD_LIBRARY_PATH to the colon-delimited
+# libpaths followed by optionally changing directory to chdir.
+make_wrapper() {
+	local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
+	local tmpwrapper="${T}/tmp.wrapper.${wrapper##*/}"
+	has "${EAPI:-0}" 0 1 2 && local EPREFIX=""
+
+	(
+	echo '#!/bin/sh'
+	if [[ -n ${libdir} ]] ; then
+		local var
+		if [[ ${CHOST} == *-darwin* ]] ; then
+			var=DYLD_LIBRARY_PATH
+		else
+			var=LD_LIBRARY_PATH
+		fi
+		cat <<-EOF
+			if [ "\${${var}+set}" = "set" ] ; then
+				export ${var}="\${${var}}:${EPREFIX}${libdir}"
+			else
+				export ${var}="${EPREFIX}${libdir}"
+			fi
+		EOF
+	fi
+	[[ -n ${chdir} ]] && printf 'cd "%s" &&\n' "${EPREFIX}${chdir}"
+	# We don't want to quote ${bin} so that people can pass complex
+	# things as ${bin} ... "./someprog --args"
+	printf 'exec %s "$@"\n' "${bin/#\//${EPREFIX}/}"
+	) > "${tmpwrapper}"
+	chmod go+rx "${tmpwrapper}"
+
+	if [[ -n ${path} ]] ; then
+		(
+		exeopts -m 0755
+		exeinto "${path}"
+		newexe "${tmpwrapper}" "${wrapper}"
+		) || die
+	else
+		newbin "${tmpwrapper}" "${wrapper}" || die
+	fi
+}
+
+fi
diff --git a/eclass/wxwidgets.eclass b/eclass/wxwidgets.eclass
index 0cbf495..4357e73 100644
--- a/eclass/wxwidgets.eclass
+++ b/eclass/wxwidgets.eclass
@@ -1,140 +1,97 @@
-# Copyright 1999-2016 Gentoo Foundation
+# Copyright 1999-2021 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 # @ECLASS: wxwidgets.eclass
 # @MAINTAINER:
 # wxwidgets@gentoo.org
-# @SUPPORTED_EAPIS: 0 1 2 3 4 5 6
+# @SUPPORTED_EAPIS: 7
 # @BLURB: Manages build configuration for wxGTK-using packages.
 # @DESCRIPTION:
-#  This eclass sets up the proper environment for ebuilds using the wxGTK
-#  libraries.  Ebuilds using wxPython do not need to inherit this eclass.
+# This eclass sets up the proper environment for ebuilds using the wxGTK
+# libraries.  Ebuilds using wxPython do not need to inherit this eclass.
 #
-#  More specifically, this eclass controls the configuration chosen by the
-#  /usr/bin/wx-config wrapper.
+# More specifically, this eclass controls the configuration chosen by the
+# ${ESYSROOT}/usr/bin/wx-config wrapper.
 #
-#  Using the eclass is simple:
+# Using the eclass is simple:
 #
-#    - set WX_GTK_VER equal to a SLOT of wxGTK
-#    - call setup-wxwidgets()
+#   - set WX_GTK_VER equal to a SLOT of wxGTK
+#   - call setup-wxwidgets()
 #
-#  The configuration chosen is based on the version required and the flags
-#  wxGTK was built with.
+# The configuration chosen is based on the version required and the flags
+# wxGTK was built with.
 
-if [[ -z ${_WXWIDGETS_ECLASS} ]]; then
-
-case ${EAPI} in
-	0|1|2|3|4|5)
-		inherit eutils flag-o-matic multilib
-
-		# This was used to set up a sane default for ebuilds so they could
-		# avoid calling need-wxwidgets if they didn't need a particular build.
-		# This was a bad idea for a couple different reasons, and because
-		# get_libdir() is now illegal in global scope in EAPI 6 we can't do it
-		# anymore.  All ebuilds must now use setup-wxwidgets and this code is
-		# only here for backwards compatability.
-		if [[ -z ${WX_CONFIG} ]]; then
-			if [[ -n ${WX_GTK_VER} ]]; then
-				for _wxtoolkit in mac gtk2 base; do
-					# newer versions don't have a seperate debug config
-					for _wxdebug in xxx release- debug-; do
-						_wxconf="${_wxtoolkit}-unicode-${_wxdebug/xxx/}${WX_GTK_VER}"
-
-						[[ -f ${EPREFIX}/usr/$(get_libdir)/wx/config/${_wxconf} ]] \
-							|| continue
-
-						WX_CONFIG="${EPREFIX}/usr/$(get_libdir)/wx/config/${_wxconf}"
-						WX_ECLASS_CONFIG="${WX_CONFIG}"
-						break
-					done
-					[[ -n ${WX_CONFIG} ]] && break
-				done
-				[[ -n ${WX_CONFIG} ]] && export WX_CONFIG WX_ECLASS_CONFIG
-			fi
-		fi
-		unset _wxtoolkit
-		unset _wxdebug
-		unset _wxconf
-		;;
-	6)
-		inherit flag-o-matic multilib
-		;;
-	*)
-		die "EAPI=${EAPI:-0} is not supported"
-		;;
+case ${EAPI:-0} in
+	[0-6]) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;;
+	7)     ;;
+	*)     die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
 esac
 
-# @FUNCTION:    setup-wxwidgets
+if [[ -z ${_WXWIDGETS_ECLASS} ]]; then
+_WXWIDGETS_ECLASS=1
+
+# @ECLASS-VARIABLE: WX_GTK_VER
+# @PRE_INHERIT
+# @REQUIRED
 # @DESCRIPTION:
-#
-#  Call this in your ebuild to set up the environment for wxGTK.  Besides
-#  controlling the wx-config wrapper this exports WX_CONFIG containing
-#  the path to the config in case it needs to be passed to a build system.
-#
-#  In wxGTK-2.9 and later it also controls the level of debugging output
-#  from the libraries.  In these versions debugging features are enabled
-#  by default and need to be disabled at the package level.  Because this
-#  causes many warning dialogs to pop up during runtime we add -DNDEBUG to
-#  CPPFLAGS to disable debugging features (unless your ebuild has a debug
-#  USE flag and it's enabled).  If you don't like this behavior you can set
-#  WX_DISABLE_NDEBUG to override it.
-#
-#  See: http://docs.wxwidgets.org/trunk/overview_debugging.html
+# The SLOT of the x11-libs/wxGTK you're targeting.  Needs to be defined before
+# inheriting the eclass.  Can be either "3.0" or "3.0-gtk3".
+case ${WX_GTK_VER} in
+	3.0|3.0-gtk3) ;;
+	"")           die "WX_GTK_VER not declared" ;;
+	*)            die "Invalid WX_GTK_VER: must be set to a valid wxGTK SLOT ('3.0' or '3.0-gtk3')" ;;
+esac
+readonly WX_GTK_VER
 
+inherit flag-o-matic
+
+# @FUNCTION: setup-wxwidgets
+# @DESCRIPTION:
+# Call this in your ebuild to set up the environment for wxGTK in src_configure.
+# Besides controlling the wx-config wrapper, this exports WX_CONFIG containing
+# the path to the config in case it needs to be passed to the build system.
+#
+# This function also controls the level of debugging output from the libraries.
+# Debugging features are enabled by default and need to be disabled at the
+# package level.  Because this causes many warning dialogs to pop up during
+# runtime, we add -DNDEBUG to CPPFLAGS to disable debugging features (unless
+# your ebuild has a debug USE flag and it's enabled).  If you don't like this
+# behavior, you can set WX_DISABLE_NDEBUG to override it.
+#
+# See: https://docs.wxwidgets.org/trunk/overview_debugging.html
 setup-wxwidgets() {
-	local wxtoolkit wxdebug wxconf
+	local w wxtoolkit wxconf
 
-	[[ -z ${WX_GTK_VER} ]] \
-		&& die "WX_GTK_VER must be set before calling $FUNCNAME."
-
-	case "${WX_GTK_VER}" in
-		3.0-gtk3)
-			wxtoolkit=gtk3
-			if [[ -z ${WX_DISABLE_NDEBUG} ]]; then
-				( in_iuse debug && use debug ) || append-cppflags -DNDEBUG
-			fi
-			;;
-		2.9|3.0)
-			wxtoolkit=gtk2
-			if [[ -z ${WX_DISABLE_NDEBUG} ]]; then
-				( in_iuse debug && use debug ) || append-cppflags -DNDEBUG
-			fi
-			;;
-		2.8)
-			wxtoolkit=gtk2
-			wxdebug="release-"
-			has_version x11-libs/wxGTK:${WX_GTK_VER}[debug] && wxdebug="debug-"
-			;;
-		*)
-			die "Invalid WX_GTK_VER: must be set to a valid wxGTK SLOT"
-			;;
+	case ${WX_GTK_VER} in
+		3.0-gtk3) wxtoolkit=gtk3 ;;
+		3.0)      wxtoolkit=gtk2
+		          eqawarn "This package relies on the deprecated GTK 2 slot, which will go away soon (https://bugs.gentoo.org/618642)"
+		          ;;
 	esac
 
+	if [[ -z ${WX_DISABLE_NDEBUG} ]]; then
+		{ in_iuse debug && use debug; } || append-cppflags -DNDEBUG
+	fi
+
 	# toolkit overrides
-	if has_version "x11-libs/wxGTK:${WX_GTK_VER}[aqua]"; then
+	if has_version -d "x11-libs/wxGTK:${WX_GTK_VER}[aqua]"; then
 		wxtoolkit="mac"
-	elif ! has_version "x11-libs/wxGTK:${WX_GTK_VER}[X]"; then
+	elif ! has_version -d "x11-libs/wxGTK:${WX_GTK_VER}[X]"; then
 		wxtoolkit="base"
 	fi
 
-	wxconf="${wxtoolkit}-unicode-${wxdebug}${WX_GTK_VER}"
+	wxconf="${wxtoolkit}-unicode-${WX_GTK_VER}"
+	for w in "${CHOST:-${CBUILD}}-${wxconf}" "${wxconf}"; do
+		[[ -f ${ESYSROOT}/usr/$(get_libdir)/wx/config/${w} ]] && wxconf=${w} && break
+	done || die "Failed to find configuration ${wxconf}"
 
-	[[ ! -f ${EPREFIX}/usr/$(get_libdir)/wx/config/${wxconf} ]] \
-		&& die "Failed to find configuration ${wxconf}"
-
-	export WX_CONFIG="${EPREFIX}/usr/$(get_libdir)/wx/config/${wxconf}"
+	export WX_CONFIG="${ESYSROOT}/usr/$(get_libdir)/wx/config/${wxconf}"
 	export WX_ECLASS_CONFIG="${WX_CONFIG}"
 
-	echo
+	einfo
 	einfo "Requested wxWidgets:        ${WX_GTK_VER}"
 	einfo "Using wxWidgets:            ${wxconf}"
-	echo
+	einfo
 }
 
-# deprecated
-need-wxwidgets() {
-	setup-wxwidgets
-}
-
-_WXWIDGETS_ECLASS=1
 fi