[vlc-devel] [PATCH 1/2] contrib: harfbuzz: Update the bundled ax_pthread.m4

Martin Storsjö martin at martin.st
Wed Apr 8 13:51:12 CEST 2020


This fixes building for Windows with clang, where the bundled
version of ax_pthread.m4 assumes that Clang doesn't need the
pthread option in LDFLAGS (assuming that a system that Clang
supports doesn't need an external library for pthreads).
---
 contrib/src/harfbuzz/rules.mak                |   1 +
 .../src/harfbuzz/update-ax_pthread.m4.patch   | 291 ++++++++++++++++++
 2 files changed, 292 insertions(+)
 create mode 100644 contrib/src/harfbuzz/update-ax_pthread.m4.patch

diff --git a/contrib/src/harfbuzz/rules.mak b/contrib/src/harfbuzz/rules.mak
index a5d14da1e4..04e46c6ebd 100644
--- a/contrib/src/harfbuzz/rules.mak
+++ b/contrib/src/harfbuzz/rules.mak
@@ -15,6 +15,7 @@ $(TARBALLS)/harfbuzz-$(HARFBUZZ_VERSION).tar.xz:
 harfbuzz: harfbuzz-$(HARFBUZZ_VERSION).tar.xz .sum-harfbuzz
 	$(UNPACK)
 	$(APPLY) $(SRC)/harfbuzz/harfbuzz-aarch64.patch
+	$(APPLY) $(SRC)/harfbuzz/update-ax_pthread.m4.patch
 	$(MOVE)
 
 DEPS_harfbuzz = freetype2 $(DEPS_freetype2)
diff --git a/contrib/src/harfbuzz/update-ax_pthread.m4.patch b/contrib/src/harfbuzz/update-ax_pthread.m4.patch
new file mode 100644
index 0000000000..920e068b9d
--- /dev/null
+++ b/contrib/src/harfbuzz/update-ax_pthread.m4.patch
@@ -0,0 +1,291 @@
+--- harfbuzz/m4/ax_pthread.m4.orig	2020-04-08 14:31:17.385627420 +0300
++++ harfbuzz/m4/ax_pthread.m4	2020-04-08 14:31:42.361091349 +0300
+@@ -55,6 +55,7 @@
+ #
+ #   Copyright (c) 2008 Steven G. Johnson <stevenj at alum.mit.edu>
+ #   Copyright (c) 2011 Daniel Richard G. <skunk at iSKUNK.ORG>
++#   Copyright (c) 2019 Marc Stevens <marc.stevens at cwi.nl>
+ #
+ #   This program is free software: you can redistribute it and/or modify it
+ #   under the terms of the GNU General Public License as published by the
+@@ -82,7 +83,7 @@
+ #   modified version of the Autoconf Macro, you may extend this special
+ #   exception to the GPL to apply to your modified version as well.
+ 
+-#serial 24
++#serial 27
+ 
+ AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+ AC_DEFUN([AX_PTHREAD], [
+@@ -123,10 +124,12 @@
+ # (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+ # libraries is broken (non-POSIX).
+ 
+-# Create a list of thread flags to try.  Items starting with a "-" are
+-# C compiler flags, and other items are library names, except for "none"
+-# which indicates that we try without any flags at all, and "pthread-config"
+-# which is a program returning the flags for the Pth emulation library.
++# Create a list of thread flags to try. Items with a "," contain both
++# C compiler flags (before ",") and linker flags (after ","). Other items
++# starting with a "-" are C compiler flags, and remaining items are
++# library names, except for "none" which indicates that we try without
++# any flags at all, and "pthread-config" which is a program returning
++# the flags for the Pth emulation library.
+ 
+ ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+ 
+@@ -194,14 +197,47 @@
+         # that too in a future libc.)  So we'll check first for the
+         # standard Solaris way of linking pthreads (-mt -lpthread).
+ 
+-        ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
++        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+         ;;
+ esac
+ 
++# Are we compiling with Clang?
++
++AC_CACHE_CHECK([whether $CC is Clang],
++    [ax_cv_PTHREAD_CLANG],
++    [ax_cv_PTHREAD_CLANG=no
++     # Note that Autoconf sets GCC=yes for Clang as well as GCC
++     if test "x$GCC" = "xyes"; then
++        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
++            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
++#            if defined(__clang__) && defined(__llvm__)
++             AX_PTHREAD_CC_IS_CLANG
++#            endif
++            ],
++            [ax_cv_PTHREAD_CLANG=yes])
++     fi
++    ])
++ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
++
++
+ # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+ 
++# Note that for GCC and Clang -pthread generally implies -lpthread,
++# except when -nostdlib is passed.
++# This is problematic using libtool to build C++ shared libraries with pthread:
++# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
++# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
++# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
++# To solve this, first try -pthread together with -lpthread for GCC
++
+ AS_IF([test "x$GCC" = "xyes"],
+-      [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
++      [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
++
++# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
++
++AS_IF([test "x$ax_pthread_clang" = "xyes"],
++      [ax_pthread_flags="-pthread,-lpthread -pthread"])
++
+ 
+ # The presence of a feature test macro requesting re-entrant function
+ # definitions is, on some systems, a strong hint that pthreads support is
+@@ -224,25 +260,86 @@
+       [ax_pthread_check_cond=0],
+       [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+ 
+-# Are we compiling with Clang?
+ 
+-AC_CACHE_CHECK([whether $CC is Clang],
+-    [ax_cv_PTHREAD_CLANG],
+-    [ax_cv_PTHREAD_CLANG=no
+-     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+-     if test "x$GCC" = "xyes"; then
+-        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+-            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+-#            if defined(__clang__) && defined(__llvm__)
+-             AX_PTHREAD_CC_IS_CLANG
+-#            endif
+-            ],
+-            [ax_cv_PTHREAD_CLANG=yes])
+-     fi
+-    ])
+-ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
++if test "x$ax_pthread_ok" = "xno"; then
++for ax_pthread_try_flag in $ax_pthread_flags; do
++
++        case $ax_pthread_try_flag in
++                none)
++                AC_MSG_CHECKING([whether pthreads work without any flags])
++                ;;
++
++                *,*)
++                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
++                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
++                AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
++                ;;
++
++                -*)
++                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
++                PTHREAD_CFLAGS="$ax_pthread_try_flag"
++                ;;
++
++                pthread-config)
++                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
++                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
++                PTHREAD_CFLAGS="`pthread-config --cflags`"
++                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
++                ;;
++
++                *)
++                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
++                PTHREAD_LIBS="-l$ax_pthread_try_flag"
++                ;;
++        esac
++
++        ax_pthread_save_CFLAGS="$CFLAGS"
++        ax_pthread_save_LIBS="$LIBS"
++        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++        LIBS="$PTHREAD_LIBS $LIBS"
++
++        # Check for various functions.  We must include pthread.h,
++        # since some functions may be macros.  (On the Sequent, we
++        # need a special flag -Kthread to make this header compile.)
++        # We check for pthread_join because it is in -lpthread on IRIX
++        # while pthread_create is in libc.  We check for pthread_attr_init
++        # due to DEC craziness with -lpthreads.  We check for
++        # pthread_cleanup_push because it is one of the few pthread
++        # functions on Solaris that doesn't have a non-functional libc stub.
++        # We try pthread_create on general principles.
++
++        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
++#                       if $ax_pthread_check_cond
++#                        error "$ax_pthread_check_macro must be defined"
++#                       endif
++                        static void *some_global = NULL;
++                        static void routine(void *a)
++                          {
++                             /* To avoid any unused-parameter or
++                                unused-but-set-parameter warning.  */
++                             some_global = a;
++                          }
++                        static void *start_routine(void *a) { return a; }],
++                       [pthread_t th; pthread_attr_t attr;
++                        pthread_create(&th, 0, start_routine, 0);
++                        pthread_join(th, 0);
++                        pthread_attr_init(&attr);
++                        pthread_cleanup_push(routine, 0);
++                        pthread_cleanup_pop(0) /* ; */])],
++            [ax_pthread_ok=yes],
++            [])
++
++        CFLAGS="$ax_pthread_save_CFLAGS"
++        LIBS="$ax_pthread_save_LIBS"
++
++        AC_MSG_RESULT([$ax_pthread_ok])
++        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
++
++        PTHREAD_LIBS=""
++        PTHREAD_CFLAGS=""
++done
++fi
+ 
+-ax_pthread_clang_warning=no
+ 
+ # Clang needs special handling, because older versions handle the -pthread
+ # option in a rather... idiosyncratic way
+@@ -261,11 +358,6 @@
+         # -pthread does define _REENTRANT, and while the Darwin headers
+         # ignore this macro, third-party headers might not.)
+ 
+-        PTHREAD_CFLAGS="-pthread"
+-        PTHREAD_LIBS=
+-
+-        ax_pthread_ok=yes
+-
+         # However, older versions of Clang make a point of warning the user
+         # that, in an invocation where only linking and no compilation is
+         # taking place, the -pthread option has no effect ("argument unused
+@@ -320,78 +412,7 @@
+ 
+ fi # $ax_pthread_clang = yes
+ 
+-if test "x$ax_pthread_ok" = "xno"; then
+-for ax_pthread_try_flag in $ax_pthread_flags; do
+-
+-        case $ax_pthread_try_flag in
+-                none)
+-                AC_MSG_CHECKING([whether pthreads work without any flags])
+-                ;;
+-
+-                -mt,pthread)
+-                AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
+-                PTHREAD_CFLAGS="-mt"
+-                PTHREAD_LIBS="-lpthread"
+-                ;;
+-
+-                -*)
+-                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+-                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+-                ;;
+-
+-                pthread-config)
+-                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+-                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+-                PTHREAD_CFLAGS="`pthread-config --cflags`"
+-                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+-                ;;
+ 
+-                *)
+-                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+-                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+-                ;;
+-        esac
+-
+-        ax_pthread_save_CFLAGS="$CFLAGS"
+-        ax_pthread_save_LIBS="$LIBS"
+-        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+-        LIBS="$PTHREAD_LIBS $LIBS"
+-
+-        # Check for various functions.  We must include pthread.h,
+-        # since some functions may be macros.  (On the Sequent, we
+-        # need a special flag -Kthread to make this header compile.)
+-        # We check for pthread_join because it is in -lpthread on IRIX
+-        # while pthread_create is in libc.  We check for pthread_attr_init
+-        # due to DEC craziness with -lpthreads.  We check for
+-        # pthread_cleanup_push because it is one of the few pthread
+-        # functions on Solaris that doesn't have a non-functional libc stub.
+-        # We try pthread_create on general principles.
+-
+-        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+-#                       if $ax_pthread_check_cond
+-#                        error "$ax_pthread_check_macro must be defined"
+-#                       endif
+-                        static void routine(void *a) { a = 0; }
+-                        static void *start_routine(void *a) { return a; }],
+-                       [pthread_t th; pthread_attr_t attr;
+-                        pthread_create(&th, 0, start_routine, 0);
+-                        pthread_join(th, 0);
+-                        pthread_attr_init(&attr);
+-                        pthread_cleanup_push(routine, 0);
+-                        pthread_cleanup_pop(0) /* ; */])],
+-            [ax_pthread_ok=yes],
+-            [])
+-
+-        CFLAGS="$ax_pthread_save_CFLAGS"
+-        LIBS="$ax_pthread_save_LIBS"
+-
+-        AC_MSG_RESULT([$ax_pthread_ok])
+-        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+-
+-        PTHREAD_LIBS=""
+-        PTHREAD_CFLAGS=""
+-done
+-fi
+ 
+ # Various other checks:
+ if test "x$ax_pthread_ok" = "xyes"; then
+@@ -438,7 +459,8 @@
+         AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+             [ax_cv_PTHREAD_PRIO_INHERIT],
+             [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+-                                             [[int i = PTHREAD_PRIO_INHERIT;]])],
++                                             [[int i = PTHREAD_PRIO_INHERIT;
++                                               return i;]])],
+                             [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+                             [ax_cv_PTHREAD_PRIO_INHERIT=no])
+             ])
-- 
2.17.1



More information about the vlc-devel mailing list