xref: /freebsd/contrib/kyua/m4/compiler-flags.m4 (revision 9e5787d2284e187abb5b654d924394a65772e004)
1dnl Copyright 2010 The Kyua Authors.
2dnl All rights reserved.
3dnl
4dnl Redistribution and use in source and binary forms, with or without
5dnl modification, are permitted provided that the following conditions are
6dnl met:
7dnl
8dnl * Redistributions of source code must retain the above copyright
9dnl   notice, this list of conditions and the following disclaimer.
10dnl * Redistributions in binary form must reproduce the above copyright
11dnl   notice, this list of conditions and the following disclaimer in the
12dnl   documentation and/or other materials provided with the distribution.
13dnl * Neither the name of Google Inc. nor the names of its contributors
14dnl   may be used to endorse or promote products derived from this software
15dnl   without specific prior written permission.
16dnl
17dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29dnl \file compiler-flags.m4
30dnl
31dnl Macros to check for the existence of compiler flags.  The macros in this
32dnl file support both C and C++.
33dnl
34dnl Be aware that, in order to detect a flag accurately, we may need to enable
35dnl strict warning checking in the compiler (i.e. enable -Werror).  Some
36dnl compilers, e.g. Clang, report unknown -W flags as warnings unless -Werror is
37dnl selected.  This fact would confuse the flag checks below because we would
38dnl conclude that a flag is valid while in reality it is not.  To resolve this,
39dnl the macros below will pass -Werror to the compiler along with any other flag
40dnl being checked.
41
42
43dnl Checks for a compiler flag and sets a result variable.
44dnl
45dnl This is an auxiliary macro for the implementation of _KYUA_FLAG.
46dnl
47dnl \param 1 The shell variable containing the compiler name.  Used for
48dnl     reporting purposes only.  C or CXX.
49dnl \param 2 The shell variable containing the flags for the compiler.
50dnl     CFLAGS or CXXFLAGS.
51dnl \param 3 The name of the compiler flag to check for.
52dnl \param 4 The shell variable to set with the result of the test.  Will
53dnl     be set to 'yes' if the flag is valid, 'no' otherwise.
54dnl \param 5 Additional, optional flags to pass to the C compiler while
55dnl     looking for the flag in $3.  We use this here to pass -Werror to the
56dnl     flag checks (unless we are checking for -Werror already).
57AC_DEFUN([_KYUA_FLAG_AUX], [
58    if test x"${$4-unset}" = xunset; then
59        AC_MSG_CHECKING(whether ${$1} supports $3)
60        saved_flags="${$2}"
61        $4=no
62        $2="${$2} $5 $3"
63        # The inclusion of a header file in the test program below is needed
64        # because some compiler flags that we test for may actually not be
65        # compatible with other flags, and such compatibility checks are
66        # performed within the system header files.
67        #
68        # As an example, if we are testing for -D_FORTIFY_SOURCE=2 and the
69        # compilation is being done with -O2, Linux's /usr/include/features.h
70        # will abort the compilation of our code later on.  By including a
71        # generic header file here that pulls in features.h we ensure that
72        # this test is accurate for the build stage.
73        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [return 0;])],
74                       AC_MSG_RESULT(yes)
75                       $4=yes,
76                       AC_MSG_RESULT(no))
77        $2="${saved_flags}"
78    fi
79])
80
81
82dnl Checks for a compiler flag and appends it to a result variable.
83dnl
84dnl \param 1 The shell variable containing the compiler name.  Used for
85dnl     reporting purposes only.  CC or CXX.
86dnl \param 2 The shell variable containing the flags for the compiler.
87dnl     CFLAGS or CXXFLAGS.
88dnl \param 3 The name of the compiler flag to check for.
89dnl \param 4 The shell variable to which to append $3 if the flag is valid.
90AC_DEFUN([_KYUA_FLAG], [
91    _KYUA_FLAG_AUX([$1], [$2], [-Werror], [kyua_$1_has_werror])
92    if test "$3" = "-Werror"; then
93        found=${kyua_$1_has_werror}
94    else
95        found=unset
96        if test ${kyua_$1_has_werror} = yes; then
97            _KYUA_FLAG_AUX([$1], [$2], [$3], [found], [-Werror])
98        else
99            _KYUA_FLAG_AUX([$1], [$2], [$3], [found], [])
100        fi
101    fi
102    if test ${found} = yes; then
103        $4="${$4} $3"
104    fi
105])
106
107
108dnl Checks for a C compiler flag and appends it to a variable.
109dnl
110dnl \pre The current language is C.
111dnl
112dnl \param 1 The name of the compiler flag to check for.
113dnl \param 2 The shell variable to which to append $1 if the flag is valid.
114AC_DEFUN([KYUA_CC_FLAG], [
115    AC_LANG_ASSERT([C])
116    _KYUA_FLAG([CC], [CFLAGS], [$1], [$2])
117])
118
119
120dnl Checks for a C++ compiler flag and appends it to a variable.
121dnl
122dnl \pre The current language is C++.
123dnl
124dnl \param 1 The name of the compiler flag to check for.
125dnl \param 2 The shell variable to which to append $1 if the flag is valid.
126AC_DEFUN([KYUA_CXX_FLAG], [
127    AC_LANG_ASSERT([C++])
128    _KYUA_FLAG([CXX], [CXXFLAGS], [$1], [$2])
129])
130
131
132dnl Checks for a set of C compiler flags and appends them to CFLAGS.
133dnl
134dnl The checks are performed independently and only when all the checks are
135dnl done, the output variable is modified.
136dnl
137dnl \param 1 Whitespace-separated list of C flags to check.
138AC_DEFUN([KYUA_CC_FLAGS], [
139    AC_LANG_PUSH([C])
140    valid_cflags=
141    for f in $1; do
142        KYUA_CC_FLAG(${f}, valid_cflags)
143    done
144    if test -n "${valid_cflags}"; then
145        CFLAGS="${CFLAGS} ${valid_cflags}"
146    fi
147    AC_LANG_POP([C])
148])
149
150
151dnl Checks for a set of C++ compiler flags and appends them to CXXFLAGS.
152dnl
153dnl The checks are performed independently and only when all the checks are
154dnl done, the output variable is modified.
155dnl
156dnl \pre The current language is C++.
157dnl
158dnl \param 1 Whitespace-separated list of C flags to check.
159AC_DEFUN([KYUA_CXX_FLAGS], [
160    AC_LANG_PUSH([C++])
161    valid_cxxflags=
162    for f in $1; do
163        KYUA_CXX_FLAG(${f}, valid_cxxflags)
164    done
165    if test -n "${valid_cxxflags}"; then
166        CXXFLAGS="${CXXFLAGS} ${valid_cxxflags}"
167    fi
168    AC_LANG_POP([C++])
169])
170