Enhance usability when encountering Eigen version mismatches

Change-Id: I78fae5be517e3ee4756ea3ce448c1173c39857d6
diff --git a/cmake/CeresConfig.cmake.in b/cmake/CeresConfig.cmake.in
index bd959dc..5f583a7 100644
--- a/cmake/CeresConfig.cmake.in
+++ b/cmake/CeresConfig.cmake.in
@@ -145,9 +145,22 @@
 SET(CERES_EIGEN_VERSION @EIGEN_VERSION@)
 # Append the locations of Eigen when Ceres was built to the search path hints.
 LIST(APPEND EIGEN_INCLUDE_DIR_HINTS @EIGEN_INCLUDE_DIR@)
-# Search quietly s/t we control the timing of the error message if not found.
-FIND_PACKAGE(Eigen ${CERES_EIGEN_VERSION} EXACT QUIET)
+# Search quietly to control the timing of the error message if not found. The
+# search should be for an exact match, but for usability reasons do a soft
+# match and reject with an explanation below.
+FIND_PACKAGE(Eigen ${CERES_EIGEN_VERSION} QUIET)
 IF (EIGEN_FOUND)
+  IF (NOT EIGEN_VERSION VERSION_EQUAL CERES_EIGEN_VERSION)
+    # CMake's VERSION check in FIND_PACKAGE() will accept any version >= the
+    # specified version. However, only version = is supported. Improve
+    # usability by explaining why we don't accept non-exact version matching.
+    CERES_REPORT_NOT_FOUND("Found Eigen dependency, but the version of Eigen "
+      "found (${EIGEN_VERSION}) does not exactly match the version of Eigen "
+      "Ceres was compiled with (${CERES_EIGEN_VERSION}). This can cause subtle "
+      "bugs by triggering violations of the One Definition Rule. See the "
+      "Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule "
+      "for more details")
+  ENDIF ()
   MESSAGE(STATUS "Found required Ceres dependency: "
     "Eigen version ${CERES_EIGEN_VERSION} in ${EIGEN_INCLUDE_DIRS}")
 ELSE (EIGEN_FOUND)