diff options
author | Benoit Jacob <jacob.benoit.1@gmail.com> | 2007-06-03 17:45:19 +0000 |
---|---|---|
committer | Benoit Jacob <jacob.benoit.1@gmail.com> | 2007-06-03 17:45:19 +0000 |
commit | f87871104291fb45bc4faf3ec9433ad7c5f1c4b8 (patch) | |
tree | ae7e1b74d4ec79a598dc3a89390381ef5b36cf6e /cmake | |
parent | 6d749c172a2f8f4dd5ec342356553f0b70018f74 (diff) |
Add cmake module finding the appropriate variant of the "restrict" keyword.
Could that be useful to have in kdelibs/cmake/modules ?
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/CheckRestrictKeyword.cmake | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/cmake/CheckRestrictKeyword.cmake b/cmake/CheckRestrictKeyword.cmake new file mode 100644 index 000000000..d3fcbda90 --- /dev/null +++ b/cmake/CheckRestrictKeyword.cmake @@ -0,0 +1,87 @@ +# This module checks if the C++ compiler supports the restrict keyword or +# some variant of it. The following variants are checked for in that order: +# 1. restrict (The standard C99 keyword, not yet in C++ standard) +# 2. __restrict (G++ has it) +# 3. __restrict__ (G++ has it too) +# 4. _Restrict (seems to be used by Sun's compiler) +# These four cases seem to cover all existing variants; however some C++ +# compilers don't support any variant, in which case the _RESULT variable is +# set to empty value. +# +# Copyright Benoit Jacob 2007 <jacob@math.jussieu.fr> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file in +# kdelibs/cmake/modules. + +INCLUDE(CheckCXXSourceCompiles) + +MACRO (CHECK_RESTRICT_KEYWORD _RESULT) + +SET(_CHECK_restrict_KEYWORD_SRC " + +char f( const char * restrict x ) +{ + return *x; +} + +int main(int argc, char *argv[]) { return 0; } +") + +SET(_CHECK___restrict_KEYWORD_SRC " + +char f( const char * __restrict x ) +{ + return *x; +} + +int main(int argc, char *argv[]) { return 0; } +") + +SET(_CHECK___restrict___KEYWORD_SRC " + +char f( const char * __restrict__ x ) +{ + return *x; +} + +int main(int argc, char *argv[]) { return 0; } +") + +SET(_CHECK__Restrict_KEYWORD_SRC " + +char f( const char * _Restrict x ) +{ + return *x; +} + +int main(int argc, char *argv[]) { return 0; } +") + +CHECK_CXX_SOURCE_COMPILES("${_CHECK_restrict_KEYWORD_SRC}" + HAVE_KEYWORD_restrict) +IF(HAVE_KEYWORD_restrict) + SET(${_RESULT} restrict) +ELSE(HAVE_KEYWORD_restrict) + CHECK_CXX_SOURCE_COMPILES("${_CHECK___restrict_KEYWORD_SRC}" + HAVE_KEYWORD___restrict) + IF(HAVE_KEYWORD___restrict) + SET(${_RESULT} __restrict) + ELSE(HAVE_KEYWORD___restrict) + CHECK_CXX_SOURCE_COMPILES("${_CHECK___restrict___KEYWORD_SRC}" + HAVE_KEYWORD___restrict__) + IF(HAVE_KEYWORD___restrict__) + SET(${_RESULT} __restrict__) + ELSE(HAVE_KEYWORD___restrict__) + CHECK_CXX_SOURCE_COMPILES("${_CHECK__Restrict_KEYWORD_SRC}" + HAVE_KEYWORD__Restrict) + IF(HAVE_KEYWORD__Restrict) + SET(${_RESULT} _Restrict) + ELSE(HAVE_KEYWORD__Restrict) + SET(${_RESULT} ) # no variant of restrict keyword supported + ENDIF(HAVE_KEYWORD__Restrict) + ENDIF(HAVE_KEYWORD___restrict__) + ENDIF(HAVE_KEYWORD___restrict) +ENDIF(HAVE_KEYWORD_restrict) + +ENDMACRO (CHECK_RESTRICT_KEYWORD) |