diff options
| -rw-r--r-- | php-pecl-vips.spec | 13 | ||||
| -rw-r--r-- | vips-pr44.patch | 311 | 
2 files changed, 321 insertions, 3 deletions
diff --git a/php-pecl-vips.spec b/php-pecl-vips.spec index 40ca561..66e7aa1 100644 --- a/php-pecl-vips.spec +++ b/php-pecl-vips.spec @@ -22,12 +22,16 @@  Summary:        PHP extension for interfacing with libvips  Name:           %{?sub_prefix}php-pecl-%{pecl_name}  Version:        1.0.12 -Release:        5%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} +Release:        6%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}  License:        PHP  Group:          Development/Languages  URL:            https://pecl.php.net/package/%{pecl_name}  Source0:        https://pecl.php.net/get/%{pecl_name}-%{version}%{?prever}.tgz +# https://github.com/libvips/php-vips-ext/issues/43 +# https://github.com/libvips/php-vips-ext/pull/44 +Patch0:         %{pecl_name}-pr44.patch +  BuildRequires:  %{?dtsprefix}gcc  BuildRequires:  make  BuildRequires:  %{?scl_prefix}php-devel >= 7.0 @@ -85,6 +89,8 @@ sed -e 's/role="test"/role="src"/' \      -i package.xml  cd NTS +%patch0 -p1 +  # Sanity check, really often broken  extver=$(sed -n '/define PHP_VIPS_VERSION/{s/.* "//;s/".*$//;p}' php_vips.h)  if test "x${extver}" != "x%{version}%{?prever}"; then @@ -108,8 +114,6 @@ EOF  %build  %{?dtsenable} -export LDFLAGS="%{?__global_ldflags} -Wl,-z,nodelete" -  cd NTS  %{_bindir}/phpize  %configure \ @@ -225,6 +229,9 @@ REPORT_EXIT_STATUS=1 \  %changelog +* Wed Sep  8 2021 Remi Collet <remi@remirepo.net> - 1.0.12-6 +- test build for upstream patch +  * Mon Sep  6 2021 Remi Collet <remi@remirepo.net> - 1.0.12-5  - rebuild with workaround for https://github.com/libvips/php-vips-ext/issues/43 diff --git a/vips-pr44.patch b/vips-pr44.patch new file mode 100644 index 0000000..1282936 --- /dev/null +++ b/vips-pr44.patch @@ -0,0 +1,311 @@ +From f08dc82d066b600cff73720cd040e5d7d50c36eb Mon Sep 17 00:00:00 2001 +From: Kleis Auke Wolthuizen <github@kleisauke.nl> +Date: Mon, 6 Sep 2021 10:57:56 +0200 +Subject: [PATCH] Ensure extension is linked with -Wl,-z,nodelete + +See: https://github.com/libvips/php-vips-ext/issues/43. +--- + .gitattributes             |  1 + + config.m4                  |  9 +++++++ + m4/ax_append_flag.m4       | 50 +++++++++++++++++++++++++++++++++++ + m4/ax_append_link_flags.m4 | 44 +++++++++++++++++++++++++++++++ + m4/ax_check_link_flag.m4   | 53 ++++++++++++++++++++++++++++++++++++++ + m4/ax_require_defined.m4   | 37 ++++++++++++++++++++++++++ + package.xml                |  7 +++++ + vips.c                     | 36 -------------------------- + 8 files changed, 201 insertions(+), 36 deletions(-) + create mode 100644 .gitattributes + create mode 100644 m4/ax_append_flag.m4 + create mode 100644 m4/ax_append_link_flags.m4 + create mode 100644 m4/ax_check_link_flag.m4 + create mode 100644 m4/ax_require_defined.m4 + +diff --git a/config.m4 b/config.m4 +index 729cc25..b72931e 100644 +--- a/config.m4 ++++ b/config.m4 +@@ -1,6 +1,11 @@ + dnl $Id$ + dnl config.m4 for extension vips +  ++m4_include(m4/ax_require_defined.m4) ++m4_include(m4/ax_append_flag.m4) ++m4_include(m4/ax_check_link_flag.m4) ++m4_include(m4/ax_append_link_flags.m4) ++ + PHP_ARG_WITH(vips, for vips support, + [  --with-vips             Include vips support]) +  +@@ -35,6 +40,10 @@ if test x"$PHP_VIPS" != x"no"; then +   ],[$VIPS_LIBS] +   ) +  ++  # Mark DSO non-deletable at runtime. ++  # See: https://github.com/libvips/php-vips-ext/issues/43 ++  AX_APPEND_LINK_FLAGS([-Wl,-z,nodelete]) ++ +   AC_DEFINE(HAVE_VIPS, 1, [Whether you have vips]) +   PHP_NEW_EXTENSION(vips, vips.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 $VIPS_CFLAGS) +   PHP_SUBST(VIPS_SHARED_LIBADD) +diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4 +new file mode 100644 +index 0000000..dd6d8b6 +--- /dev/null ++++ b/m4/ax_append_flag.m4 +@@ -0,0 +1,50 @@ ++# =========================================================================== ++#      https://www.gnu.org/software/autoconf-archive/ax_append_flag.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) ++# ++# DESCRIPTION ++# ++#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a space ++#   added in between. ++# ++#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g. ++#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already contains ++#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to exactly ++#   FLAG. ++# ++#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. ++# ++# LICENSE ++# ++#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> ++#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> ++# ++#   Copying and distribution of this file, with or without modification, are ++#   permitted in any medium without royalty provided the copyright notice ++#   and this notice are preserved.  This file is offered as-is, without any ++#   warranty. ++ ++#serial 8 ++ ++AC_DEFUN([AX_APPEND_FLAG], ++[dnl ++AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF ++AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) ++AS_VAR_SET_IF(FLAGS,[ ++  AS_CASE([" AS_VAR_GET(FLAGS) "], ++    [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], ++    [ ++     AS_VAR_APPEND(FLAGS,[" $1"]) ++     AC_RUN_LOG([: FLAGS="$FLAGS"]) ++    ]) ++  ], ++  [ ++  AS_VAR_SET(FLAGS,[$1]) ++  AC_RUN_LOG([: FLAGS="$FLAGS"]) ++  ]) ++AS_VAR_POPDEF([FLAGS])dnl ++])dnl AX_APPEND_FLAG +diff --git a/m4/ax_append_link_flags.m4 b/m4/ax_append_link_flags.m4 +new file mode 100644 +index 0000000..99b9fa5 +--- /dev/null ++++ b/m4/ax_append_link_flags.m4 +@@ -0,0 +1,44 @@ ++# =========================================================================== ++#   https://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++#   AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) ++# ++# DESCRIPTION ++# ++#   For every FLAG1, FLAG2 it is checked whether the linker works with the ++#   flag.  If it does, the flag is added FLAGS-VARIABLE ++# ++#   If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is ++#   used. During the check the flag is always added to the linker's flags. ++# ++#   If EXTRA-FLAGS is defined, it is added to the linker's default flags ++#   when the check is done.  The check is thus made with the flags: "LDFLAGS ++#   EXTRA-FLAGS FLAG".  This can for example be used to force the linker to ++#   issue an error when a bad flag is given. ++# ++#   INPUT gives an alternative input source to AC_COMPILE_IFELSE. ++# ++#   NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. ++#   Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. ++# ++# LICENSE ++# ++#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> ++# ++#   Copying and distribution of this file, with or without modification, are ++#   permitted in any medium without royalty provided the copyright notice ++#   and this notice are preserved.  This file is offered as-is, without any ++#   warranty. ++ ++#serial 7 ++ ++AC_DEFUN([AX_APPEND_LINK_FLAGS], ++[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) ++AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) ++for flag in $1; do ++  AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3], [$4]) ++done ++])dnl AX_APPEND_LINK_FLAGS +diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4 +new file mode 100644 +index 0000000..03a30ce +--- /dev/null ++++ b/m4/ax_check_link_flag.m4 +@@ -0,0 +1,53 @@ ++# =========================================================================== ++#    https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) ++# ++# DESCRIPTION ++# ++#   Check whether the given FLAG works with the linker or gives an error. ++#   (Warnings, however, are ignored) ++# ++#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on ++#   success/failure. ++# ++#   If EXTRA-FLAGS is defined, it is added to the linker's default flags ++#   when the check is done.  The check is thus made with the flags: "LDFLAGS ++#   EXTRA-FLAGS FLAG".  This can for example be used to force the linker to ++#   issue an error when a bad flag is given. ++# ++#   INPUT gives an alternative input source to AC_LINK_IFELSE. ++# ++#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this ++#   macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. ++# ++# LICENSE ++# ++#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> ++#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> ++# ++#   Copying and distribution of this file, with or without modification, are ++#   permitted in any medium without royalty provided the copyright notice ++#   and this notice are preserved.  This file is offered as-is, without any ++#   warranty. ++ ++#serial 6 ++ ++AC_DEFUN([AX_CHECK_LINK_FLAG], ++[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF ++AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl ++AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ ++  ax_check_save_flags=$LDFLAGS ++  LDFLAGS="$LDFLAGS $4 $1" ++  AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], ++    [AS_VAR_SET(CACHEVAR,[yes])], ++    [AS_VAR_SET(CACHEVAR,[no])]) ++  LDFLAGS=$ax_check_save_flags]) ++AS_VAR_IF(CACHEVAR,yes, ++  [m4_default([$2], :)], ++  [m4_default([$3], :)]) ++AS_VAR_POPDEF([CACHEVAR])dnl ++])dnl AX_CHECK_LINK_FLAGS +diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4 +new file mode 100644 +index 0000000..17c3eab +--- /dev/null ++++ b/m4/ax_require_defined.m4 +@@ -0,0 +1,37 @@ ++# =========================================================================== ++#    https://www.gnu.org/software/autoconf-archive/ax_require_defined.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++#   AX_REQUIRE_DEFINED(MACRO) ++# ++# DESCRIPTION ++# ++#   AX_REQUIRE_DEFINED is a simple helper for making sure other macros have ++#   been defined and thus are available for use.  This avoids random issues ++#   where a macro isn't expanded.  Instead the configure script emits a ++#   non-fatal: ++# ++#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found ++# ++#   It's like AC_REQUIRE except it doesn't expand the required macro. ++# ++#   Here's an example: ++# ++#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) ++# ++# LICENSE ++# ++#   Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org> ++# ++#   Copying and distribution of this file, with or without modification, are ++#   permitted in any medium without royalty provided the copyright notice ++#   and this notice are preserved. This file is offered as-is, without any ++#   warranty. ++ ++#serial 2 ++ ++AC_DEFUN([AX_REQUIRE_DEFINED], [dnl ++  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) ++])dnl AX_REQUIRE_DEFINED +diff --git a/vips.c b/vips.c +index 33b47d4..2e96aad 100644 +--- a/vips.c ++++ b/vips.c +@@ -13,7 +13,6 @@ + #include "php.h" + #include "php_ini.h" + #include "ext/standard/info.h" +-#include "SAPI.h" + #include "php_vips.h" +  + #include <vips/vips.h> +@@ -2007,41 +2006,6 @@ static void php_free_gobject(zend_resource *rsrc) +  */ + PHP_MINIT_FUNCTION(vips) + { +-	if (strcmp(sapi_module.name, "apache2handler") == 0) { +-		/* "apachectl graceful" can cause us terrible problems. What happens: +-		 * +-		 * - the main apache process unloads this extension, vips.so +-		 * - in turn, the C runtime will unload libvips.so, the vips library, +-		 *   since vips.so is the only thing that references it +-		 * - libvips.so in turn uses glib.so, but this is often not unloaded, +-		 *   since other parts of apache can be using it (glib could also +-		 *   possibly be preventing unload itself, I'm not sure) +-		 * - the main apache process then reloads vips.so, which in turn will +-		 *   reload libvips.so as it starts up +-		 * - vips.so tries to init libvips.so +-		 * - libvips.so tries to register its types (such as VipsImage) with +-		 *   glib.so, but finds the types from the previous init still there +-		 * - everything breaks +-		 * +-		 * A simple fix that will always work is just to lock libvips in  +-		 * memory and prevent unload. We intentionally leak refs to the shared +-		 * library.  +-		 * +-		 * We include the binary API version number that this extension needs.  +-		 * We can't just load .so, that's only installed with libvips-dev,  +-		 * which may not be present at runtime. +-		 */ +-#ifdef VIPS_SONAME +-		if (!dlopen(VIPS_SONAME, RTLD_LAZY | RTLD_NODELETE))  +-#else /*!VIPS_SONAME*/ +-		if (!dlopen("libvips.so.42", RTLD_LAZY | RTLD_NODELETE))  +-#endif /*VIPS_SONAME*/ +-		{ +-			sapi_module.sapi_error(E_WARNING, "php-vips-ext: unable to lock " +-				"libvips -- graceful may be unreliable"); +-		} +-	} +- + 	/* If you have INI entries, uncomment these lines + 	REGISTER_INI_ENTRIES(); + 	*/  | 
