1#
2# Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# This code is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License version 2 only, as
7# published by the Free Software Foundation.  Oracle designates this
8# particular file as subject to the "Classpath" exception as provided
9# by Oracle in the LICENSE file that accompanied this code.
10#
11# This code is distributed in the hope that it will be useful, but WITHOUT
12# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14# version 2 for more details (a copy is included in the LICENSE file that
15# accompanied this code).
16#
17# You should have received a copy of the GNU General Public License version
18# 2 along with this work; if not, write to the Free Software Foundation,
19# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22# or visit www.oracle.com if you need additional information or have any
23# questions.
24#
25
26m4_include([flags-cflags.m4])
27m4_include([flags-ldflags.m4])
28m4_include([flags-other.m4])
29
30################################################################################
31#
32# Setup ABI profile (for arm)
33#
34AC_DEFUN([FLAGS_SETUP_ABI_PROFILE],
35[
36  AC_ARG_WITH(abi-profile, [AS_HELP_STRING([--with-abi-profile],
37      [specify ABI profile for ARM builds (arm-vfp-sflt,arm-vfp-hflt,arm-sflt, armv5-vfp-sflt,armv6-vfp-hflt,aarch64) @<:@toolchain dependent@:>@ ])])
38
39  if test "x$with_abi_profile" != x; then
40    if test "x$OPENJDK_TARGET_CPU" != xarm && \
41        test "x$OPENJDK_TARGET_CPU" != xaarch64; then
42      AC_MSG_ERROR([--with-abi-profile only available on arm/aarch64])
43    fi
44
45    OPENJDK_TARGET_ABI_PROFILE=$with_abi_profile
46    AC_MSG_CHECKING([for ABI profle])
47    AC_MSG_RESULT([$OPENJDK_TARGET_ABI_PROFILE])
48
49    # --- Arm-sflt CFLAGS and ASFLAGS ---
50    # Armv5te is required for assembler, because pld insn used in arm32 hotspot is only in v5E and above.
51    # However, there is also a GCC bug which generates unaligned strd/ldrd instructions on armv5te:
52    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82445, and it was fixed in gcc 7.1.
53    # The resulting compromise is to enable v5TE for assembler and let GCC generate code for v5T.
54    if test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-vfp-sflt; then
55      ARM_FLOAT_TYPE=vfp-sflt
56      ARM_ARCH_TYPE_FLAGS='-march=armv7-a -mthumb'
57      ARM_ARCH_TYPE_ASFLAGS='-march=armv7-a -mthumb'
58    elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-vfp-hflt; then
59      ARM_FLOAT_TYPE=vfp-hflt
60      ARM_ARCH_TYPE_FLAGS='-march=armv7-a -mthumb'
61      ARM_ARCH_TYPE_ASFLAGS='-march=armv7-a -mthumb'
62    elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-sflt; then
63      ARM_FLOAT_TYPE=sflt
64      ARM_ARCH_TYPE_FLAGS='-march=armv5t -marm'
65      ARM_ARCH_TYPE_ASFLAGS='-march=armv5te'
66    elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarmv5-vfp-sflt; then
67      ARM_FLOAT_TYPE=vfp-sflt
68      ARM_ARCH_TYPE_FLAGS='-march=armv5t -marm'
69      ARM_ARCH_TYPE_ASFLAGS='-march=armv5te'
70    elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarmv6-vfp-hflt; then
71      ARM_FLOAT_TYPE=vfp-hflt
72      ARM_ARCH_TYPE_FLAGS='-march=armv6 -marm'
73      ARM_ARCH_TYPE_ASFLAGS='-march=armv6'
74    elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xaarch64; then
75      # No special flags, just need to trigger setting JDK_ARCH_ABI_PROP_NAME
76      ARM_FLOAT_TYPE=
77      ARM_ARCH_TYPE_FLAGS=
78      ARM_ARCH_TYPE_ASFLAGS=
79    else
80      AC_MSG_ERROR([Invalid ABI profile: "$OPENJDK_TARGET_ABI_PROFILE"])
81    fi
82
83    if test "x$ARM_FLOAT_TYPE" = xvfp-sflt; then
84      ARM_FLOAT_TYPE_FLAGS='-mfloat-abi=softfp -mfpu=vfp -DFLOAT_ARCH=-vfp-sflt'
85      ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=softfp -mfpu=vfp"
86    elif test "x$ARM_FLOAT_TYPE" = xvfp-hflt; then
87      ARM_FLOAT_TYPE_FLAGS='-mfloat-abi=hard -mfpu=vfp -DFLOAT_ARCH=-vfp-hflt'
88      ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=hard -mfpu=vfp"
89    elif test "x$ARM_FLOAT_TYPE" = xsflt; then
90      ARM_FLOAT_TYPE_FLAGS='-msoft-float -mfpu=vfp'
91      ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=soft -mfpu=vfp"
92    fi
93    AC_MSG_CHECKING([for $ARM_FLOAT_TYPE floating point flags])
94    AC_MSG_RESULT([$ARM_FLOAT_TYPE_FLAGS])
95    AC_MSG_CHECKING([for $ARM_FLOAT_TYPE floating point flags for assembler])
96    AC_MSG_RESULT([$ARM_FLOAT_TYPE_ASFLAGS])
97
98    AC_MSG_CHECKING([for arch type flags])
99    AC_MSG_RESULT([$ARM_ARCH_TYPE_FLAGS])
100    AC_MSG_CHECKING([for arch type flags for assembler])
101    AC_MSG_RESULT([$ARM_ARCH_TYPE_ASFLAGS])
102
103    # Now set JDK_ARCH_ABI_PROP_NAME. This is equivalent to the last part of the
104    # autoconf target triplet.
105    [ JDK_ARCH_ABI_PROP_NAME=`$ECHO $OPENJDK_TARGET_AUTOCONF_NAME | $SED -e 's/.*-\([^-]*\)$/\1/'` ]
106    # Sanity check that it is a known ABI.
107    if test "x$JDK_ARCH_ABI_PROP_NAME" != xgnu && \
108        test "x$JDK_ARCH_ABI_PROP_NAME" != xgnueabi  && \
109        test "x$JDK_ARCH_ABI_PROP_NAME" != xgnueabihf; then
110          AC_MSG_WARN([Unknown autoconf target triplet ABI: "$JDK_ARCH_ABI_PROP_NAME"])
111    fi
112    AC_MSG_CHECKING([for ABI property name])
113    AC_MSG_RESULT([$JDK_ARCH_ABI_PROP_NAME])
114    AC_SUBST(JDK_ARCH_ABI_PROP_NAME)
115  fi
116
117  # When building with an abi profile, the name of that profile is appended on the
118  # bundle platform, which is used in bundle names.
119  if test "x$OPENJDK_TARGET_ABI_PROFILE" != x; then
120    OPENJDK_TARGET_BUNDLE_PLATFORM="$OPENJDK_TARGET_OS_BUNDLE-$OPENJDK_TARGET_ABI_PROFILE"
121  fi
122])
123
124AC_DEFUN([FLAGS_SETUP_MACOSX_VERSION],
125[
126  # Additional macosx handling
127  if test "x$OPENJDK_TARGET_OS" = xmacosx; then
128    # MACOSX_VERSION_MIN specifies the lowest version of Macosx that the built
129    # binaries should be compatible with, even if compiled on a newer version
130    # of the OS. It currently has a hard coded value. Setting this also limits
131    # exposure to API changes in header files. Bumping this is likely to
132    # require code changes to build.
133    MACOSX_VERSION_MIN=10.9.0
134    MACOSX_VERSION_MIN_NODOTS=${MACOSX_VERSION_MIN//\./}
135
136    AC_SUBST(MACOSX_VERSION_MIN)
137
138    # Setting --with-macosx-version-max=<version> makes it an error to build or
139    # link to macosx APIs that are newer than the given OS version. The expected
140    # format for <version> is either nn.n.n or nn.nn.nn. See /usr/include/AvailabilityMacros.h.
141    AC_ARG_WITH([macosx-version-max], [AS_HELP_STRING([--with-macosx-version-max],
142        [error on use of newer functionality. @<:@macosx@:>@])],
143        [
144          if echo "$with_macosx_version_max" | $GREP -q "^[[0-9]][[0-9]]\.[[0-9]]\.[[0-9]]\$"; then
145              MACOSX_VERSION_MAX=$with_macosx_version_max
146          elif echo "$with_macosx_version_max" | $GREP -q "^[[0-9]][[0-9]]\.[[0-9]][[0-9]]\.[[0-9]][[0-9]]\$"; then
147              MACOSX_VERSION_MAX=$with_macosx_version_max
148          elif test "x$with_macosx_version_max" = "xno"; then
149              # Use build system default
150              MACOSX_VERSION_MAX=
151          else
152              AC_MSG_ERROR([osx version format must be nn.n.n or nn.nn.nn])
153          fi
154        ],
155        [MACOSX_VERSION_MAX=]
156    )
157    MACOSX_VERSION_MAX_NODOTS=${MACOSX_VERSION_MAX//\./}
158
159    AC_SUBST(MACOSX_VERSION_MAX)
160  fi
161])
162
163# Reset the global CFLAGS/LDFLAGS variables and initialize them with the
164# corresponding configure arguments instead
165AC_DEFUN_ONCE([FLAGS_SETUP_USER_SUPPLIED_FLAGS],
166[
167  if test "x$CFLAGS" != "x"; then
168    AC_MSG_WARN([Ignoring CFLAGS($CFLAGS) found in environment. Use --with-extra-cflags])
169  fi
170
171  if test "x$CXXFLAGS" != "x"; then
172    AC_MSG_WARN([Ignoring CXXFLAGS($CXXFLAGS) found in environment. Use --with-extra-cxxflags])
173  fi
174
175  if test "x$LDFLAGS" != "x"; then
176    AC_MSG_WARN([Ignoring LDFLAGS($LDFLAGS) found in environment. Use --with-extra-ldflags])
177  fi
178
179  if test "x$ASFLAGS" != "x"; then
180    AC_MSG_WARN([Ignoring ASFLAGS($ASFLAGS) found in environment. Use --with-extra-asflags])
181  fi
182
183  AC_ARG_WITH(extra-cflags, [AS_HELP_STRING([--with-extra-cflags],
184      [extra flags to be used when compiling jdk c-files])])
185
186  AC_ARG_WITH(extra-cxxflags, [AS_HELP_STRING([--with-extra-cxxflags],
187      [extra flags to be used when compiling jdk c++-files])])
188
189  AC_ARG_WITH(extra-ldflags, [AS_HELP_STRING([--with-extra-ldflags],
190      [extra flags to be used when linking jdk])])
191
192  AC_ARG_WITH(extra-asflags, [AS_HELP_STRING([--with-extra-asflags],
193      [extra flags to be passed to the assembler])])
194
195  USER_CFLAGS="$with_extra_cflags"
196  USER_CXXFLAGS="$with_extra_cxxflags"
197  USER_LDFLAGS="$with_extra_ldflags"
198  USER_ASFLAGS="$with_extra_asflags"
199])
200
201# Setup the sysroot flags and add them to global CFLAGS and LDFLAGS so
202# that configure can use them while detecting compilers.
203# TOOLCHAIN_TYPE is available here.
204# Param 1 - Optional prefix to all variables. (e.g BUILD_)
205AC_DEFUN([FLAGS_SETUP_SYSROOT_FLAGS],
206[
207  if test "x[$]$1SYSROOT" != "x"; then
208    if test "x$TOOLCHAIN_TYPE" = xgcc; then
209      $1SYSROOT_CFLAGS="--sysroot=[$]$1SYSROOT"
210      $1SYSROOT_LDFLAGS="--sysroot=[$]$1SYSROOT"
211    elif test "x$TOOLCHAIN_TYPE" = xclang; then
212      $1SYSROOT_CFLAGS="-isysroot [$]$1SYSROOT"
213      $1SYSROOT_LDFLAGS="-isysroot [$]$1SYSROOT"
214    fi
215  fi
216
217  if test "x$OPENJDK_TARGET_OS" = xmacosx; then
218    # We also need -iframework<path>/System/Library/Frameworks
219    $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -iframework [$]$1SYSROOT/System/Library/Frameworks"
220    $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -iframework [$]$1SYSROOT/System/Library/Frameworks"
221    if test -d "[$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks" ; then
222      # These always need to be set on macOS 10.X, or we can't find the frameworks embedded in JavaVM.framework
223      # set this here so it doesn't have to be peppered throughout the forest
224      $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -F [$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
225      $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -F [$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
226    fi
227  fi
228
229  # For the microsoft toolchain, we need to get the SYSROOT flags from the
230  # Visual Studio environment. Currently we cannot handle this as a separate
231  # build toolchain.
232  if test "x$1" = x && test "x$OPENJDK_BUILD_OS" = "xwindows" \
233      && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
234    TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV
235  fi
236
237  AC_SUBST($1SYSROOT_CFLAGS)
238  AC_SUBST($1SYSROOT_LDFLAGS)
239])
240
241AC_DEFUN_ONCE([FLAGS_PRE_TOOLCHAIN],
242[
243  # We should always include user supplied flags
244  FLAGS_SETUP_USER_SUPPLIED_FLAGS
245
246  # The sysroot flags are needed for configure to be able to run the compilers
247  FLAGS_SETUP_SYSROOT_FLAGS
248
249  # For xlc, the word size flag is required for correct behavior.
250  # For clang/gcc, the flag is only strictly required for reduced builds, but
251  # set it always where possible (x86 and ppc).
252  if test "x$TOOLCHAIN_TYPE" = xxlc; then
253    MACHINE_FLAG="-q${OPENJDK_TARGET_CPU_BITS}"
254  elif test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
255    if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86 &&
256        test "x$OPENJDK_TARGET_CPU" != xx32 ||
257        test "x$OPENJDK_TARGET_CPU_ARCH" = xppc; then
258      MACHINE_FLAG="-m${OPENJDK_TARGET_CPU_BITS}"
259    fi
260  fi
261
262  # FIXME: global flags are not used yet...
263  # The "global" flags will *always* be set. Without them, it is not possible to
264  # get a working compilation.
265  GLOBAL_CFLAGS="$MACHINE_FLAG $SYSROOT_CFLAGS $USER_CFLAGS"
266  GLOBAL_CXXFLAGS="$MACHINE_FLAG $SYSROOT_CFLAGS $USER_CXXFLAGS"
267  GLOBAL_LDFLAGS="$MACHINE_FLAG $SYSROOT_LDFLAGS $USER_LDFLAGS"
268  # FIXME: Don't really know how to do with this, but this was the old behavior
269  GLOBAL_CPPFLAGS="$SYSROOT_CFLAGS"
270
271  # FIXME: For compatilibity, export this as EXTRA_CFLAGS for now.
272  EXTRA_CFLAGS="$MACHINE_FLAG $USER_CFLAGS"
273  EXTRA_CXXFLAGS="$MACHINE_FLAG $USER_CXXFLAGS"
274  EXTRA_LDFLAGS="$MACHINE_FLAG $USER_LDFLAGS"
275  EXTRA_ASFLAGS="$USER_ASFLAGS"
276
277  AC_SUBST(EXTRA_CFLAGS)
278  AC_SUBST(EXTRA_CXXFLAGS)
279  AC_SUBST(EXTRA_LDFLAGS)
280  AC_SUBST(EXTRA_ASFLAGS)
281
282  # For autoconf testing to work, the global flags must also be stored in the
283  # "unnamed" CFLAGS etc.
284  CFLAGS="$GLOBAL_CFLAGS"
285  CXXFLAGS="$GLOBAL_CXXFLAGS"
286  LDFLAGS="$GLOBAL_LDFLAGS"
287  CPPFLAGS="$GLOBAL_CPPFLAGS"
288
289  if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
290    # When autoconf sends both compiler and linker flags to cl.exe at the same
291    # time, linker flags must be last at the command line. Achieve this by
292    # moving them to LIBS.
293    LIBS="$LIBS -link $LDFLAGS"
294    LDFLAGS=""
295  fi
296])
297
298AC_DEFUN([FLAGS_SETUP_TOOLCHAIN_CONTROL],
299[
300  # COMPILER_TARGET_BITS_FLAG  : option for selecting 32- or 64-bit output
301  # COMPILER_COMMAND_FILE_FLAG : option for passing a command file to the compiler
302  # COMPILER_BINDCMD_FILE_FLAG : option for specifying a file which saves the binder
303  #                              commands produced by the link step (currently AIX only)
304  if test "x$TOOLCHAIN_TYPE" = xxlc; then
305    COMPILER_TARGET_BITS_FLAG="-q"
306    COMPILER_COMMAND_FILE_FLAG="-f"
307    COMPILER_BINDCMD_FILE_FLAG="-bloadmap:"
308  else
309    COMPILER_TARGET_BITS_FLAG="-m"
310    COMPILER_COMMAND_FILE_FLAG="@"
311    COMPILER_BINDCMD_FILE_FLAG=""
312
313    # Check if @file is supported by gcc
314    if test "x$TOOLCHAIN_TYPE" = xgcc; then
315      AC_MSG_CHECKING([if @file is supported by gcc])
316      # Extra emtpy "" to prevent ECHO from interpreting '--version' as argument
317      $ECHO "" "--version" > command.file
318      if $CXX @command.file 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then
319        AC_MSG_RESULT(yes)
320        COMPILER_COMMAND_FILE_FLAG="@"
321      else
322        AC_MSG_RESULT(no)
323        COMPILER_COMMAND_FILE_FLAG=
324      fi
325      $RM command.file
326    fi
327  fi
328
329  AC_SUBST(COMPILER_TARGET_BITS_FLAG)
330  AC_SUBST(COMPILER_COMMAND_FILE_FLAG)
331  AC_SUBST(COMPILER_BINDCMD_FILE_FLAG)
332
333  # Check that the compiler supports -mX (or -qX on AIX) flags
334  # Set COMPILER_SUPPORTS_TARGET_BITS_FLAG to 'true' if it does
335  FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}],
336      IF_TRUE: [COMPILER_SUPPORTS_TARGET_BITS_FLAG=true],
337      IF_FALSE: [COMPILER_SUPPORTS_TARGET_BITS_FLAG=false])
338  AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG)
339
340  if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
341    CC_OUT_OPTION=-Fo
342    LD_OUT_OPTION=-out:
343    AR_OUT_OPTION=-out:
344  else
345    # The option used to specify the target .o,.a or .so file.
346    # When compiling, how to specify the to be created object file.
347    CC_OUT_OPTION='-o$(SPACE)'
348    # When linking, how to specify the output
349    LD_OUT_OPTION='-o$(SPACE)'
350    # When archiving, how to specify the destination static archive.
351    if test "x$OPENJDK_TARGET_OS" = xmacosx; then
352      AR_OUT_OPTION='-r -cs$(SPACE)'
353    else
354      AR_OUT_OPTION='-rcs$(SPACE)'
355    fi
356  fi
357  AC_SUBST(CC_OUT_OPTION)
358  AC_SUBST(LD_OUT_OPTION)
359  AC_SUBST(AR_OUT_OPTION)
360
361  # Generate make dependency files
362  if test "x$TOOLCHAIN_TYPE" = xgcc; then
363    C_FLAG_DEPS="-MMD -MF"
364  elif test "x$TOOLCHAIN_TYPE" = xclang; then
365    C_FLAG_DEPS="-MMD -MF"
366  elif test "x$TOOLCHAIN_TYPE" = xxlc; then
367    C_FLAG_DEPS="-qmakedep=gcc -MF"
368  fi
369  CXX_FLAG_DEPS="$C_FLAG_DEPS"
370  AC_SUBST(C_FLAG_DEPS)
371  AC_SUBST(CXX_FLAG_DEPS)
372])
373
374AC_DEFUN_ONCE([FLAGS_POST_TOOLCHAIN],
375[
376  FLAGS_SETUP_TOOLCHAIN_CONTROL
377
378  if test "x$BUILD_SYSROOT" != x; then
379    FLAGS_SETUP_SYSROOT_FLAGS([BUILD_])
380  else
381    if test "x$COMPILE_TYPE" != "xcross"; then
382      BUILD_SYSROOT_CFLAGS="$SYSROOT_CFLAGS"
383      BUILD_SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS"
384    fi
385  fi
386])
387
388AC_DEFUN([FLAGS_SETUP_FLAGS],
389[
390  FLAGS_SETUP_MACOSX_VERSION
391  FLAGS_SETUP_ABI_PROFILE
392
393  FLAGS_SETUP_SHARED_LIBS
394  FLAGS_SETUP_DEBUG_SYMBOLS
395  FLAGS_SETUP_WARNINGS
396  FLAGS_SETUP_QUALITY_CHECKS
397  FLAGS_SETUP_OPTIMIZATION
398
399  FLAGS_SETUP_CFLAGS
400  FLAGS_SETUP_LDFLAGS
401
402  FLAGS_SETUP_ARFLAGS
403  FLAGS_SETUP_STRIPFLAGS
404  FLAGS_SETUP_RCFLAGS
405
406  FLAGS_SETUP_ASFLAGS
407  FLAGS_SETUP_ASFLAGS_CPU_DEP([TARGET])
408  FLAGS_SETUP_ASFLAGS_CPU_DEP([BUILD], [OPENJDK_BUILD_])
409])
410
411# FLAGS_C_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [ARGUMENT], IF_TRUE: [RUN-IF-TRUE],
412#                                  IF_FALSE: [RUN-IF-FALSE])
413# ------------------------------------------------------------
414# Check that the C compiler supports an argument
415UTIL_DEFUN_NAMED([FLAGS_C_COMPILER_CHECK_ARGUMENTS],
416    [*ARGUMENT IF_TRUE IF_FALSE PREFIX], [$@],
417[
418  AC_MSG_CHECKING([if ARG_PREFIX[CC] supports "ARG_ARGUMENT"])
419  supports=yes
420
421  saved_cflags="$CFLAGS"
422  saved_cc="$CC"
423  CFLAGS="$CFLAGS $CFLAGS_WARNINGS_ARE_ERRORS ARG_ARGUMENT"
424  CC="$ARG_PREFIX[CC]"
425  AC_LANG_PUSH([C])
426  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
427      [supports=no])
428  AC_LANG_POP([C])
429  CC="$saved_cc"
430  CFLAGS="$saved_cflags"
431
432  AC_MSG_RESULT([$supports])
433  if test "x$supports" = "xyes" ; then
434    :
435    ARG_IF_TRUE
436  else
437    :
438    ARG_IF_FALSE
439  fi
440])
441
442# FLAGS_CXX_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [ARGUMENT], IF_TRUE: [RUN-IF-TRUE],
443#                                    IF_FALSE: [RUN-IF-FALSE])
444# ------------------------------------------------------------
445# Check that the C++ compiler supports an argument
446UTIL_DEFUN_NAMED([FLAGS_CXX_COMPILER_CHECK_ARGUMENTS],
447    [*ARGUMENT IF_TRUE IF_FALSE PREFIX], [$@],
448[
449  AC_MSG_CHECKING([if ARG_PREFIX[CXX] supports "ARG_ARGUMENT"])
450  supports=yes
451
452  saved_cxxflags="$CXXFLAGS"
453  saved_cxx="$CXX"
454  CXXFLAGS="$CXXFLAG $CFLAGS_WARNINGS_ARE_ERRORS ARG_ARGUMENT"
455  CXX="$ARG_PREFIX[CXX]"
456  AC_LANG_PUSH([C++])
457  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
458      [supports=no])
459  AC_LANG_POP([C++])
460  CXX="$saved_cxx"
461  CXXFLAGS="$saved_cxxflags"
462
463  AC_MSG_RESULT([$supports])
464  if test "x$supports" = "xyes" ; then
465    :
466    ARG_IF_TRUE
467  else
468    :
469    ARG_IF_FALSE
470  fi
471])
472
473# FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [ARGUMENT], IF_TRUE: [RUN-IF-TRUE],
474#                                IF_FALSE: [RUN-IF-FALSE])
475# ------------------------------------------------------------
476# Check that the C and C++ compilers support an argument
477UTIL_DEFUN_NAMED([FLAGS_COMPILER_CHECK_ARGUMENTS],
478    [*ARGUMENT IF_TRUE IF_FALSE PREFIX], [$@],
479[
480  FLAGS_C_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [ARG_ARGUMENT],
481      IF_TRUE: [C_COMP_SUPPORTS="yes"],
482      IF_FALSE: [C_COMP_SUPPORTS="no"],
483      PREFIX: [ARG_PREFIX])
484  FLAGS_CXX_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [ARG_ARGUMENT],
485      IF_TRUE: [CXX_COMP_SUPPORTS="yes"],
486      IF_FALSE: [CXX_COMP_SUPPORTS="no"],
487      PREFIX: [ARG_PREFIX])
488
489  AC_MSG_CHECKING([if both ARG_PREFIX[CC] and ARG_PREFIX[CXX] support "ARG_ARGUMENT"])
490  supports=no
491  if test "x$C_COMP_SUPPORTS" = "xyes" -a "x$CXX_COMP_SUPPORTS" = "xyes"; then
492    supports=yes;
493  fi
494
495  AC_MSG_RESULT([$supports])
496  if test "x$supports" = "xyes" ; then
497    :
498    ARG_IF_TRUE
499  else
500    :
501    ARG_IF_FALSE
502  fi
503])
504
505# FLAGS_LINKER_CHECK_ARGUMENTS(ARGUMENT: [ARGUMENT], IF_TRUE: [RUN-IF-TRUE],
506#                                   IF_FALSE: [RUN-IF-FALSE])
507# ------------------------------------------------------------
508# Check that the linker support an argument
509UTIL_DEFUN_NAMED([FLAGS_LINKER_CHECK_ARGUMENTS],
510    [*ARGUMENT IF_TRUE IF_FALSE], [$@],
511[
512  AC_MSG_CHECKING([if linker supports "ARG_ARGUMENT"])
513  supports=yes
514
515  saved_ldflags="$LDFLAGS"
516  LDFLAGS="$LDFLAGS ARG_ARGUMENT"
517  AC_LANG_PUSH([C])
518  AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
519      [], [supports=no])
520  AC_LANG_POP([C])
521  LDFLAGS="$saved_ldflags"
522
523  AC_MSG_RESULT([$supports])
524  if test "x$supports" = "xyes" ; then
525    :
526    ARG_IF_TRUE
527  else
528    :
529    ARG_IF_FALSE
530  fi
531])
532