From f87871104291fb45bc4faf3ec9433ad7c5f1c4b8 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Sun, 3 Jun 2007 17:45:19 +0000 Subject: [PATCH] Add cmake module finding the appropriate variant of the "restrict" keyword. Could that be useful to have in kdelibs/cmake/modules ? --- cmake/CheckRestrictKeyword.cmake | 87 ++++++++++++++++++++++++ tvmet-1.7.1/include/tvmet/CMakeLists.txt | 20 +++--- tvmet-1.7.1/include/tvmet/config.h.cmake | 2 +- 3 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 cmake/CheckRestrictKeyword.cmake 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 +# +# 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) diff --git a/tvmet-1.7.1/include/tvmet/CMakeLists.txt b/tvmet-1.7.1/include/tvmet/CMakeLists.txt index 11113b4ad..cbccafd93 100644 --- a/tvmet-1.7.1/include/tvmet/CMakeLists.txt +++ b/tvmet-1.7.1/include/tvmet/CMakeLists.txt @@ -6,18 +6,20 @@ INCLUDE (CheckIeeeMath) INCLUDE (CheckSysvMath) INCLUDE (CheckLongDouble) INCLUDE (CheckLongLong) +INCLUDE (CheckRestrictKeyword) FILE(GLOB tvmet_header_SRCS "*.h") -CHECK_INCLUDE_FILES (sys/time.h TVMET_HAVE_SYS_TIME_H) -CHECK_INCLUDE_FILES (unistd.h TVMET_HAVE_UNISTD_H) -CHECK_COMPLEX (TVMET_HAVE_COMPLEX) -CHECK_COMPLEX_MATH1 (TVMET_HAVE_COMPLEX_MATH1) -CHECK_COMPLEX_MATH2 (TVMET_HAVE_COMPLEX_MATH2) -CHECK_IEEE_MATH (TVMET_HAVE_IEEE_MATH) -CHECK_SYSV_MATH (TVMET_HAVE_SYSV_MATH) -CHECK_LONG_DOUBLE (TVMET_HAVE_LONG_DOUBLE) -CHECK_LONG_DOUBLE (TVMET_HAVE_LONG_LONG) +CHECK_INCLUDE_FILES (sys/time.h TVMET_HAVE_SYS_TIME_H) +CHECK_INCLUDE_FILES (unistd.h TVMET_HAVE_UNISTD_H) +CHECK_COMPLEX (TVMET_HAVE_COMPLEX) +CHECK_COMPLEX_MATH1 (TVMET_HAVE_COMPLEX_MATH1) +CHECK_COMPLEX_MATH2 (TVMET_HAVE_COMPLEX_MATH2) +CHECK_IEEE_MATH (TVMET_HAVE_IEEE_MATH) +CHECK_SYSV_MATH (TVMET_HAVE_SYSV_MATH) +CHECK_LONG_DOUBLE (TVMET_HAVE_LONG_DOUBLE) +CHECK_LONG_DOUBLE (TVMET_HAVE_LONG_LONG) +CHECK_RESTRICT_KEYWORD (TVMET_RESTRICT_KEYWORD) # the following are directories where stuff will be installed to SET(INCLUDE_INSTALL_DIR diff --git a/tvmet-1.7.1/include/tvmet/config.h.cmake b/tvmet-1.7.1/include/tvmet/config.h.cmake index d07bd21ce..0d6f104d9 100644 --- a/tvmet-1.7.1/include/tvmet/config.h.cmake +++ b/tvmet-1.7.1/include/tvmet/config.h.cmake @@ -28,7 +28,7 @@ /* Define to 1 if you have the header file. */ #cmakedefine TVMET_HAVE_UNISTD_H 1 -#define _tvmet_restrict __restrict__ +#define _tvmet_restrict @TVMET_RESTRICT_KEYWORD@ /* _INCLUDE_TVMET_CONFIG_H */ #endif