[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