cmake: Add some more utility functions.

For C/C++ preprocessor additions:
- add_c_preproc_definition
- add_cxx_preproc_definition
- add_preproc_definition

For required flags:
- require_c_flag(_/nomsvc)
- require_cxx_flag(_/nomsvc)
- require_flag(_/nomsvc)

Change-Id: If72a8901e39ddb95305415e33ec3368cdd28a754
diff --git a/build/cmake/aom_configure.cmake b/build/cmake/aom_configure.cmake
index b2770d9..f872b76 100644
--- a/build/cmake/aom_configure.cmake
+++ b/build/cmake/aom_configure.cmake
@@ -31,14 +31,7 @@
     add_compiler_flag_if_supported("/WX")
   endif ()
 else ()
-  set(c99_flag "-std=c99")
-  check_c_compiler_flag(${c99_flag} C99_FLAG_SUPPORTED)
-  if (C99_FLAG_SUPPORTED)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${c99_flag}" CACHE STRING "" FORCE)
-  else ()
-    # report error
-    message(FATAL_ERROR "C99 support by the compiler is required!")
-  endif ()
+  require_c_flag("-std=c99")
   add_compiler_flag_if_supported("-Wall")
   add_compiler_flag_if_supported("-Wdisabled-optimization")
   add_compiler_flag_if_supported("-Wextra")
diff --git a/build/cmake/compiler_flags.cmake b/build/cmake/compiler_flags.cmake
index a3e9794..0c8f551 100644
--- a/build/cmake/compiler_flags.cmake
+++ b/build/cmake/compiler_flags.cmake
@@ -68,3 +68,101 @@
   add_c_flag_if_supported(${flag})
   add_cxx_flag_if_supported(${flag})
 endfunction ()
+
+# Checks C compiler for support of $c_flag and terminates generation when
+# support is not present.
+function (require_c_flag c_flag)
+  unset(C_FLAG_FOUND CACHE)
+  string(FIND "${CMAKE_C_FLAGS}" "${c_flag}" C_FLAG_FOUND)
+
+  if (${C_FLAG_FOUND} EQUAL -1)
+    unset(HAVE_C_FLAG CACHE)
+    message("Checking C compiler flag support for: " ${c_flag})
+    check_c_compiler_flag("${c_flag}" HAVE_C_FLAG)
+    if (NOT HAVE_C_FLAG)
+      message(FATAL_ERROR
+              "${PROJECT_NAME} requires support for C flag: ${c_flag}.")
+    endif ()
+    set(CMAKE_C_FLAGS "${c_flag} ${CMAKE_C_FLAGS}" CACHE STRING "" FORCE)
+  endif ()
+endfunction ()
+
+# Checks CXX compiler for support of $cxx_flag and terminates generation when
+# support is not present.
+function (require_cxx_flag cxx_flag)
+  unset(CXX_FLAG_FOUND CACHE)
+  string(FIND "${CMAKE_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FOUND)
+
+  if (${CXX_FLAG_FOUND} EQUAL -1)
+    unset(HAVE_CXX_FLAG CACHE)
+    message("Checking CXX compiler flag support for: " ${cxx_flag})
+    check_cxx_compiler_flag("${cxx_flag}" HAVE_CXX_FLAG)
+    if (NOT HAVE_CXX_FLAG)
+      message(FATAL_ERROR
+              "${PROJECT_NAME} requires support for CXX flag: ${cxx_flag}.")
+    endif ()
+    set(CMAKE_CXX_FLAGS "${cxx_flag} ${CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
+  endif ()
+endfunction ()
+
+# Checks for support of $flag by both the C and CXX compilers. Terminates
+# generation when support is not present in both compilers.
+function (require_flag flag)
+  require_c_flag(${flag})
+  require_cxx_flag(${flag})
+endfunction ()
+
+# Checks only non-MSVC targets for support of $c_flag and terminates generation
+# when support is not present.
+function (require_c_flag_nomsvc c_flag)
+  if (NOT MSVC)
+    require_c_flag(${c_flag})
+  endif ()
+endfunction ()
+
+# Checks only non-MSVC targets for support of $cxx_flag and terminates
+# generation when support is not present.
+function (require_cxx_flag_nomsvc cxx_flag)
+  if (NOT MSVC)
+    require_cxx_flag(${cxx_flag})
+  endif ()
+endfunction ()
+
+# Checks only non-MSVC targets for support of $flag by both the C and CXX
+# compilers. Terminates generation when support is not present in both
+# compilers.
+function (require_flag_nomsvc flag)
+  require_c_flag_nomsvc(${flag})
+  require_cxx_flag_nomsvc(${flag})
+endfunction ()
+
+# Adds $preproc_def to C compiler command line (as -D$preproc_def) if not
+# already present.
+function (add_c_preproc_definition preproc_def)
+  unset(PREPROC_DEF_FOUND CACHE)
+  string(FIND "${CMAKE_C_FLAGS}" "${preproc_def}" PREPROC_DEF_FOUND)
+
+  if (${PREPROC_DEF_FOUND} EQUAL -1)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${preproc_def}" CACHE STRING ""
+        FORCE)
+  endif ()
+endfunction ()
+
+# Adds $preproc_def to CXX compiler command line (as -D$preproc_def) if not
+# already present.
+function (add_cxx_preproc_definition preproc_def)
+  unset(PREPROC_DEF_FOUND CACHE)
+  string(FIND "${CMAKE_CXX_FLAGS}" "${preproc_def}" PREPROC_DEF_FOUND)
+
+  if (${PREPROC_DEF_FOUND} EQUAL -1)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${preproc_def}" CACHE STRING ""
+        FORCE)
+  endif ()
+endfunction ()
+
+# Adds $preproc_def to C and CXX compiler command line (as -D$preproc_def) if
+# not already present.
+function (add_preproc_definition preproc_def)
+  add_c_preproc_definition(${preproc_def})
+  add_cxx_preproc_definition(${preproc_def})
+endfunction ()