aboutsummaryrefslogtreecommitdiff
path: root/cmake/CFeatureCheck.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/CFeatureCheck.cmake')
-rw-r--r--cmake/CFeatureCheck.cmake39
1 files changed, 39 insertions, 0 deletions
diff --git a/cmake/CFeatureCheck.cmake b/cmake/CFeatureCheck.cmake
new file mode 100644
index 00000000..08828f58
--- /dev/null
+++ b/cmake/CFeatureCheck.cmake
@@ -0,0 +1,39 @@
+# - Compile and run code to check for C features
+#
+# This functions compiles a source file under the `cmake` folder
+# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake
+# environment
+#
+# c_feature_check(<FLAG> [<VARIANT>])
+#
+# - Example
+#
+# include(CFeatureCheck)
+# c_feature_check(VLA)
+
+if(__c_feature_check)
+ return()
+endif()
+set(__c_feature_check INCLUDED)
+
+function(c_feature_check FILE)
+ string(TOLOWER ${FILE} FILE)
+ string(TOUPPER ${FILE} VAR)
+ string(TOUPPER "${VAR}_SUPPORTED" FEATURE)
+ if (DEFINED ${VAR}_SUPPORTED)
+ set(${VAR}_SUPPORTED 1 PARENT_SCOPE)
+ return()
+ endif()
+
+ if (NOT DEFINED COMPILE_${FEATURE})
+ message(STATUS "Performing Test ${FEATURE}")
+ try_compile(COMPILE_${FEATURE} ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/cmake/${FILE}.c)
+ endif()
+
+ if(COMPILE_${FEATURE})
+ message(STATUS "Performing Test ${FEATURE} -- success")
+ set(${VAR}_SUPPORTED 1 PARENT_SCOPE)
+ else()
+ message(STATUS "Performing Test ${FEATURE} -- failed to compile")
+ endif()
+endfunction()