[PATCH libevdev 1/2] Test for CFLAGS/LFLAGS availability
Ran Benita
ran234 at gmail.com
Thu Sep 12 15:21:46 PDT 2013
Hi,
On Thu, Sep 12, 2013 at 06:07:53PM +0200, David Herrmann wrote:
> Use the CC_CHECK_FLAGS_APPEND() m4 macro to test for availability of
> CFLAGS and LFLAGS. It automatically drops the unavailable flags.
>
> This is also used by systemd, so it ought to work with ostree and other
> non-standard build-environments.
>
> Signed-off-by: David Herrmann <dh.herrmann at gmail.com>
> ---
> configure.ac | 30 +++++-
> m4/attributes.m4 | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 313 insertions(+), 5 deletions(-)
> create mode 100644 m4/attributes.m4
>
> diff --git a/configure.ac b/configure.ac
> index 8e56f42..40675ef 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -33,10 +33,16 @@ AC_PROG_CC
> LT_PREREQ([2.2])
> LT_INIT
> LT_PATH_LD
> +
> +with_ldflags=""
> if test "x$lt_cv_prog_gnu_ld" = "xyes"; then
> - GNU_LD_FLAGS="-Wl,--as-needed -Wl,--gc-sections -Wl,-z,relro -Wl,-z,now"
> - AC_SUBST(GNU_LD_FLAGS)
> + CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
> + -Wl,--as-needed \
> + -Wl,--gc-sections \
> + -Wl,-z,relro \
> + -Wl,-z,now])
> fi
> +AC_SUBST([GNU_LD_FLAGS], $with_ldflags)
>
> PKG_PROG_PKG_CONFIG()
> PKG_CHECK_MODULES(CHECK, [check >= 0.9.9], [HAVE_CHECK="yes"], [HAVE_CHECK="no"])
> @@ -45,11 +51,25 @@ if test "x$HAVE_CHECK" != "xyes"; then
> fi
> AM_CONDITIONAL(BUILD_TESTS, [test "x$HAVE_CHECK" = "xyes"])
>
> -
> +with_cflags=""
> if test "x$GCC" = "xyes"; then
> - GCC_CFLAGS="-Wall -Wextra -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -fvisibility=hidden -pipe -fno-common -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-strict-aliasing -fdiagnostics-show-option -fno-common"
> + CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
> + -Wall \
> + -Wextra \
> + -Wno-unused-parameter \
> + -Wstrict-prototypes \
> + -Wmissing-prototypes \
> + -fvisibility=hidden \
> + -pipe \
> + -fno-common \
> + -fno-strict-aliasing \
> + -ffunction-sections \
> + -fdata-sections \
> + -fno-strict-aliasing \
> + -fdiagnostics-show-option \
> + -fno-common])
> fi
> -AC_SUBST(GCC_CFLAGS)
> +AC_SUBST([GCC_CFLAGS], $with_cflags)
>
> AC_PATH_PROG(DOXYGEN, [doxygen])
> if test "x$DOXYGEN" = "x"; then
> diff --git a/m4/attributes.m4 b/m4/attributes.m4
> new file mode 100644
> index 0000000..7e080da
> --- /dev/null
> +++ b/m4/attributes.m4
> @@ -0,0 +1,288 @@
> +dnl Macros to check the presence of generic (non-typed) symbols.
> +dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes at gmail.com>
> +dnl Copyright (c) 2006-2008 xine project
> +dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi at gmail.com>
> +dnl
> +dnl This program is free software; you can redistribute it and/or modify
> +dnl it under the terms of the GNU General Public License as published by
> +dnl the Free Software Foundation; either version 2, or (at your option)
> +dnl any later version.
> +dnl
> +dnl This program is distributed in the hope that it will be useful,
> +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
> +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +dnl GNU General Public License for more details.
> +dnl
> +dnl You should have received a copy of the GNU General Public License
> +dnl along with this program; if not, write to the Free Software
> +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +dnl 02110-1301, USA.
> +dnl
> +dnl As a special exception, the copyright owners of the
> +dnl macro gives unlimited permission to copy, distribute and modify the
> +dnl configure scripts that are the output of Autoconf when processing the
> +dnl Macro. You need not follow the terms of the GNU General Public
> +dnl License when using or distributing such scripts, even though portions
> +dnl of the text of the Macro appear in them. The GNU General Public
> +dnl License (GPL) does govern all other use of the material that
> +dnl constitutes the Autoconf Macro.
> +dnl
> +dnl This special exception to the GPL applies to versions of the
> +dnl Autoconf Macro released by this project. When you make and
> +dnl distribute a modified version of the Autoconf Macro, you may extend
> +dnl this special exception to the GPL to apply to your modified version as
> +dnl well.
Annoying question follows:
Is this license a problem in an MIT-licensed project? AFAIU including
the file itself is GPL. It had put me off using several macros in the
past (it seems to be the standard for such), but I am not well-versed
in this stuff...
Otherwise this functionality is very useful, xorg has an equivalent in
util-macros.
Ran
> +
> +dnl Check if FLAG in ENV-VAR is supported by compiler and append it
> +dnl to WHERE-TO-APPEND variable
> +dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
> +
> +AC_DEFUN([CC_CHECK_FLAG_APPEND], [
> + AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
> + AS_TR_SH([cc_cv_$2_$3]),
> + [eval "AS_TR_SH([cc_save_$2])='${$2}'"
> + eval "AS_TR_SH([$2])='-Werror $3'"
> + AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
> + [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
> + [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
> + eval "AS_TR_SH([$2])='$cc_save_$2'"])
> +
> + AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
> + [eval "$1='${$1} $3'"])
> +])
> +
> +dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
> +AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
> + for flag in $3; do
> + CC_CHECK_FLAG_APPEND($1, $2, $flag)
> + done
> +])
> +
> +dnl Check if the flag is supported by linker (cacheable)
> +dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
> +
> +AC_DEFUN([CC_CHECK_LDFLAGS], [
> + AC_CACHE_CHECK([if $CC supports $1 flag],
> + AS_TR_SH([cc_cv_ldflags_$1]),
> + [ac_save_LDFLAGS="$LDFLAGS"
> + LDFLAGS="$LDFLAGS $1"
> + AC_LINK_IFELSE([int main() { return 1; }],
> + [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
> + [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
> + LDFLAGS="$ac_save_LDFLAGS"
> + ])
> +
> + AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
> + [$2], [$3])
> +])
> +
> +dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
> +dnl the current linker to avoid undefined references in a shared object.
> +AC_DEFUN([CC_NOUNDEFINED], [
> + dnl We check $host for which systems to enable this for.
> + AC_REQUIRE([AC_CANONICAL_HOST])
> +
> + case $host in
> + dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
> + dnl are requested, as different implementations are present; to avoid problems
> + dnl use -Wl,-z,defs only for those platform not behaving this way.
> + *-freebsd* | *-openbsd*) ;;
> + *)
> + dnl First of all check for the --no-undefined variant of GNU ld. This allows
> + dnl for a much more readable commandline, so that people can understand what
> + dnl it does without going to look for what the heck -z defs does.
> + for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
> + CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
> + break
> + done
> + ;;
> + esac
> +
> + AC_SUBST([LDFLAGS_NOUNDEFINED])
> +])
> +
> +dnl Check for a -Werror flag or equivalent. -Werror is the GCC
> +dnl and ICC flag that tells the compiler to treat all the warnings
> +dnl as fatal. We usually need this option to make sure that some
> +dnl constructs (like attributes) are not simply ignored.
> +dnl
> +dnl Other compilers don't support -Werror per se, but they support
> +dnl an equivalent flag:
> +dnl - Sun Studio compiler supports -errwarn=%all
> +AC_DEFUN([CC_CHECK_WERROR], [
> + AC_CACHE_CHECK(
> + [for $CC way to treat warnings as errors],
> + [cc_cv_werror],
> + [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
> + [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
> + ])
> +])
> +
> +AC_DEFUN([CC_CHECK_ATTRIBUTE], [
> + AC_REQUIRE([CC_CHECK_WERROR])
> + AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
> + AS_TR_SH([cc_cv_attribute_$1]),
> + [ac_save_CFLAGS="$CFLAGS"
> + CFLAGS="$CFLAGS $cc_cv_werror"
> + AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
> + [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
> + [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
> + CFLAGS="$ac_save_CFLAGS"
> + ])
> +
> + AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
> + [AC_DEFINE(
> + AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
> + [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
> + )
> + $4],
> + [$5])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
> + CC_CHECK_ATTRIBUTE(
> + [constructor],,
> + [void __attribute__((constructor)) ctor() { int a; }],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
> + CC_CHECK_ATTRIBUTE(
> + [format], [format(printf, n, n)],
> + [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
> + CC_CHECK_ATTRIBUTE(
> + [format_arg], [format_arg(printf)],
> + [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
> + CC_CHECK_ATTRIBUTE(
> + [visibility_$1], [visibility("$1")],
> + [void __attribute__((visibility("$1"))) $1_function() { }],
> + [$2], [$3])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
> + CC_CHECK_ATTRIBUTE(
> + [nonnull], [nonnull()],
> + [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
> + CC_CHECK_ATTRIBUTE(
> + [unused], ,
> + [void some_function(void *foo, __attribute__((unused)) void *bar);],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
> + CC_CHECK_ATTRIBUTE(
> + [sentinel], ,
> + [void some_function(void *foo, ...) __attribute__((sentinel));],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
> + CC_CHECK_ATTRIBUTE(
> + [deprecated], ,
> + [void some_function(void *foo, ...) __attribute__((deprecated));],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
> + CC_CHECK_ATTRIBUTE(
> + [alias], [weak, alias],
> + [void other_function(void *foo) { }
> + void some_function(void *foo) __attribute__((weak, alias("other_function")));],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
> + CC_CHECK_ATTRIBUTE(
> + [malloc], ,
> + [void * __attribute__((malloc)) my_alloc(int n);],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_PACKED], [
> + CC_CHECK_ATTRIBUTE(
> + [packed], ,
> + [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_CONST], [
> + CC_CHECK_ATTRIBUTE(
> + [const], ,
> + [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
> + [$1], [$2])
> +])
> +
> +AC_DEFUN([CC_FLAG_VISIBILITY], [
> + AC_REQUIRE([CC_CHECK_WERROR])
> + AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
> + [cc_cv_flag_visibility],
> + [cc_flag_visibility_save_CFLAGS="$CFLAGS"
> + CFLAGS="$CFLAGS $cc_cv_werror"
> + CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
> + cc_cv_flag_visibility='yes',
> + cc_cv_flag_visibility='no')
> + CFLAGS="$cc_flag_visibility_save_CFLAGS"])
> +
> + AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
> + [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
> + [Define this if the compiler supports the -fvisibility flag])
> + $1],
> + [$2])
> +])
> +
> +AC_DEFUN([CC_FUNC_EXPECT], [
> + AC_REQUIRE([CC_CHECK_WERROR])
> + AC_CACHE_CHECK([if compiler has __builtin_expect function],
> + [cc_cv_func_expect],
> + [ac_save_CFLAGS="$CFLAGS"
> + CFLAGS="$CFLAGS $cc_cv_werror"
> + AC_COMPILE_IFELSE([AC_LANG_SOURCE(
> + [int some_function() {
> + int a = 3;
> + return (int)__builtin_expect(a, 3);
> + }])],
> + [cc_cv_func_expect=yes],
> + [cc_cv_func_expect=no])
> + CFLAGS="$ac_save_CFLAGS"
> + ])
> +
> + AS_IF([test "x$cc_cv_func_expect" = "xyes"],
> + [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
> + [Define this if the compiler supports __builtin_expect() function])
> + $1],
> + [$2])
> +])
> +
> +AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
> + AC_REQUIRE([CC_CHECK_WERROR])
> + AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
> + [cc_cv_attribute_aligned],
> + [ac_save_CFLAGS="$CFLAGS"
> + CFLAGS="$CFLAGS $cc_cv_werror"
> + for cc_attribute_align_try in 64 32 16 8 4 2; do
> + AC_COMPILE_IFELSE([AC_LANG_SOURCE([
> + int main() {
> + static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
> + return c;
> + }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
> + done
> + CFLAGS="$ac_save_CFLAGS"
> + ])
> +
> + if test "x$cc_cv_attribute_aligned" != "x"; then
> + AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
> + [Define the highest alignment supported])
> + fi
> +])
> --
> 1.8.4
>
> _______________________________________________
> Input-tools mailing list
> Input-tools at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/input-tools
More information about the Input-tools
mailing list