commit:     810cbfa3961719466326528a442a8d114e1f6fd6
Author:     David Seifert <soap <AT> gentoo <DOT> org>
AuthorDate: Sat Oct  8 14:58:38 2022 +0000
Commit:     David Seifert <soap <AT> gentoo <DOT> org>
CommitDate: Sat Oct  8 14:58:38 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=810cbfa3

games-util/grfcodec: update EAPI 7 -> 8

Bug: https://bugs.gentoo.org/715910
Bug: https://bugs.gentoo.org/859310
Signed-off-by: David Seifert <soap <AT> gentoo.org>

 .../0001-Remove-brittle-apWrapper-code.patch       | 144 +++++++++++++++++++++
 .../6.0.6_p20210310/0002-Fix-ODR-violations.patch  |  63 +++++++++
 .../grfcodec/grfcodec-6.0.6_p20210310-r1.ebuild    |  40 ++++++
 3 files changed, 247 insertions(+)

diff --git 
a/games-util/grfcodec/files/6.0.6_p20210310/0001-Remove-brittle-apWrapper-code.patch
 
b/games-util/grfcodec/files/6.0.6_p20210310/0001-Remove-brittle-apWrapper-code.patch
new file mode 100644
index 000000000000..e702f00160ce
--- /dev/null
+++ 
b/games-util/grfcodec/files/6.0.6_p20210310/0001-Remove-brittle-apWrapper-code.patch
@@ -0,0 +1,144 @@
+From 9e928c98c8ad0767607bc421b14ac289cdc6e536 Mon Sep 17 00:00:00 2001
+From: David Seifert <[email protected]>
+Date: Sat, 8 Oct 2022 16:29:43 +0200
+Subject: [PATCH 1/2] Remove brittle `apWrapper` code
+
+* This causes issues on musl, and generally doesn't make the
+  code any simpler, while also creating lots of opportunities
+  for undefined behavior.
+
+Bug: https://bugs.gentoo.org/715910
+---
+ src/messages.cpp     | 14 ++++++++++----
+ src/sanity.cpp       |  4 +++-
+ src/sanity_defines.h | 23 -----------------------
+ src/strings.cpp      |  9 +++++----
+ 4 files changed, 18 insertions(+), 32 deletions(-)
+
+diff --git a/src/messages.cpp b/src/messages.cpp
+index 385f217..3794f66 100644
+--- a/src/messages.cpp
++++ b/src/messages.cpp
+@@ -60,8 +60,11 @@ void ManualConsoleMessages(){
+ }
+ 
+ string mysprintf(const char*str,...){
+-      WrapAp(str);
+-      return myvsprintf(str,ap);
++      va_list ap;
++      va_start(ap, str);
++      string result = myvsprintf(str,ap);
++      va_end(ap);
++      return result;
+ }
+ 
+ #if defined DEBUG || defined _DEBUG
+@@ -69,8 +72,11 @@ static RenumMessageId curMessage;
+ #endif
+ 
+ string IssueMessage(int minSan,RenumMessageId id,...){
+-      WrapAp(id);
+-      return vIssueMessage(minSan,id,ap);
++      va_list ap;
++      va_start(ap, id);
++      string result = vIssueMessage(minSan,id,ap);
++      va_end(ap);
++      return result;
+ }
+ 
+ string vIssueMessage(int minSan,RenumMessageId id,va_list& arg_ptr){
+diff --git a/src/sanity.cpp b/src/sanity.cpp
+index 844d840..0793a63 100644
+--- a/src/sanity.cpp
++++ b/src/sanity.cpp
+@@ -151,13 +151,15 @@ void Before8(int action){
+ }
+ 
+ bool CheckLength(int alen,int elen,RenumMessageId message,...){
+-      WrapAp(message);
++      va_list ap;
++      va_start(ap, message);
+       if(alen<elen){
+               vIssueMessage(FATAL,message,ap);
+               return true;
+       }
+       if(alen>elen)
+               vIssueMessage(WARNING2,message,ap);
++      va_end(ap);
+       return false;
+ }
+ 
+diff --git a/src/sanity_defines.h b/src/sanity_defines.h
+index d094f21..47f9c5f 100644
+--- a/src/sanity_defines.h
++++ b/src/sanity_defines.h
+@@ -22,7 +22,6 @@
+ #ifndef _RENUM_SANITY_DEFS_H_INCLUDED_
+ #define _RENUM_SANITY_DEFS_H_INCLUDED_
+ 
+-#include <cstdarg>
+ #include "message_mgr.h"
+ 
+ bool CheckLength(int,int,RenumMessageId,...);
+@@ -70,26 +69,4 @@ typedef auto_array<uint> Guintp;
+       type&operator[](uint x){return _p[x];}\
+       type operator[](uint x)const{return _p[x];}\
+ 
+-class apWrapper{
+-private:
+-      va_list _ap;
+-public:
+-      ~apWrapper(){va_end(_ap);}
+-      operator va_list&(){return _ap;}
+-      operator const va_list&()const{return _ap;}
+-#ifdef __va_copy
+-      va_list&operator=(va_list&ap){
+-          __va_copy(_ap,ap);
+-              return _ap;
+-      }
+-#else
+-      va_list const&operator=(va_list const&ap){
+-          return _ap=ap;
+-      }
+-#endif
+-};
+-#define WrapAp(v)\
+-      apWrapper ap;\
+-      va_start((va_list&)ap,v);
+-
+ #endif//_RENUM_SANITY_DEFS_H_INCLUDED_
+diff --git a/src/strings.cpp b/src/strings.cpp
+index 2512734..e184825 100644
+--- a/src/strings.cpp
++++ b/src/strings.cpp
+@@ -23,6 +23,7 @@
+ #include<string>
+ #include<cerrno>
+ #include<cstdlib>
++#include<cstdarg>
+ 
+ using namespace std;
+ 
+@@ -396,15 +397,15 @@ static const uchar stackSize[]={0,1,2,2,4,2,8};
+ 
+ string MakeStack(int items,...){
+       string ret;
+-      WrapAp(items);
++      va_list ap;
++      va_start(ap, items);
+       uint item;
+       for(int i=0;i<items;i++){
+-              item=va_arg(ap.operator va_list&(),uint);
+-              //             ^^^^^^^^^^^^^^^^^^^
+-              // gcc complains without that call.
++              item=va_arg(ap, uint);
+               VERIFY(item&&item<STACK_INVALID,item);
+               ret+=string(stackSize[item],char(item|i<<4));
+       }
++      va_end(ap);
+       return ret;
+ }
+ 
+-- 
+2.38.0
+

diff --git 
a/games-util/grfcodec/files/6.0.6_p20210310/0002-Fix-ODR-violations.patch 
b/games-util/grfcodec/files/6.0.6_p20210310/0002-Fix-ODR-violations.patch
new file mode 100644
index 000000000000..d76a904efd9a
--- /dev/null
+++ b/games-util/grfcodec/files/6.0.6_p20210310/0002-Fix-ODR-violations.patch
@@ -0,0 +1,63 @@
+From f2e16cca87e8a324ce7ccc9cc2d82235b1e490c1 Mon Sep 17 00:00:00 2001
+From: David Seifert <[email protected]>
+Date: Sat, 8 Oct 2022 16:29:44 +0200
+Subject: [PATCH 2/2] Fix ODR violations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* When compiling with `-flto`, ODR violations pop up:
+
+  src/escapes.h:98:1: error: type ‘struct esc’ violates the C++ One Definition 
Rule [-Werror=odr]
+     98 | START_ESCAPES()
+        | ^
+  src/escapes.h:98:1: note: a different type is defined in another translation 
unit
+     98 | START_ESCAPES()
+        | ^
+  src/escapes.h:98:1: note: the first difference of corresponding definitions 
is field ‘additional’
+     98 | START_ESCAPES()
+        | ^
+  src/escapes.h:98:1: note: a type with different number of fields is defined 
in another translation unit
+     98 | START_ESCAPES()
+        | ^
+
+  by wrapping the `struct esc` definitions in unnamed namespaces, we can avoid 
running afoul of ODR.
+
+Bug: https://bugs.gentoo.org/859310
+---
+ src/escapes.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/escapes.h b/src/escapes.h
+index 91da82f..d3d2bea 100644
+--- a/src/escapes.h
++++ b/src/escapes.h
+@@ -8,6 +8,7 @@
+ #ifndef GRFCODEC
+ 
+ #define START_ESCAPES()\
++      namespace {\
+       const struct esc{\
+               char byte;\
+               char*str;\
+@@ -30,6 +31,7 @@
+ #else /* GRFCODEC */
+ 
+ #define START_ESCAPES()\
++      namespace {\
+       const struct esc{\
+               char byte;\
+               char*str;\
+@@ -59,7 +61,8 @@
+ #endif /* GRFCODEC */
+ 
+ #define END_ESCAPES() };\
+-      static const unsigned int num_esc=sizeof(escapes)/sizeof(escapes[0]);
++      static const unsigned int num_esc=sizeof(escapes)/sizeof(escapes[0]);\
++      }
+ 
+ #ifdef GRFCODEC
+ 
+-- 
+2.38.0
+

diff --git a/games-util/grfcodec/grfcodec-6.0.6_p20210310-r1.ebuild 
b/games-util/grfcodec/grfcodec-6.0.6_p20210310-r1.ebuild
new file mode 100644
index 000000000000..90d01d7a6794
--- /dev/null
+++ b/games-util/grfcodec/grfcodec-6.0.6_p20210310-r1.ebuild
@@ -0,0 +1,40 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit cmake vcs-snapshot
+
+COMMIT=045774dee7cab1a618a3e0d9b39bff78a12b6efa
+
+DESCRIPTION="A suite of programs to modify openttd/Transport Tycoon Deluxe's 
GRF files"
+HOMEPAGE="https://github.com/OpenTTD/grfcodec";
+SRC_URI="https://github.com/OpenTTD/grfcodec/archive/${COMMIT}.tar.gz -> 
${P}.tar.gz"
+
+LICENSE="GPL-2+"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~x86"
+
+RDEPEND="media-libs/libpng:="
+DEPEND="${RDEPEND}
+       dev-libs/boost"
+
+PATCHES=( "${FILESDIR}"/${PV} )
+
+src_configure() {
+       local mycmakeargs=(
+               # Make sure we don't use git by accident.
+               # Build system does not care much if it's
+               # executed successfully and populates
+               # YEARS / VERSION with empty values.
+               -DGIT_EXECUTABLE=/bin/do-not-use-git-executable
+       )
+
+       cmake_src_configure
+}
+
+src_install() {
+       dobin "${BUILD_DIR}"/{grfcodec,grfid,grfstrip,nforenum}
+       doman docs/*.1
+       dodoc changelog.txt docs/*.txt
+}

Reply via email to