From 9c67428ff277f7965c9647edfb1342f9834eb1aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Mon, 11 Oct 2021 10:00:31 +0200
Subject: [PATCH] Fix(pynn-brainscales): Enforce correct log4cxx version
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The production env seems to use a newer spack repo state → log4cxx is
newer than currently supported for BrainScaleS → quickfix: pin to old
version.


(cherry picked from commit fa396948e0534739fa466e2d195c4a067bb9daa1)
---
 .../log4cxx/log4cxx-0.10.0-llvm-libcxx.patch  |  26 ++++
 .../log4cxx-0.10.0-missing_includes.patch     |  38 ++++++
 ...0.10.0-narrowing-fixes-from-upstream.patch | 117 ++++++++++++++++++
 packages/log4cxx/package.py                   |  31 +++++
 spack.yaml                                    |   2 +-
 5 files changed, 213 insertions(+), 1 deletion(-)
 create mode 100644 packages/log4cxx/log4cxx-0.10.0-llvm-libcxx.patch
 create mode 100644 packages/log4cxx/log4cxx-0.10.0-missing_includes.patch
 create mode 100644 packages/log4cxx/log4cxx-0.10.0-narrowing-fixes-from-upstream.patch
 create mode 100644 packages/log4cxx/package.py

diff --git a/packages/log4cxx/log4cxx-0.10.0-llvm-libcxx.patch b/packages/log4cxx/log4cxx-0.10.0-llvm-libcxx.patch
new file mode 100644
index 00000000..addd1983
--- /dev/null
+++ b/packages/log4cxx/log4cxx-0.10.0-llvm-libcxx.patch
@@ -0,0 +1,26 @@
+--- apache-log4cxx-0.10.0/src/main/cpp/stringhelper.cpp2018-04-19 09:48:50.762552	436 +0200
++++ apache-log4cxx-0.10.0-old/src/main/cpp/stringhelper.cpp2	008-04-01 00:34:09.000000000 +0200
+@@ -28,7 +28,6 @@
+ #endif
+ #include <log4cxx/private/log4cxx_private.h>
+ #include <cctype>
+-#include <cstdlib>
+ #include <apr.h>
+ 
+ 
+diff -rpu apache-log4cxx-0.10.0/src/main/include/log4cxx/helpers/simpledateformat.h apache-log4cxx-0.10.0-old/src/main/include/log4cxx/helpers/simpledateformat.h
+--- apache-log4cxx-0.10.0/src/main/include/log4cxx/helpers/simpledateformat.h2018-04-19 09:4	8:19.010260662 +0200
++++ apache-log4cxx-0.10.0-old/src/main/include/log4cxx/helpers/simpledateformat.h2008-04-01 00:34:26.000000000 +0200
+@@ -26,1	0 +26,11 @@
+ 
+ 
+ #include <log4cxx/helpers/dateformat.h>
+-#include <locale>
+ #include <vector>
+ #include <time.h>
+ 
++namespace std { class locale; }
++
+ namespace log4cxx
+ {
+         namespace helpers
diff --git a/packages/log4cxx/log4cxx-0.10.0-missing_includes.patch b/packages/log4cxx/log4cxx-0.10.0-missing_includes.patch
new file mode 100644
index 00000000..6834648d
--- /dev/null
+++ b/packages/log4cxx/log4cxx-0.10.0-missing_includes.patch
@@ -0,0 +1,38 @@
+diff -Naur apache-log4cxx-0.10.0.orig/src/examples/cpp/console.cpp apache-log4cxx-0.10.0/src/examples/cpp/console.cpp
+--- apache-log4cxx-0.10.0.orig/src/examples/cpp/console.cpp	2008-04-01 00:34:52.000000000 +0200
++++ apache-log4cxx-0.10.0/src/examples/cpp/console.cpp	2008-05-06 05:40:52.000000000 +0200
+@@ -15,7 +15,10 @@
+  * limitations under the License.
+  */
+ 
+-#include <stdlib.h>
++#include <cstdio>
++#include <cstdlib>
++#include <cstring>
++#include <stdint.h>
+ #include <log4cxx/logger.h>
+ #include <log4cxx/consoleappender.h>
+ #include <log4cxx/simplelayout.h>
+diff -Naur apache-log4cxx-0.10.0.orig/src/main/cpp/inputstreamreader.cpp apache-log4cxx-0.10.0/src/main/cpp/inputstreamreader.cpp
+--- apache-log4cxx-0.10.0.orig/src/main/cpp/inputstreamreader.cpp	2008-04-01 00:34:09.000000000 +0200
++++ apache-log4cxx-0.10.0/src/main/cpp/inputstreamreader.cpp	2008-05-06 05:32:31.000000000 +0200
+@@ -21,6 +21,8 @@
+ #include <log4cxx/helpers/pool.h>
+ #include <log4cxx/helpers/bytebuffer.h>
+ 
++#include <cstring>
++
+ using namespace log4cxx;
+ using namespace log4cxx::helpers;
+ 
+diff -Naur apache-log4cxx-0.10.0.orig/src/main/cpp/socketoutputstream.cpp apache-log4cxx-0.10.0/src/main/cpp/socketoutputstream.cpp
+--- apache-log4cxx-0.10.0.orig/src/main/cpp/socketoutputstream.cpp	2008-04-01 00:34:09.000000000 +0200
++++ apache-log4cxx-0.10.0/src/main/cpp/socketoutputstream.cpp	2008-05-06 05:35:55.000000000 +0200
+@@ -20,6 +20,8 @@
+ #include <log4cxx/helpers/socket.h>
+ #include <log4cxx/helpers/bytebuffer.h>
+ 
++#include <cstring>
++
+ using namespace log4cxx;
+ using namespace log4cxx::helpers;
\ No newline at end of file
diff --git a/packages/log4cxx/log4cxx-0.10.0-narrowing-fixes-from-upstream.patch b/packages/log4cxx/log4cxx-0.10.0-narrowing-fixes-from-upstream.patch
new file mode 100644
index 00000000..e583e766
--- /dev/null
+++ b/packages/log4cxx/log4cxx-0.10.0-narrowing-fixes-from-upstream.patch
@@ -0,0 +1,117 @@
+diff --git a/src/main/cpp/locationinfo.cpp b/src/main/cpp/locationinfo.cpp
+index e76ea29..bd22a1d 100644
+--- a/src/main/cpp/locationinfo.cpp
++++ b/src/main/cpp/locationinfo.cpp
+@@ -149,18 +149,21 @@ void LocationInfo::write(ObjectOutputStream& os, Pool& p) const {
+          os.writeNull(p);
+     } else {
+         char prolog[] = {
+-         0x72, 0x00, 0x21, 0x6F, 0x72, 0x67, 0x2E, 
+-         0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2E, 0x6C, 
+-         0x6F, 0x67, 0x34, 0x6A, 0x2E, 0x73, 0x70, 0x69, 
+-         0x2E, 0x4C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F, 
+-         0x6E, 0x49, 0x6E, 0x66, 0x6F, 0xED, 0x99, 0xBB, 
+-         0xE1, 0x4A, 0x91, 0xA5, 0x7C, 0x02, 0x00, 0x01, 
+-         0x4C, 0x00, 0x08, 0x66, 0x75, 0x6C, 0x6C, 0x49, 
+-         0x6E, 0x66, 0x6F, 
+-            0x74, 0x00, 0x12, 0x4C, 0x6A, 
+-                0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 
+-                0x2F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B,
+-         0x78, 0x70 };
++         0x72,
++         0x00,
++         0x21, 0x6F, 0x72, 0x67, 0x2E, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2E,
++         0x6C, 0x6F, 0x67, 0x34, 0x6A, 0x2E, 0x73, 0x70, 0x69, 0x2E, 0x4C, 0x6F,
++         0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, static_cast<char>(0xED),
++         static_cast<char>(0x99), static_cast<char>(0xBB), static_cast<char>(0xE1),
++         0x4A, static_cast<char>(0x91), static_cast<char>(0xA5), 0x7C, 0x02,
++         0x00,
++         0x01, 0x4C,
++         0x00,
++         0x08, 0x66, 0x75, 0x6C, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x74,
++         0x00,
++         0x12, 0x4C, 0x6A, 0x61, 0x76, 0x61, 0x2F, 0x6C, 0x61, 0x6E, 0x67, 0x2F,
++         0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3B, 0x78, 0x70
++        };
+       os.writeProlog("org.apache.log4j.spi.LocationInfo", 2, prolog, sizeof(prolog), p);
+         char* line = p.itoa(lineNumber);
+         //
+diff --git a/src/main/cpp/loggingevent.cpp b/src/main/cpp/loggingevent.cpp
+index 1c0d4be..edbf40b 100644
+--- a/src/main/cpp/loggingevent.cpp
++++ b/src/main/cpp/loggingevent.cpp
+@@ -242,7 +242,7 @@ void LoggingEvent::writeProlog(ObjectOutputStream& os, Pool& p)  {
+         0x68, 0x65, 0x2E, 0x6C, 0x6F, 0x67, 0x34, 0x6A, 
+         0x2E, 0x73, 0x70, 0x69, 0x2E, 0x4C, 0x6F, 0x67, 
+         0x67, 0x69, 0x6E, 0x67, 0x45, 0x76, 0x65, 0x6E, 
+-        0x74, 0xF3, 0xF2, 0xB9, 0x23, 0x74, 0x0B, 0xB5, 
++        0x74, static_cast<char>(0xF3), static_cast<char>(0xF2), static_cast<char>(0xB9), 0x23, 0x74, 0x0B, static_cast<char>(0xB5), 
+         0x3F, 0x03, 0x00, 0x0A, 0x5A, 0x00, 0x15, 0x6D, 
+         0x64, 0x63, 0x43, 0x6F, 0x70, 0x79, 0x4C, 0x6F, 
+         0x6F, 0x6B, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 
+diff --git a/src/main/cpp/objectoutputstream.cpp b/src/main/cpp/objectoutputstream.cpp
+index 7cd696b..5442420 100644
+--- a/src/main/cpp/objectoutputstream.cpp
++++ b/src/main/cpp/objectoutputstream.cpp
+@@ -36,7 +36,7 @@ ObjectOutputStream::ObjectOutputStream(OutputStreamPtr outputStream, Pool& p)
+        objectHandle(0x7E0000),
+        classDescriptions(new ClassDescriptionMap())
+ {
+-   char start[] = { 0xAC, 0xED, 0x00, 0x05 };
++   char start[] = { static_cast<char>(0xAC), static_cast<char>(0xED), 0x00, 0x05 };
+    ByteBuffer buf(start, sizeof(start));
+    os->write(buf, p);
+ }
+@@ -81,15 +81,15 @@ void ObjectOutputStream::writeObject(const MDC::Map& val, Pool& p) {
+     //
+     //  TC_OBJECT and the classDesc for java.util.Hashtable
+     //
+-    char prolog[] = {
+-        0x72, 0x00, 0x13, 0x6A, 0x61, 0x76, 0x61, 
+-        0x2E, 0x75, 0x74, 0x69, 0x6C, 0x2E, 0x48, 0x61, 
+-        0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x13, 
+-        0xBB, 0x0F, 0x25, 0x21, 0x4A, 0xE4, 0xB8, 0x03, 
+-        0x00, 0x02, 0x46, 0x00, 0x0A, 0x6C, 0x6F, 0x61, 
+-        0x64, 0x46, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x49, 
+-        0x00, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 
+-        0x6F, 0x6C, 0x64, 0x78, 0x70  };
++	char prolog[] = {
++		0x72, 0x00, 0x13, 0x6A, 0x61, 0x76, 0x61,
++		0x2E, 0x75, 0x74, 0x69, 0x6C, 0x2E, 0x48, 0x61,
++		0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x13,
++		static_cast<char>(0xBB), 0x0F, 0x25, 0x21, 0x4A, static_cast<char>(0xE4), static_cast<char>(0xB8), 0x03,
++		0x00, 0x02, 0x46, 0x00, 0x0A, 0x6C, 0x6F, 0x61,
++		0x64, 0x46, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x49,
++		0x00, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68,
++		0x6F, 0x6C, 0x64, 0x78, 0x70  };
+     writeProlog("java.util.Hashtable", 1, prolog, sizeof(prolog), p);
+     //
+     //   loadFactor = 0.75, threshold = 5, blockdata start, buckets.size = 7
+diff --git a/src/test/cpp/xml/domtestcase.cpp b/src/test/cpp/xml/domtestcase.cpp
+index a500628..29d67dd 100644
+--- a/src/test/cpp/xml/domtestcase.cpp
++++ b/src/test/cpp/xml/domtestcase.cpp
+@@ -190,9 +190,9 @@ public:
+                 DOMConfigurator::configure(LOG4CXX_TEST_STR("input/xml/DOMTestCase3.xml"));
+                 LOG4CXX_INFO(logger, "File name is expected to end with a superscript 3");
+ #if LOG4CXX_LOGCHAR_IS_UTF8
+-                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, 0xC2, 0xB3, 0 };
++                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, static_cast<logchar>(0xC2), static_cast<logchar>(0xB3), 0 };
+ #else
+-                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, 0xB3, 0 };
++                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, static_cast<logchar>(0xB3), 0 };
+ #endif
+                 File file;
+                 file.setPath(fname);
+@@ -209,9 +209,9 @@ public:
+                 DOMConfigurator::configure(LOG4CXX_TEST_STR("input/xml/DOMTestCase4.xml"));
+                 LOG4CXX_INFO(logger, "File name is expected to end with an ideographic 4");
+ #if LOG4CXX_LOGCHAR_IS_UTF8
+-                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, 0xE3, 0x86, 0x95, 0 };
++                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, static_cast<logchar>(0xE3), static_cast<logchar>(0x86), static_cast<logchar>(0x95), 0 };
+ #else
+-                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, 0x3195, 0 };
++                const logchar fname[] = { 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2F, 0x64, 0x6F, 0x6D, static_cast<logchar>(0x3195), 0 };
+ #endif
+                 File file;
+                 file.setPath(fname);
\ No newline at end of file
diff --git a/packages/log4cxx/package.py b/packages/log4cxx/package.py
new file mode 100644
index 00000000..96ef6c61
--- /dev/null
+++ b/packages/log4cxx/package.py
@@ -0,0 +1,31 @@
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class Log4cxx(AutotoolsPackage):
+    """A C++ port of Log4j"""
+
+    homepage = "https://logging.apache.org/log4cxx/latest_stable/"
+    url      = "http://mirror.netcologne.de/apache.org/logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz"
+
+    version('0.10.0', sha256='0de0396220a9566a580166e66b39674cb40efd2176f52ad2c65486c99c920c8c')
+
+    depends_on('apr-util')
+    depends_on('apr')
+    depends_on('zip')
+
+    build_directory = 'spack-build'
+
+    # patches from https://aur.archlinux.org/packages/log4cxx/
+    patch('log4cxx-0.10.0-missing_includes.patch')
+    patch('log4cxx-0.10.0-narrowing-fixes-from-upstream.patch')
+    patch('log4cxx-0.10.0-llvm-libcxx.patch', when='@0.10.0%clang')
+
+    def configure_args(self):
+        args = ['--disable-static']
+
+        return args
diff --git a/spack.yaml b/spack.yaml
index 96c97350..451e6a54 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -26,4 +26,4 @@ spack:
     - py-formencode %gcc@10.3.0
     - tvb-framework ^binutils+ld+gold %gcc@10.3.0
     - meta-brainscales %gcc@10.3.0
-    - pynn-brainscales@1.0-rc2 ^googletest@1.11.0:+gmock %gcc@10.3.0
+    - pynn-brainscales@1.0-rc2 ^log4cxx@0.10.0 ^googletest@1.11.0:+gmock %gcc@10.3.0
-- 
GitLab