[vlc-devel] [PATCH 1/2] contrib: harfbuzz: Update the bundled ax_pthread.m4
Steve Lhomme
robux4 at ycbcr.xyz
Wed Apr 8 15:06:21 CEST 2020
I got the same issue. Both patches LGTM.
On 2020-04-08 13:51, Martin Storsjö wrote:
> 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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list