File znc-swig-4.4.patch of Package znc
Index: znc-1.10.1/modules/modpython/codegen.pl
===================================================================
--- znc-1.10.1.orig/modules/modpython/codegen.pl
+++ znc-1.10.1/modules/modpython/codegen.pl
@@ -49,6 +49,8 @@ print $out <<'EOF';
* Don't change it manually. *
***************************************************************************/
+#include "swig_version.h"
+
namespace {
inline swig_type_info* ZNC_SWIG_pchar_descriptor(void) {
static int init = 0;
@@ -60,11 +62,10 @@ namespace {
return info;
}
-// SWIG 4.2.0 replaced SWIG_Python_str_AsChar with SWIG_PyUnicode_AsUTF8AndSize.
-// SWIG doesn't provide any good way to detect SWIG version (other than parsing
-// `swig -version`), but it also introduced SWIG_NULLPTR in 4.2.0.
-// So let's abuse that define to do different code for new SWIG.
-#ifdef SWIG_NULLPTR
+// SWIG_VERSION is defined as 0x040200 for 4.2.0.
+// We use this to detect modern SWIG versions and avoid the "abuse" of
+// SWIG_NULLPTR, which was removed in SWIG 4.4.
+#if defined(SWIG_VERSION) && SWIG_VERSION >= 0x040200
// This is copied/adapted from SWIG 4.2.0 from pystrings.swg
inline int ZNC_SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) {
#if PY_VERSION_HEX>=0x03000000
Index: znc-1.10.1/modules/modpython/CMakeLists.txt
===================================================================
--- znc-1.10.1.orig/modules/modpython/CMakeLists.txt
+++ znc-1.10.1/modules/modpython/CMakeLists.txt
@@ -29,6 +29,17 @@ if(APPLE)
endif()
if(SWIG_FOUND)
+ set(SWIG_VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/swig_version.h")
+
+ add_custom_command(
+ OUTPUT "${SWIG_VERSION_HEADER}"
+ COMMAND ${CMAKE_COMMAND}
+ -DSWIG_EXECUTABLE=${SWIG_EXECUTABLE}
+ -DSWIG_VERSION_HEADER=${SWIG_VERSION_HEADER}
+ -P "${CMAKE_CURRENT_SOURCE_DIR}/generate_swig_version.cmake"
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate_swig_version.cmake"
+ )
+
add_custom_command(
OUTPUT "pyfunctions.cpp"
COMMAND "${PERL_EXECUTABLE}"
@@ -36,7 +47,7 @@ if(SWIG_FOUND)
"${CMAKE_CURRENT_SOURCE_DIR}/functions.in"
"pyfunctions.cpp"
VERBATIM
- DEPENDS codegen.pl functions.in)
+ DEPENDS codegen.pl functions.in "${SWIG_VERSION_HEADER}")
add_custom_command(
OUTPUT "swigpyrun.h"
Index: znc-1.10.1/modules/modpython/generate_swig_version.cmake
===================================================================
--- /dev/null
+++ znc-1.10.1/modules/modpython/generate_swig_version.cmake
@@ -0,0 +1,53 @@
+# generate_swig_version.cmake
+execute_process(
+ COMMAND ${SWIG_EXECUTABLE} -version
+ OUTPUT_VARIABLE SWIG_OUTPUT
+ ERROR_VARIABLE SWIG_ERROR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_STRIP_TRAILING_WHITESPACE
+)
+
+set(FULL_OUTPUT "${SWIG_OUTPUT}\n${SWIG_ERROR}")
+
+string(REGEX MATCH "SWIG Version ([0-9]+)\\.([0-9]+)\\.([0-9]+)" MATCH_FOUND "${FULL_OUTPUT}")
+
+if(MATCH_FOUND)
+ # Extract capture groups
+ set(SWIG_VERSION_MAJOR ${CMAKE_MATCH_1})
+ set(SWIG_VERSION_MINOR ${CMAKE_MATCH_2})
+ set(SWIG_VERSION_PATCH ${CMAKE_MATCH_3})
+
+ message(STATUS "Found SWIG Version: ${SWIG_VERSION_MAJOR}.${SWIG_VERSION_MINOR}.${SWIG_VERSION_PATCH}")
+
+ # Format: 0x<MAJ><MIN><PATCH> (assuming 8 bits per component)
+ # Calculation: (Major << 16) | (Minor << 8) | Patch
+
+ math(EXPR VERSION_NUM
+ "(${SWIG_VERSION_MAJOR} << 16) + (${SWIG_VERSION_MINOR} << 8) + ${SWIG_VERSION_PATCH}"
+ OUTPUT_FORMAT HEXADECIMAL
+ )
+
+ set(HEADER_FILE "swig_version.h")
+
+ file(WRITE ${SWIG_VERSION_HEADER}
+"// Auto-generated by CMake
+#ifndef SWIG_VERSION_META_H
+#define SWIG_VERSION_META_H
+
+#define SWIG_VERSION_MAJOR ${SWIG_VERSION_MAJOR}
+#define SWIG_VERSION_MINOR ${SWIG_VERSION_MINOR}
+#define SWIG_VERSION_PATCH ${SWIG_VERSION_PATCH}
+
+// Hex format 0xMAJMINPAT (e.g. 4.1.0 -> 0x40100)
+#define SWIG_VERSION ${VERSION_NUM}
+
+#endif // SWIG_VERSION_META_H
+"
+ )
+
+ message(STATUS "Generated ${HEADER_FILE} with version ${VERSION_NUM}")
+
+else()
+ message(WARNING "Could not parse SWIG version from output:\n${FULL_OUTPUT}")
+endif()
+