From 4231d6c43ac1fe120138700b130fd14411048fc3 Mon Sep 17 00:00:00 2001
From: Romain Forlot <romain.forlot@iot.bzh>
Date: Tue, 25 Jul 2017 12:40:02 +0200
Subject: 2 Kernel checks available (warning or mandatory)

Use 2 differents checks, one specify a mandatory kernel version
and the other will output a warning and position a preprocessing
variable that can be used in the code to exclude portions of code
that use kernel features not available under a certain version.

Change-Id: Ifc6848df1a1a448094f5312ea23e6d4837e8ef14
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
---
 cmake/cmake.d/01-variables.cmake     | 15 +++++++++++++++
 cmake/cmake.d/04-build_options.cmake | 30 +++++++++++++-----------------
 cmake/config.cmake.sample            | 14 +++++++++++---
 3 files changed, 39 insertions(+), 20 deletions(-)

diff --git a/cmake/cmake.d/01-variables.cmake b/cmake/cmake.d/01-variables.cmake
index 1bba5ce..3891f53 100644
--- a/cmake/cmake.d/01-variables.cmake
+++ b/cmake/cmake.d/01-variables.cmake
@@ -71,6 +71,21 @@ else()
 	set(OSRELEASE "NOT DEBIAN OS")
 endif()
 
+if(DEFINED ENV{SDKTARGETSYSROOT})
+	file(STRINGS $ENV{SDKTARGETSYSROOT}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+elseif(DEFINED ENV{PKG_CONFIG_SYSROOT_DIR})
+	file(STRINGS $ENV{PKG_CONFIG_SYSROOT_DIR}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+else()
+	file(STRINGS /usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+endif()
+
+string(REGEX MATCH "[0-9]+" LINUX_VERSION_CODE ${LINUX_VERSION_CODE_LINE})
+math(EXPR a "${LINUX_VERSION_CODE} >> 16")
+math(EXPR b "(${LINUX_VERSION_CODE} >> 8) & 255")
+math(EXPR c "(${LINUX_VERSION_CODE} & 255)")
+
+set(KERNEL_VERSION "${a}.${b}.${c}")
+
 # Include project configuration
 # ------------------------------
 project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES ${PROJECT_LANGUAGES})
diff --git a/cmake/cmake.d/04-build_options.cmake b/cmake/cmake.d/04-build_options.cmake
index 899505f..bc14ee6 100644
--- a/cmake/cmake.d/04-build_options.cmake
+++ b/cmake/cmake.d/04-build_options.cmake
@@ -33,27 +33,23 @@ if (gcc_minimal_version)
 	endif()
 endif(gcc_minimal_version)
 
-# Check Kernel minimal version
+# Check Kernel mandatory version, will fail the configuration if required version not matched.
+if (kernel_mandatory_version)
+	message (STATUS "${Cyan}-- Check kernel_mandatory_version (found kernel version ${KERNEL_VERSION})${ColourReset}")
+	if (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version})
+		message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_mandatory_version} please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.")
+	endif (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version})
+endif(kernel_mandatory_version)
+
+# Check Kernel minimal version just print a Warning about missing features
+# and set a definition to be used as preprocessor condition in code to disable
+# incompatibles features.
 if (kernel_minimal_version)
-	if(DEFINED ENV{SDKTARGETSYSROOT})
-		file(STRINGS $ENV{SDKTARGETSYSROOT}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
-	elseif(DEFINED ENV{PKG_CONFIG_SYSROOT_DIR})
-		file(STRINGS $ENV{PKG_CONFIG_SYSROOT_DIR}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
-	else()
-		file(STRINGS /usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
-	endif()
-
-	string(REGEX MATCH "[0-9]+" LINUX_VERSION_CODE ${LINUX_VERSION_CODE_LINE})
-	math(EXPR a "${LINUX_VERSION_CODE} >> 16")
-	math(EXPR b "(${LINUX_VERSION_CODE} >> 8) & 255")
-	math(EXPR c "(${LINUX_VERSION_CODE} & 255)")
-
-	set(KERNEL_VERSION "${a}.${b}.${c}")
 	message (STATUS "${Cyan}-- Check kernel_minimal_version (found kernel version ${KERNEL_VERSION})${ColourReset}")
-
 	if (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
-		message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_minimal_version} please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.")
+		message(WARNING "${Yellow}**** Warning: Some feature(s) require at least ${kernel_minimal_version}. Please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.${ColourReset}")
 	endif (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
+	add_definitions(-DKERNEL_MINIMAL_VERSION_OK)
 endif(kernel_minimal_version)
 
 INCLUDE(FindPkgConfig)
diff --git a/cmake/config.cmake.sample b/cmake/config.cmake.sample
index fb878a2..b1dda58 100644
--- a/cmake/config.cmake.sample
+++ b/cmake/config.cmake.sample
@@ -47,10 +47,18 @@ set(PROJECT_APP_TEMPLATES_DIR "conf.d/app-templates")
 # ----------------------------------
 set(CMAKE_BUILD_TYPE "DEBUG")
 
-# Kernel selection if needed. Impose a minimal version.
-# NOTE FOR NOW IT CHECKS KERNEL Yocto SDK Kernel version
-# else only HOST VERSION
+# Kernel selection if needed. You can choose between a
+# mandatory version to Impose a minimal version.
+# else only HOST VERSION. Or check Kernel minimal version
+# and just print a Warning about missing features and set
+# a define variable to be used as preprocessor condition
+# in code to disable incompatibles features. Preprocessor
+# define is named KERNEL_MINIMAL_VERSION_OK.
+#
+# NOTE*** FOR NOW IT CHECKS KERNEL Yocto environment and
+# Yocto SDK Kernel version.
 # -----------------------------------------------
+#set (kernel_mandatory_version 4.8)
 #set (kernel_minimal_version 4.8)
 
 # Compiler selection if needed. Impose a minimal version.
-- 
cgit 1.2.3-korg