CMake checks for inline and restrict. Toupper.
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Wed, 16 Jul 2014 09:54:48 +0000 (11:54 +0200)
committerMathis Rosenhauer <rosenhauer@dkrz.de>
Wed, 16 Jul 2014 09:54:48 +0000 (11:54 +0200)
CMakeLists.txt
src/CMakeLists.txt
tests/CMakeLists.txt

index 9e9bf98..26ea2bb 100644 (file)
@@ -1,31 +1,80 @@
-cmake_minimum_required(VERSION 2.6)
-include(CheckIncludeFiles)
-include(TestBigEndian)
-include(CheckCSourceCompiles)
-project(libaec)
-set(libaec_VERSION_MAJOR 0)
-set(libaec_VERSION_MINOR 2)
-set(CMAKE_BUILD_TYPE Release)
-enable_testing()
-
-if(CMAKE_COMPILER_IS_GNUCC)
-  set(CMAKE_C_FLAGS "-Wall -std=gnu99 ${CMAKE_C_FLAGS}")
-endif(CMAKE_COMPILER_IS_GNUCC)
-
-check_include_files(malloc.h HAVE_MALLOC_H)
-check_include_files(stdint.h HAVE_STDINT_H)
-test_big_endian(WORDS_BIGENDIAN)
-check_c_source_compiles(
-  "int main(void) { return __builtin_clzll(1LL); }"
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+INCLUDE(CheckIncludeFiles)
+INCLUDE(TestBigEndian)
+INCLUDE(CheckCSourceCompiles)
+PROJECT(libaec)
+SET(libaec_VERSION_MAJOR 0)
+SET(libaec_VERSION_MINOR 2)
+SET(CMAKE_BUILD_TYPE Release)
+ENABLE_TESTING()
+
+CHECK_INCLUDE_FILES(malloc.h HAVE_MALLOC_H)
+CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
+TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
+CHECK_C_SOURCE_COMPILES(
+  "int main(int argc, char *argv[])
+{return __builtin_clzll(1LL)\;}"
   HAVE_DECL___BUILTIN_CLZLL
   )
 
-configure_file(
+#Inspired from http://www.cmake.org/Wiki/CMakeTestInline
+SET(INLINE_TEST_SRC "/* Inspired by autoconf's c.m4 */
+static inline int static_foo(){return 0\;}
+int main(int argc, char *argv[]){return 0\;}
+")
+FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeTestCInline.c
+  ${INLINE_TEST_SRC})
+
+FOREACH(KEYWORD "inline" "__inline__" "__inline")
+   IF(NOT DEFINED C_INLINE)
+     TRY_COMPILE(C_HAS_${KEYWORD}
+       ${CMAKE_CURRENT_BINARY_DIR}
+       ${CMAKE_CURRENT_BINARY_DIR}/CMakeTestCInline.c
+       COMPILE_DEFINITIONS "-Dinline=${KEYWORD}"
+       )
+     IF(C_HAS_${KEYWORD})
+       SET(C_INLINE TRUE)
+       ADD_DEFINITIONS("-Dinline=${KEYWORD}")
+     ENDIF(C_HAS_${KEYWORD})
+   ENDIF(NOT DEFINED C_INLINE)
+ENDFOREACH(KEYWORD)
+
+IF(NOT DEFINED C_INLINE)
+   ADD_DEFINITIONS("-Dinline=")
+ENDIF(NOT DEFINED C_INLINE)
+
+SET(RESTRICT_TEST_SRC "/* Inspired by autoconf's c.m4 */
+int foo (int * restrict ip){return ip[0]\;}
+int main(int argc, char *argv[]){int s[1]\;
+int * restrict t = s\; t[0] = 0\; return foo(t)\;}
+")
+
+FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeTestCRestrict.c
+  ${RESTRICT_TEST_SRC})
+
+FOREACH(KEYWORD "restrict" "__restrict" "__restrict__" "_Restrict")
+   IF(NOT DEFINED C_RESTRICT)
+     TRY_COMPILE(C_HAS_${KEYWORD}
+       ${CMAKE_CURRENT_BINARY_DIR}
+       ${CMAKE_CURRENT_BINARY_DIR}/CMakeTestCRestrict.c
+       COMPILE_DEFINITIONS "-Drestrict=${KEYWORD}"
+       )
+     IF(C_HAS_${KEYWORD})
+       SET(C_RESTRICT TRUE)
+       ADD_DEFINITIONS("-Drestrict=${KEYWORD}")
+     ENDIF(C_HAS_${KEYWORD})
+   ENDIF(NOT DEFINED C_RESTRICT)
+ENDFOREACH(KEYWORD)
+
+IF(NOT DEFINED C_RESTRICT)
+   ADD_DEFINITIONS("-Drestrict=")
+ENDIF(NOT DEFINED C_RESTRICT)
+
+CONFIGURE_FILE(
   ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
   ${CMAKE_CURRENT_BINARY_DIR}/config.h
   )
 
-include_directories("${PROJECT_BINARY_DIR}")
-
-add_subdirectory(src)
-add_subdirectory(tests EXCLUDE_FROM_ALL)
+INCLUDE_DIRECTORIES("${PROJECT_BINARY_DIR}")
+ADD_SUBDIRECTORY(src)
+ADD_SUBDIRECTORY(tests EXCLUDE_FROM_ALL)
index b5a6391..cf1642b 100644 (file)
@@ -1,25 +1,25 @@
-set(libaec_SRCS encode.c encode_accessors.c decode.c)
-add_library(aec SHARED ${libaec_SRCS})
-set_target_properties(aec PROPERTIES
+SET(libaec_SRCS encode.c encode_accessors.c decode.c)
+ADD_LIBRARY(aec SHARED ${libaec_SRCS})
+SET_TARGET_PROPERTIES(aec PROPERTIES
   VERSION 0
   SOVERSION 0.0
   )
-add_library(sz SHARED sz_compat.c)
-set_target_properties(sz PROPERTIES
+ADD_LIBRARY(sz SHARED sz_compat.c)
+SET_TARGET_PROPERTIES(sz PROPERTIES
   VERSION 0
   SOVERSION 0.0
   )
-target_link_libraries(sz aec)
+TARGET_LINK_LIBRARIES(sz aec)
 
-add_executable(aec_client aec.c)
-set_target_properties(aec_client PROPERTIES OUTPUT_NAME "aec")
-target_link_libraries(aec_client aec)
-add_executable(utime EXCLUDE_FROM_ALL utime.c)
+ADD_EXECUTABLE(aec_client aec.c)
+SET_TARGET_PROPERTIES(aec_client PROPERTIES OUTPUT_NAME "aec")
+TARGET_LINK_LIBRARIES(aec_client aec)
+ADD_EXECUTABLE(utime EXCLUDE_FROM_ALL utime.c)
 
-install(FILES libaec.h szlib.h DESTINATION include)
-install(TARGETS aec sz
+INSTALL(FILES libaec.h szlib.h DESTINATION include)
+INSTALL(TARGETS aec sz
   RUNTIME DESTINATION bin
   LIBRARY DESTINATION lib
   ARCHIVE DESTINATION lib
   )
-install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/aec DESTINATION bin)
+INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/aec DESTINATION bin)
index 2f7affc..5b75192 100644 (file)
@@ -1,25 +1,25 @@
-add_library(check_aec check_aec.c)
+ADD_LIBRARY(check_aec check_aec.c)
 
-add_executable(check_code_options check_code_options.c)
-target_link_libraries(check_code_options check_aec aec)
+ADD_EXECUTABLE(check_code_options check_code_options.c)
+TARGET_LINK_LIBRARIES(check_code_options check_aec aec)
 
-add_executable(check_buffer_sizes check_buffer_sizes.c)
-target_link_libraries(check_buffer_sizes check_aec aec)
+ADD_EXECUTABLE(check_buffer_sizes check_buffer_sizes.c)
+TARGET_LINK_LIBRARIES(check_buffer_sizes check_aec aec)
 
-add_executable(check_long_fs check_long_fs.c)
-target_link_libraries(check_long_fs check_aec aec)
+ADD_EXECUTABLE(check_long_fs check_long_fs.c)
+TARGET_LINK_LIBRARIES(check_long_fs check_aec aec)
 
-add_test(check_code_options check_code_options)
-add_test(check_buffer_sizes check_buffer_sizes)
-add_test(check_long_fs check_long_fs)
+ADD_TEST(check_code_options check_code_options)
+ADD_TEST(check_buffer_sizes check_buffer_sizes)
+ADD_TEST(check_long_fs check_long_fs)
 
-add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
-add_dependencies(check
+ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})
+ADD_DEPENDENCIES(check
   check_code_options
   check_buffer_sizes
   check_long_fs)
 
-add_custom_target(bench
+ADD_CUSTOM_TARGET(bench
     COMMAND ${CMAKE_SOURCE_DIR}/tests/benc.sh
     COMMAND ${CMAKE_SOURCE_DIR}/tests/bdec.sh
     DEPENDS aec_client utime