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