[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