package/python-matplotlib: simplify version checks
authorFabrice Fontaine <fontaine.fabrice@gmail.com>
Thu, 27 Aug 2020 17:21:40 +0000 (19:21 +0200)
committerThomas Petazzoni <thomas.petazzoni@bootlin.com>
Thu, 27 Aug 2020 21:24:07 +0000 (23:24 +0200)
Hopefully, this should fix the following error on one of the
autobuilders:

png: no  [The C/C++ header for libpng (png.h) could not
     be found.  You may need to install the development
     package.]

Fixes:
 - http://autobuild.buildroot.org/results/afddcc44b2fb7983244f24542bfae921869e4ab8

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
package/python-matplotlib/0002-Merge-pull-request-11983-from-anntzer-builddepchecks.patch [new file with mode: 0644]

diff --git a/package/python-matplotlib/0002-Merge-pull-request-11983-from-anntzer-builddepchecks.patch b/package/python-matplotlib/0002-Merge-pull-request-11983-from-anntzer-builddepchecks.patch
new file mode 100644 (file)
index 0000000..b3a22ac
--- /dev/null
@@ -0,0 +1,170 @@
+From 923ce72409f184bd8e8c61b196260891036ba87e Mon Sep 17 00:00:00 2001
+From: Antony Lee <anntzer.lee@gmail.com>
+Date: Thu, 30 Aug 2018 15:27:55 +0200
+Subject: [PATCH] Simplify version checks for freetype and libpng.
+
+Currently, setupext.py replicates a lot of work done by the compiler to
+check whether header files are present, and whether freetype and libpng
+have sufficiently recent versions.
+
+Instead, we can just add a small stub source file at the top of the
+extension sources which just tries to include the header and checks the
+version macros.  If the header is not found, compilation will
+immediately abort with `foo.h: No such file or directory`; if the
+version is too old, we can emit an appropriate error message (`#pragma
+message` is supported by all major compilers and allows expanding of
+macros in the error message).
+
+[Retrieved from:
+https://github.com/matplotlib/matplotlib/commit/d1060a885309ec7ac19ca912d3011a5eb1673bd5]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ setupext.py              | 83 +++++-----------------------------------
+ src/checkdep_freetype2.c | 13 +++++++
+ src/checkdep_libpng.c    |  5 +++
+ 3 files changed, 28 insertions(+), 73 deletions(-)
+ create mode 100644 src/checkdep_freetype2.c
+ create mode 100644 src/checkdep_libpng.c
+
+diff --git a/setupext.py b/setupext.py
+index d5f4b81f562..a5163e39288 100644
+--- a/setupext.py
++++ b/setupext.py
+@@ -814,6 +814,13 @@ def add_flags(self, ext, add_sources=True):
+                                for x in agg_sources)
++# For FreeType2 and libpng, we add a separate checkdep_foo.c source to at the
++# top of the extension sources.  This file is compiled first and immediately
++# aborts the compilation either with "foo.h: No such file or directory" if the
++# header is not found, or an appropriate error message if the header indicates
++# a too-old version.
++
++
+ class FreeType(SetupPackage):
+     name = "freetype"
+     pkg_names = {
+@@ -825,59 +832,8 @@ class FreeType(SetupPackage):
+         "windows_url": "http://gnuwin32.sourceforge.net/packages/freetype.htm"
+         }
+-    def check(self):
+-        if options.get('local_freetype'):
+-            return "Using local version for testing"
+-
+-        if sys.platform == 'win32':
+-            try:
+-                check_include_file(get_include_dirs(), 'ft2build.h', 'freetype')
+-            except CheckFailed:
+-                check_include_file(get_include_dirs(), os.path.join('freetype2', 'ft2build.h'), 'freetype')
+-            return 'Using unknown version found on system.'
+-
+-        status, output = subprocess.getstatusoutput(
+-            "freetype-config --ftversion")
+-        if status == 0:
+-            version = output
+-        else:
+-            version = None
+-
+-        # Early versions of freetype grep badly inside freetype-config,
+-        # so catch those cases. (tested with 2.5.3).
+-        if version is None or 'No such file or directory\ngrep:' in version:
+-            version = self.version_from_header()
+-
+-        # pkg_config returns the libtool version rather than the
+-        # freetype version so we need to explicitly pass the version
+-        # to _check_for_pkg_config
+-        return self._check_for_pkg_config(
+-            'freetype2', 'ft2build.h',
+-            min_version='2.3', version=version)
+-
+-    def version_from_header(self):
+-        version = 'unknown'
+-        ext = self.get_extension()
+-        if ext is None:
+-            return version
+-        # Return the first version found in the include dirs.
+-        for include_dir in ext.include_dirs:
+-            header_fname = os.path.join(include_dir, 'freetype.h')
+-            if os.path.exists(header_fname):
+-                major, minor, patch = 0, 0, 0
+-                with open(header_fname, 'r') as fh:
+-                    for line in fh:
+-                        if line.startswith('#define FREETYPE_'):
+-                            value = line.rsplit(' ', 1)[1].strip()
+-                            if 'MAJOR' in line:
+-                                major = value
+-                            elif 'MINOR' in line:
+-                                minor = value
+-                            else:
+-                                patch = value
+-                return '.'.join([major, minor, patch])
+-
+     def add_flags(self, ext):
++        ext.sources.insert(0, 'src/checkdep_freetype2.c')
+         if options.get('local_freetype'):
+             src_path = os.path.join(
+                 'build', 'freetype-{0}'.format(LOCAL_FREETYPE_VERSION))
+@@ -1058,30 +1014,11 @@ class Png(SetupPackage):
+         "windows_url": "http://gnuwin32.sourceforge.net/packages/libpng.htm"
+         }
+-    def check(self):
+-        if sys.platform == 'win32':
+-            check_include_file(get_include_dirs(), 'png.h', 'png')
+-            return 'Using unknown version found on system.'
+-
+-        status, output = subprocess.getstatusoutput("libpng-config --version")
+-        if status == 0:
+-            version = output
+-        else:
+-            version = None
+-
+-        try:
+-            return self._check_for_pkg_config(
+-                'libpng', 'png.h',
+-                min_version='1.2', version=version)
+-        except CheckFailed as e:
+-            if has_include_file(get_include_dirs(), 'png.h'):
+-                return str(e) + ' Using unknown version found on system.'
+-            raise
+-
+     def get_extension(self):
+         sources = [
++            'src/checkdep_libpng.c',
+             'src/_png.cpp',
+-            'src/mplutils.cpp'
++            'src/mplutils.cpp',
+             ]
+         ext = make_extension('matplotlib._png', sources)
+         pkg_config.setup_extension(
+diff --git a/src/checkdep_freetype2.c b/src/checkdep_freetype2.c
+new file mode 100644
+index 00000000000..bf9a8c94e38
+--- /dev/null
++++ b/src/checkdep_freetype2.c
+@@ -0,0 +1,13 @@
++#include <ft2build.h>
++#include FT_FREETYPE_H
++
++#define XSTR(x) STR(x)
++#define STR(x) #x
++
++#pragma message("Compiling with FreeType version " \
++  XSTR(FREETYPE_MAJOR) "." XSTR(FREETYPE_MINOR) "." XSTR(FREETYPE_PATCH) ".")
++#if FREETYPE_MAJOR << 16 + FREETYPE_MINOR << 8 + FREETYPE_PATCH < 0x020300
++    #error "FreeType version 2.3 or higher is required." \
++      "Consider setting the MPLLOCALFREETYPE environment variable to 1."
++  #error
++#endif
+diff --git a/src/checkdep_libpng.c b/src/checkdep_libpng.c
+new file mode 100644
+index 00000000000..5ebe5cbe4d7
+--- /dev/null
++++ b/src/checkdep_libpng.c
+@@ -0,0 +1,5 @@
++#include <png.h>
++#pragma message("Compiling with libpng version " PNG_LIBPNG_VER_STRING ".")
++#if PNG_LIBPNG_VER < 10200
++  #error "libpng version 1.2 or higher is required."
++#endif