Fix bug in gflags' <= 2.1.2 exported CMake configuration.
- gflags <= 2.1.2 has a bug in its exported gflags-config.cmake:
https://github.com/gflags/gflags/issues/110 whereby it sets
gflags_LIBRARIES to a non-existent 'gflags' target.
- This causes linker errors if gflags is installed in a non-standard
location (as otherwise CMake resolves gflags to -lgflags which
links if gflags is installed somewhere on the current path).
- We now check for this case, and search for the correct gflags imported
target and update gflags_LIBRARIES to reference it if found, otherwise
proceed on to the original manual search to try to find gflags.
Change-Id: Iceccc3ee53c7c2010e41cc45255f966e7b13d526
diff --git a/cmake/FindGflags.cmake b/cmake/FindGflags.cmake
index 3f09406..0eefd2f 100644
--- a/cmake/FindGflags.cmake
+++ b/cmake/FindGflags.cmake
@@ -336,6 +336,47 @@
ENDIF(gflags_FOUND)
SET(FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION ${gflags_FOUND})
+
+ # gflags v2.1 - 2.1.2 shipped with a bug in their gflags-config.cmake [1]
+ # whereby gflags_LIBRARIES = "gflags", but there was no imported target
+ # called "gflags", they were called: gflags[_nothreads]-[static/shared].
+ # As this causes linker errors when gflags is not installed in a location
+ # on the current library paths, detect if this problem is present and
+ # fix it.
+ #
+ # [1] https://github.com/gflags/gflags/issues/110
+ IF (gflags_FOUND AND
+ ${gflags_VERSION} VERSION_LESS 2.1.3 AND
+ NOT TARGET ${gflags_LIBRARIES})
+ MESSAGE(STATUS "Detected broken gflags install in: ${gflags_DIR}, "
+ "version: ${gflags_VERSION} <= 2.1.2 which defines gflags_LIBRARIES = "
+ "${gflags_LIBRARIES} which is not an imported CMake target, see: "
+ "https://github.com/gflags/gflags/issues/110. Attempting to fix by "
+ "detecting correct gflags target.")
+ # Ordering here expresses preference for detection, specifically we do not
+ # want to use the _nothreads variants if the full library is available.
+ LIST(APPEND CHECK_GFLAGS_IMPORTED_TARGET_NAMES
+ gflags-shared gflags-static
+ gflags_nothreads-shared gflags_nothreads-static)
+ FOREACH(CHECK_GFLAGS_TARGET ${CHECK_GFLAGS_IMPORTED_TARGET_NAMES})
+ IF (TARGET ${CHECK_GFLAGS_TARGET})
+ MESSAGE(STATUS "Found valid gflags target: ${CHECK_GFLAGS_TARGET}, "
+ "updating gflags_LIBRARIES.")
+ SET(gflags_LIBRARIES ${CHECK_GFLAGS_TARGET})
+ BREAK()
+ ENDIF()
+ ENDFOREACH()
+ IF (NOT TARGET ${gflags_LIBRARIES})
+ MESSAGE(STATUS "Failed to fix detected broken gflags install in: "
+ "${gflags_DIR}, version: ${gflags_VERSION} <= 2.1.2, none of the "
+ "imported targets for gflags: ${CHECK_GFLAGS_IMPORTED_TARGET_NAMES} "
+ "are defined. Will continue with a manual search for gflags "
+ "components. We recommend you build/install a version of gflags > "
+ "2.1.2 (or master).")
+ SET(FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION FALSE)
+ ENDIF()
+ ENDIF()
+
IF (FOUND_INSTALLED_GFLAGS_CMAKE_CONFIGURATION)
MESSAGE(STATUS "Detected gflags version: ${gflags_VERSION}")
SET(GFLAGS_FOUND ${gflags_FOUND})