From 6ccf0ea362dacf374a7de209d02beafb32d39be6 Mon Sep 17 00:00:00 2001 From: suzuki toshiya Date: Fri, 7 Oct 2022 16:56:50 +0900 Subject: [PATCH] configure.raw: initial draft to ignore the availability of legacy MacOSX functions, if they are warned as deprecated by the compiler attributes --- builds/unix/ax_gcc_func_attribute.m4 | 242 +++++++++++++++++++++++++++ builds/unix/configure.raw | 130 +++++++++----- 2 files changed, 331 insertions(+), 41 deletions(-) create mode 100644 builds/unix/ax_gcc_func_attribute.m4 diff --git a/builds/unix/ax_gcc_func_attribute.m4 b/builds/unix/ax_gcc_func_attribute.m4 new file mode 100644 index 000000000..fa4e089d6 --- /dev/null +++ b/builds/unix/ax_gcc_func_attribute.m4 @@ -0,0 +1,242 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) +# +# DESCRIPTION +# +# This macro checks if the compiler supports one of GCC's function +# attributes; many other compilers also provide function attributes with +# the same syntax. Compiler warnings are used to detect supported +# attributes as unsupported ones are ignored by default so quieting +# warnings when using this macro will yield false positives. +# +# The ATTRIBUTE parameter holds the name of the attribute to be checked. +# +# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_. +# +# The macro caches its result in the ax_cv_have_func_attribute_ +# variable. +# +# The macro currently supports the following function attributes: +# +# alias +# aligned +# alloc_size +# always_inline +# artificial +# cold +# const +# constructor +# constructor_priority for constructor attribute with priority +# deprecated +# destructor +# dllexport +# dllimport +# error +# externally_visible +# fallthrough +# flatten +# format +# format_arg +# gnu_format +# gnu_inline +# hot +# ifunc +# leaf +# malloc +# noclone +# noinline +# nonnull +# noreturn +# nothrow +# optimize +# pure +# sentinel +# sentinel_position +# unused +# used +# visibility +# warning +# warn_unused_result +# weak +# weakref +# +# Unsupported function attributes will be tested with a prototype +# returning an int and not accepting any arguments and the result of the +# check might be wrong or meaningless so use with care. +# +# LICENSE +# +# Copyright (c) 2013 Gabriele Svelto +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 13 + +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) + + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ + m4_case([$1], + [alias], [ + int foo( void ) { return 0; } + int bar( void ) __attribute__(($1("foo"))); + ], + [aligned], [ + int foo( void ) __attribute__(($1(32))); + ], + [alloc_size], [ + void *foo(int a) __attribute__(($1(1))); + ], + [always_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [artificial], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [cold], [ + int foo( void ) __attribute__(($1)); + ], + [const], [ + int foo( void ) __attribute__(($1)); + ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], + [constructor], [ + int foo( void ) __attribute__(($1)); + ], + [deprecated], [ + int foo( void ) __attribute__(($1(""))); + ], + [destructor], [ + int foo( void ) __attribute__(($1)); + ], + [dllexport], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [dllimport], [ + int foo( void ) __attribute__(($1)); + ], + [error], [ + int foo( void ) __attribute__(($1(""))); + ], + [externally_visible], [ + int foo( void ) __attribute__(($1)); + ], + [fallthrough], [ + void foo( int x ) {switch (x) { case 1: __attribute__(($1)); case 2: break ; }}; + ], + [flatten], [ + int foo( void ) __attribute__(($1)); + ], + [format], [ + int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); + ], + [gnu_format], [ + int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2))); + ], + [format_arg], [ + char *foo(const char *p) __attribute__(($1(1))); + ], + [gnu_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [hot], [ + int foo( void ) __attribute__(($1)); + ], + [ifunc], [ + int my_foo( void ) { return 0; } + static int (*resolve_foo(void))(void) { return my_foo; } + int foo( void ) __attribute__(($1("resolve_foo"))); + ], + [leaf], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [malloc], [ + void *foo( void ) __attribute__(($1)); + ], + [noclone], [ + int foo( void ) __attribute__(($1)); + ], + [noinline], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [nonnull], [ + int foo(char *p) __attribute__(($1(1))); + ], + [noreturn], [ + void foo( void ) __attribute__(($1)); + ], + [nothrow], [ + int foo( void ) __attribute__(($1)); + ], + [optimize], [ + __attribute__(($1(3))) int foo( void ) { return 0; } + ], + [pure], [ + int foo( void ) __attribute__(($1)); + ], + [sentinel], [ + int foo(void *p, ...) __attribute__(($1)); + ], + [sentinel_position], [ + int foo(void *p, ...) __attribute__(($1(1))); + ], + [returns_nonnull], [ + void *foo( void ) __attribute__(($1)); + ], + [unused], [ + int foo( void ) __attribute__(($1)); + ], + [used], [ + int foo( void ) __attribute__(($1)); + ], + [visibility], [ + int foo_def( void ) __attribute__(($1("default"))); + int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); + ], + [warning], [ + int foo( void ) __attribute__(($1(""))); + ], + [warn_unused_result], [ + int foo( void ) __attribute__(($1)); + ], + [weak], [ + int foo( void ) __attribute__(($1)); + ], + [weakref], [ + static int foo( void ) { return 0; } + static int bar( void ) __attribute__(($1("foo"))); + ], + [ + m4_warn([syntax], [Unsupported attribute $1, the test may fail]) + int foo( void ) __attribute__(($1)); + ] + )], []) + ], + dnl GCC doesn't exit with an error if an unknown attribute is + dnl provided but only outputs a warning, so accept the attribute + dnl only if no warning were issued. + [AS_IF([grep -- -Wattributes conftest.err], + [AS_VAR_SET([ac_var], [no])], + [AS_VAR_SET([ac_var], [yes])])], + [AS_VAR_SET([ac_var], [no])]) + ]) + + AS_IF([test yes = AS_VAR_GET([ac_var])], + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, + [Define to 1 if the system has the `$1' function attribute])], []) + + AS_VAR_POPDEF([ac_var]) +]) diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw index fb943fd2a..ca34c77f6 100644 --- a/builds/unix/configure.raw +++ b/builds/unix/configure.raw @@ -253,6 +253,28 @@ if test "${found_visibility_flag}" = "no"; then AC_MSG_RESULT(no)]) fi +orig_CFLAGS="${CFLAGS}" +AX_GCC_FUNC_ATTRIBUTE([deprecated]) +CFLAGS="${orig_CFLAGS}" +CFLAG_error_deprecated="" +if test "${ax_cv_have_func_attribute_deprecated}" = "yes"; then + AC_MSG_CHECKING([for -Werror=deprecated-declarations compiler flag]) + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} -Werror=deprecated-declarations" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([],[ + int x __attribute__((deprecated)); + x = 0; + ]) + ],[ # compilation passed, as unexpected + AC_MSG_RESULT(no) + ],[ # compilation failed, as expected + AC_MSG_RESULT(yes) + CFLAG_error_deprecated="-Werror=deprecated-declarations" + ]) +fi + + # All library tests below try `pkg-config' first. If that fails, a function # from the library is tested in the traditional autoconf way (zlib, bzip2), # or a config script is called (libpng). @@ -613,7 +635,11 @@ if test x$with_old_mac_fonts = xyes; then orig_LDFLAGS="${LDFLAGS}" AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X]) ft2_extra_libs="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" - LDFLAGS="$LDFLAGS $ft2_extra_libs" + LDFLAGS="$LDFLAGS ${ft2_extra_libs}" + + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" + AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -635,10 +661,11 @@ if test x$with_old_mac_fonts = xyes; then ])], [AC_MSG_RESULT([ok]) + CFLAGS="${orig_CFLAGS}" ftmac_c='ftmac.c' AC_MSG_CHECKING([whether OS_INLINE macro is ANSI compatible]) - orig_CFLAGS="$CFLAGS -DFT_MACINTOSH" - CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + orig_CFLAGS="${CFLAGS} -DFT_MACINTOSH" + CFLAGS="${CFLAGS} ${XX_CFLAGS} ${XX_ANSIFLAGS}" AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([ @@ -662,15 +689,15 @@ if test x$with_old_mac_fonts = xyes; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_ANSI_OS_INLINE=1" ], [AC_MSG_RESULT([no, ANSI incompatible]) - CFLAGS="$orig_CFLAGS" + CFLAGS="${orig_CFLAGS}" ]) AC_MSG_CHECKING([type ResourceIndex]) - orig_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${XX_CFLAGS} ${XX_ANSIFLAGS}" AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([ @@ -691,22 +718,23 @@ if test x$with_old_mac_fonts = xyes; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_TYPE_RESOURCE_INDEX=1" ], [AC_MSG_RESULT([no]) - CFLAGS="$orig_CFLAGS" - CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_TYPE_RESOURCE_INDEX=0" ])], [AC_MSG_RESULT([not found]) + CFLAGS="${orig_CFLAGS}" ft2_extra_libs="" LDFLAGS="${orig_LDFLAGS}" - CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) + CFLAGS="${CFLAGS} -DDARWIN_NO_CARBON"]) else - case x$host_os in + case "x${host_os}" in xdarwin*) dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon]) - CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" + CFLAGS="${CFLAGS} -DDARWIN_NO_CARBON" ;; *) ;; @@ -719,9 +747,11 @@ fi AC_ARG_WITH([fsspec], AS_HELP_STRING([--with-fsspec], [use obsolete FSSpec API of MacOS, if available (default=yes)])) -if test x$with_fsspec = xno; then - CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" -elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then +if test "x${with_fsspec}" = "xno"; then + CFLAGS="${CFLAGS} -DHAVE_FSSPEC=0" +elif test "x${with_old_mac_fonts}" = "xyes" -a "x${with_fsspec}" != "x"; then + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" AC_MSG_CHECKING([FSSpec-based FileManager]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -750,9 +780,11 @@ elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_FSSPEC=1"], [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_FSSPEC=0"]) fi @@ -761,14 +793,16 @@ fi AC_ARG_WITH([fsref], AS_HELP_STRING([--with-fsref], [use Carbon FSRef API of MacOS, if available (default=yes)])) -if test x$with_fsref = xno; then +if test "x${with_fsref}" = "xno"; then AC_MSG_WARN([ *** WARNING FreeType2 built without FSRef API cannot load data-fork fonts on MacOS, except of XXX.dfont. ]) - CFLAGS="$CFLAGS -DHAVE_FSREF=0" -elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then + CFLAGS="${CFLAGS} -DHAVE_FSREF=0" +elif test "x${with_old_mac_fonts}" = "xyes" -a "x${with_fsref}" != "x"; then + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" AC_MSG_CHECKING([FSRef-based FileManager]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -817,9 +851,11 @@ elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then #endif ])], [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSREF=1"], + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_FSREF=1"], [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_FSREF=0"]) fi @@ -829,9 +865,11 @@ fi AC_ARG_WITH([quickdraw-toolbox], AS_HELP_STRING([--with-quickdraw-toolbox], [use MacOS QuickDraw in ToolBox, if available (default=yes)])) -if test x$with_quickdraw_toolbox = xno; then +if test "x${with_quickdraw_toolbox}" = "xno"; then CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" -elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then +elif test "x${with_old_mac_fonts}" = "xyes" -a "x${with_quickdraw_toolbox}" != "x"; then + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -859,9 +897,11 @@ elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_QUICKDRAW_TOOLBOX=1"], [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_QUICKDRAW_TOOLBOX=0"]) fi @@ -871,9 +911,11 @@ fi AC_ARG_WITH([quickdraw-carbon], AS_HELP_STRING([--with-quickdraw-carbon], [use MacOS QuickDraw in Carbon, if available (default=yes)])) -if test x$with_quickdraw_carbon = xno; then - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" -elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then +if test "x${with_quickdraw_carbon}" = "xno"; then + CFLAGS="${CFLAGS} -DHAVE_QUICKDRAW_CARBON=0" +elif test "x${with_old_mac_fonts}" = "xyes" -a "x${with_quickdraw_carbon}" != "x"; then + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -911,9 +953,11 @@ elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_QUICKDRAW_CARBON=1"], [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_QUICKDRAW_CARBON=0"]) fi @@ -922,9 +966,11 @@ fi AC_ARG_WITH([ats], AS_HELP_STRING([--with-ats], [use AppleTypeService, if available (default=yes)])) -if test x$with_ats = xno; then - CFLAGS="$CFLAGS -DHAVE_ATS=0" -elif test x$with_old_mac_fonts = xyes -a x$with_ats != x; then +if test "x${with_ats}" = "xno"; then + CFLAGS="${CFLAGS} -DHAVE_ATS=0" +elif test "x${with_old_mac_fonts}" = "xyes" -a "x${with_ats}" != "x"; then + orig_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${CFLAG_error_deprecated}" AC_MSG_CHECKING([AppleTypeService functions]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([ @@ -950,19 +996,21 @@ elif test x$with_old_mac_fonts = xyes -a x$with_ats != x; then ])], [AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_ATS=1"], + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_ATS=1"], [AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_ATS=0"]) + CFLAGS="${orig_CFLAGS}" + CFLAGS="${CFLAGS} -DHAVE_ATS=0"]) fi -case "$CFLAGS" in +case "${CFLAGS}" in *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) AC_MSG_WARN([ *** WARNING FSSpec/FSRef/QuickDraw/ATS options are explicitly given, thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. ]) - CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + CFLAGS="${CFLAGS} "'-I$(TOP_DIR)/builds/mac/' ;; *) ;;