Commit f9e69b35 authored by Andreas Schuh's avatar Andreas Schuh

Merge pull request #140 from schuhschuh/enh-#117-gflags-subproject-support

These changes improve the CMakeLists.txt of the gflags project to make CMake variables configurable via command-line option -D or super-project settings. Moreover, gflags related variables are only added to the CMake cache when the gflags project is configured as a standalone project. When it is a subproject (cf. #117), the super-project is responsible for setting the configuration variables.

This change set also changes the names of the (exported) target names to gflags[_nothreads]_(static|shared) and the CMake (package) configuration variable names to start with an uppercase prefix "GFLAGS_".
parents e50698c2 7a21c16f
...@@ -15,3 +15,4 @@ CMakeFiles/ ...@@ -15,3 +15,4 @@ CMakeFiles/
/test/gflags_unittest_main.cc /test/gflags_unittest_main.cc
/test/gflags_unittest-main.cc /test/gflags_unittest-main.cc
/packages/ /packages/
CMakeLists.txt.user
This diff is collapsed.
## gflags CMake configuration file ## gflags CMake configuration file
# library version information # library version information
set (@PACKAGE_NAME@_VERSION_STRING "@PACKAGE_VERSION@") set (@PACKAGE_PREFIX@_VERSION_STRING "@PACKAGE_VERSION@")
set (@PACKAGE_NAME@_VERSION_MAJOR @PACKAGE_VERSION_MAJOR@) set (@PACKAGE_PREFIX@_VERSION_MAJOR @PACKAGE_VERSION_MAJOR@)
set (@PACKAGE_NAME@_VERSION_MINOR @PACKAGE_VERSION_MINOR@) set (@PACKAGE_PREFIX@_VERSION_MINOR @PACKAGE_VERSION_MINOR@)
set (@PACKAGE_NAME@_VERSION_PATCH @PACKAGE_VERSION_PATCH@) set (@PACKAGE_PREFIX@_VERSION_PATCH @PACKAGE_VERSION_PATCH@)
# import targets # import targets
include ("${CMAKE_CURRENT_LIST_DIR}/@PACKAGE_NAME@-export.cmake") include ("${CMAKE_CURRENT_LIST_DIR}/@PACKAGE_NAME@-targets.cmake")
# installation prefix # installation prefix
get_filename_component (CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) get_filename_component (CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
...@@ -18,94 +18,151 @@ get_filename_component (_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_DIR}/@INSTALL_PREF ...@@ -18,94 +18,151 @@ get_filename_component (_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_DIR}/@INSTALL_PREF
# Newer versions of CMake set the INTERFACE_INCLUDE_DIRECTORIES property # Newer versions of CMake set the INTERFACE_INCLUDE_DIRECTORIES property
# of the imported targets. It is hence not necessary to add this path # of the imported targets. It is hence not necessary to add this path
# manually to the include search path for targets which link to gflags. # manually to the include search path for targets which link to gflags.
set (@PACKAGE_NAME@_INCLUDE_DIR "${_INSTALL_PREFIX}/@INCLUDE_INSTALL_DIR@") set (@PACKAGE_PREFIX@_INCLUDE_DIR "${_INSTALL_PREFIX}/@INCLUDE_INSTALL_DIR@")
# default settings if (@PACKAGE_NAME@_FIND_COMPONENTS)
if (NOT DEFINED @PACKAGE_NAME@_SHARED) foreach (@PACKAGE_NAME@_FIND_COMPONENT IN LISTS @PACKAGE_NAME@_FIND_COMPONENTS)
if (TARGET @PACKAGE_NAME@-static OR TARGET @PACKAGE_NAME@_nothreads-static) if (@PACKAGE_NAME@_FIND_REQUIRED_${@PACKAGE_NAME@_FIND_COMPONENT} AND NOT TARGET @PACKAGE_NAME@_${@PACKAGE_NAME@_FIND_COMPONENT})
set (@PACKAGE_NAME@_SHARED FALSE) message (FATAL_ERROR "Package @PACKAGE_NAME@ was installed without required component ${@PACKAGE_NAME@_FIND_COMPONENT}!")
endif ()
endforeach ()
list (GET @PACKAGE_NAME@_FIND_COMPONENTS 0 @PACKAGE_NAME@_FIND_COMPONENT)
else ()
set (@PACKAGE_NAME@_FIND_COMPONENT)
endif ()
# default settings of @PACKAGE_PREFIX@_SHARED and @PACKAGE_PREFIX@_NOTHREADS
#
# It is recommended to use either one of the following find_package commands
# instead of setting the @PACKAGE_PREFIX@_(SHARED|NOTHREADS) variables:
# - find_package(@PACKAGE_NAME@ REQUIRED)
# - find_package(@PACKAGE_NAME@ COMPONENTS nothreads_static)
# - find_package(@PACKAGE_NAME@ COMPONENTS nothreads_shared)
# - find_package(@PACKAGE_NAME@ COMPONENTS static)
# - find_package(@PACKAGE_NAME@ COMPONENTS shared)
if (NOT DEFINED @PACKAGE_PREFIX@_SHARED)
if (DEFINED @PACKAGE_NAME@_SHARED)
set (@PACKAGE_PREFIX@_SHARED ${@PACKAGE_NAME@_SHARED})
elseif (@PACKAGE_NAME@_FIND_COMPONENT)
if (@PACKAGE_NAME@_FIND_COMPONENT MATCHES "shared")
set (@PACKAGE_PREFIX@_SHARED TRUE)
else ()
set (@PACKAGE_PREFIX@_SHARED FALSE)
endif ()
elseif (TARGET @PACKAGE_NAME@_shared OR TARGET @PACKAGE_NAME@_nothreads_shared)
set (@PACKAGE_PREFIX@_SHARED TRUE)
else () else ()
set (@PACKAGE_NAME@_SHARED TRUE) set (@PACKAGE_PREFIX@_SHARED FALSE)
endif () endif ()
endif () endif ()
if (NOT DEFINED @PACKAGE_NAME@_NOTHREADS) if (NOT DEFINED @PACKAGE_PREFIX@_NOTHREADS)
if (TARGET @PACKAGE_NAME@-static OR TARGET @PACKAGE_NAME@-shared) if (DEFINED @PACKAGE_NAME@_NOTHREADS)
set (@PACKAGE_NAME@_NOTHREADS FALSE) set (@PACKAGE_PREFIX@_NOTHREADS ${@PACKAGE_NAME@_NOTHREADS})
elseif (@PACKAGE_NAME@_FIND_COMPONENT)
if (@PACKAGE_NAME@_FIND_COMPONENT MATCHES "nothreads")
set (@PACKAGE_PREFIX@_NOTHREADS TRUE)
else ()
set (@PACKAGE_PREFIX@_NOTHREADS FALSE)
endif ()
elseif (TARGET @PACKAGE_NAME@_static OR TARGET @PACKAGE_NAME@_shared)
set (@PACKAGE_PREFIX@_NOTHREADS FALSE)
else () else ()
set (@PACKAGE_NAME@_NOTHREADS TRUE) set (@PACKAGE_PREFIX@_NOTHREADS TRUE)
endif () endif ()
endif () endif ()
# choose imported library target # choose imported library target
if (NOT @PACKAGE_NAME@_TARGET) if (NOT @PACKAGE_PREFIX@_TARGET)
if (@PACKAGE_NAME@_SHARED) if (@PACKAGE_NAME@_TARGET)
if (@PACKAGE_NAME@_NOTHREADS) set (@PACKAGE_PREFIX@_TARGET ${@PACKAGE_NAME@_TARGET})
set (@PACKAGE_NAME@_TARGET @PACKAGE_NAME@_nothreads-shared) elseif (@PACKAGE_PREFIX@_SHARED)
if (@PACKAGE_PREFIX@_NOTHREADS)
set (@PACKAGE_PREFIX@_TARGET @PACKAGE_NAME@_nothreads_shared)
else () else ()
set (@PACKAGE_NAME@_TARGET @PACKAGE_NAME@-shared) set (@PACKAGE_PREFIX@_TARGET @PACKAGE_NAME@_shared)
endif () endif ()
else () else ()
if (@PACKAGE_NAME@_NOTHREADS) if (@PACKAGE_PREFIX@_NOTHREADS)
set (@PACKAGE_NAME@_TARGET @PACKAGE_NAME@_nothreads-static) set (@PACKAGE_PREFIX@_TARGET @PACKAGE_NAME@_nothreads_static)
else () else ()
set (@PACKAGE_NAME@_TARGET @PACKAGE_NAME@-static) set (@PACKAGE_PREFIX@_TARGET @PACKAGE_NAME@_static)
endif () endif ()
endif () endif ()
endif () endif ()
if (NOT TARGET ${@PACKAGE_NAME@_TARGET}) if (NOT TARGET ${@PACKAGE_PREFIX@_TARGET})
message (FATAL_ERROR "Your @PACKAGE_NAME@ installation does not contain a ${@PACKAGE_NAME@_TARGET} library target!" message (FATAL_ERROR "Your @PACKAGE_NAME@ installation does not contain a ${@PACKAGE_PREFIX@_TARGET} library target!"
" Try a different combination of @PACKAGE_NAME@_SHARED and @PACKAGE_NAME@_NOTHREADS.") " Try a different combination of @PACKAGE_PREFIX@_SHARED and @PACKAGE_PREFIX@_NOTHREADS.")
endif () endif ()
# add more convenient "@PACKAGE_NAME@" import target # add more convenient "@PACKAGE_NAME@" import target
if (NOT TARGET @PACKAGE_NAME@) if (NOT TARGET @PACKAGE_NAME@)
if (@PACKAGE_NAME@_SHARED) if (@PACKAGE_PREFIX@_SHARED)
add_library (@PACKAGE_NAME@ SHARED IMPORTED) add_library (@PACKAGE_NAME@ SHARED IMPORTED)
else () else ()
add_library (@PACKAGE_NAME@ STATIC IMPORTED) add_library (@PACKAGE_NAME@ STATIC IMPORTED)
endif () endif ()
# INTERFACE_INCLUDE_DIRECTORIES # copy INTERFACE_* properties
get_target_property (_@PACKAGE_NAME@_INCLUDES ${@PACKAGE_NAME@_TARGET} INTERFACE_INCLUDE_DIRECTORIES) foreach (_@PACKAGE_PREFIX@_PROPERTY_NAME IN ITEMS
if (_@PACKAGE_NAME@_INCLUDES) COMPILE_DEFINITIONS
set_target_properties(@PACKAGE_NAME@ PROPERTIES COMPILE_FEATURES
INTERFACE_INCLUDE_DIRECTORIES "${_@PACKAGE_NAME@_INCLUDES}" COMPILE_OPTIONS
) INCLUDE_DIRECTORIES
endif () LINK_LIBRARIES
unset (_@PACKAGE_NAME@_INCLUDES) POSITION_INDEPENDENT_CODE
# set configuration specific properties )
get_target_property (_@PACKAGE_NAME@_CONFIGURATIONS ${@PACKAGE_NAME@_TARGET} IMPORTED_CONFIGURATIONS) get_target_property (_@PACKAGE_PREFIX@_PROPERTY_VALUE ${@PACKAGE_PREFIX@_TARGET} INTERFACE_${_@PACKAGE_PREFIX@_PROPERTY_NAME})
set_target_properties (@PACKAGE_NAME@ PROPERTIES IMPORTED_CONFIGURATIONS "${_@PACKAGE_NAME@_CONFIGURATIONS}") if (_@PACKAGE_PREFIX@_PROPERTY_VALUE)
foreach (_@PACKAGE_NAME@_CONFIG IN LISTS _@PACKAGE_NAME@_CONFIGURATIONS)
# IMPORTED_LOCATION_<config>
get_target_property (_@PACKAGE_NAME@_LOCATION ${@PACKAGE_NAME@_TARGET} IMPORTED_LOCATION_${_@PACKAGE_NAME@_CONFIG})
if (_@PACKAGE_NAME@_LOCATION)
set_target_properties(@PACKAGE_NAME@ PROPERTIES set_target_properties(@PACKAGE_NAME@ PROPERTIES
IMPORTED_LOCATION_${_@PACKAGE_NAME@_CONFIG} "${_@PACKAGE_NAME@_LOCATION}" INTERFACE_${_@PACKAGE_PREFIX@_PROPERTY_NAME} "${_@PACKAGE_PREFIX@_PROPERTY_VALUE}"
) )
endif () endif ()
unset (_@PACKAGE_NAME@_LOCATION)
# IMPORTED_LINK_INTERFACE_LANGUAGES_<config> (static)
get_target_property (_@PACKAGE_NAME@_LANGUAGES ${@PACKAGE_NAME@_TARGET} IMPORTED_LINK_INTERFACE_LANGUAGES_${_@PACKAGE_NAME@_CONFIG})
if (_@PACKAGE_NAME@_LANGUAGES)
set_target_properties(@PACKAGE_NAME@ PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_${_@PACKAGE_NAME@_CONFIG} "${_@PACKAGE_NAME@_LANGUAGES}"
)
endif ()
unset (_@PACKAGE_NAME@_LANGUAGES)
# IMPORTED_SONAME_<config> (shared)
get_target_property (_@PACKAGE_NAME@_SONAME ${@PACKAGE_NAME@_TARGET} IMPORTED_SONAME_${_@PACKAGE_NAME@_CONFIG})
if (_@PACKAGE_NAME@_SONAME)
set_target_properties(@PACKAGE_NAME@ PROPERTIES
IMPORTED_SONAME_${_@PACKAGE_NAME@_CONFIG} "${_@PACKAGE_NAME@_SONAME}"
)
endif ()
unset (_@PACKAGE_NAME@_SONAME)
endforeach () endforeach ()
unset (_@PACKAGE_NAME@_CONFIGURATIONS) # copy IMPORTED_*_<CONFIG> properties
get_target_property (_@PACKAGE_PREFIX@_CONFIGURATIONS ${@PACKAGE_PREFIX@_TARGET} IMPORTED_CONFIGURATIONS)
set_target_properties (@PACKAGE_NAME@ PROPERTIES IMPORTED_CONFIGURATIONS "${_@PACKAGE_PREFIX@_CONFIGURATIONS}")
foreach (_@PACKAGE_PREFIX@_PROPERTY_NAME IN ITEMS
LOCATION
LINK_DEPENDENT_LIBRARIES
LINK_INTERFACE_LIBRARIES
LINK_INTERFACE_LANGUAGES
LINK_INTERFACE_MULTIPLICITY
NO_SONAME
SONAME
)
foreach (_@PACKAGE_PREFIX@_CONFIG IN LISTS _@PACKAGE_PREFIX@_CONFIGURATIONS)
get_target_property (_@PACKAGE_PREFIX@_PROPERTY_VALUE ${@PACKAGE_PREFIX@_TARGET} IMPORTED_${_@PACKAGE_PREFIX@_PROPERTY_NAME}_${_@PACKAGE_PREFIX@_CONFIG})
if (_@PACKAGE_PREFIX@_PROPERTY_VALUE)
set_target_properties(@PACKAGE_NAME@ PROPERTIES
IMPORTED_${_@PACKAGE_PREFIX@_PROPERTY_NAME}_${_@PACKAGE_PREFIX@_CONFIG} "${_@PACKAGE_PREFIX@_PROPERTY_VALUE}"
)
endif ()
endforeach ()
endforeach ()
unset (_@PACKAGE_PREFIX@_CONFIGURATIONS)
unset (_@PACKAGE_PREFIX@_CONFIG)
unset (_@PACKAGE_PREFIX@_PROPERTY_NAME)
unset (_@PACKAGE_PREFIX@_PROPERTY_VALUE)
endif () endif ()
# alias for default import target to be compatible with older CMake package configurations # alias for default import target to be compatible with older CMake package configurations
set (@PACKAGE_NAME@_LIBRARIES "${@PACKAGE_NAME@_TARGET}") set (@PACKAGE_PREFIX@_LIBRARIES "${@PACKAGE_PREFIX@_TARGET}")
# set @PACKAGE_NAME@_* variables for backwards compatibility
if (NOT "^@PACKAGE_NAME@$" STREQUAL "^@PACKAGE_PREFIX@$")
foreach (_@PACKAGE_PREFIX@_VARIABLE IN ITEMS
VERSION_STRING
VERSION_MAJOR
VERSION_MINOR
VERSION_PATCH
INCLUDE_DIR
LIBRARIES
TARGET
)
set (@PACKAGE_NAME@_${_@PACKAGE_PREFIX@_VARIABLE} "${@PACKAGE_PREFIX@_${_@PACKAGE_PREFIX@_VARIABLE}}")
endforeach ()
unset (_@PACKAGE_PREFIX@_VARIABLE)
endif ()
# unset private variables # unset private variables
unset (@PACKAGE_NAME@_FIND_COMPONENT)
unset (_INSTALL_PREFIX) unset (_INSTALL_PREFIX)
...@@ -11,7 +11,7 @@ macro (bool_to_int VAR) ...@@ -11,7 +11,7 @@ macro (bool_to_int VAR)
endmacro () endmacro ()
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
## Extract version numbers from version string. ## Extract version numbers from version string
function (version_numbers version major minor patch) function (version_numbers version major minor patch)
if (version MATCHES "([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(rc[1-9][0-9]*|[a-z]+)?") if (version MATCHES "([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(rc[1-9][0-9]*|[a-z]+)?")
if (CMAKE_MATCH_1) if (CMAKE_MATCH_1)
...@@ -41,6 +41,73 @@ function (version_numbers version major minor patch) ...@@ -41,6 +41,73 @@ function (version_numbers version major minor patch)
set ("${patch}" "${_patch}" PARENT_SCOPE) set ("${patch}" "${_patch}" PARENT_SCOPE)
endfunction () endfunction ()
# ----------------------------------------------------------------------------
## Determine if cache entry exists
macro (gflags_is_cached retvar varname)
if (DEFINED ${varname})
get_property (${retvar} CACHE ${varname} PROPERTY TYPE SET)
else ()
set (${retvar} FALSE)
endif ()
endmacro ()
# ----------------------------------------------------------------------------
## Add gflags configuration variable
#
# The default value of the (cached) configuration value can be overridden either
# on the CMake command-line or the super-project by setting the GFLAGS_<varname>
# variable. When gflags is a subproject of another project (GFLAGS_IS_SUBPROJECT),
# the variable is not added to the CMake cache. Otherwise it is cached.
macro (gflags_define type varname docstring default)
if (ARGC GREATER 5)
message (FATAL_ERROR "gflags_variable: Too many macro arguments")
endif ()
if (NOT DEFINED GFLAGS_${varname})
if (GFLAGS_IS_SUBPROJECT AND ARGC EQUAL 5)
set (GFLAGS_${varname} "${ARGV4}")
else ()
set (GFLAGS_${varname} "${default}")
endif ()
endif ()
if (GFLAGS_IS_SUBPROJECT)
if (NOT DEFINED ${varname})
set (${varname} "${GFLAGS_${varname}}")
endif ()
else ()
set (${varname} "${GFLAGS_${varname}}" CACHE ${type} "${docstring}")
endif ()
endmacro ()
# ----------------------------------------------------------------------------
## Set property of cached gflags configuration variable
macro (gflags_property varname property value)
gflags_is_cached (_cached ${varname})
if (_cached)
if (property STREQUAL ADVANCED)
if (${value})
mark_as_advanced (FORCE ${varname})
else ()
mark_as_advanced (CLEAR ${varname})
endif ()
else ()
set_property (CACHE ${varname} PROPERTY "${property}" "${value}")
endif ()
endif ()
unset (_cached)
endmacro ()
# ----------------------------------------------------------------------------
## Modify value of gflags configuration variable
macro (gflags_set varname value)
gflags_is_cached (_cached ${varname})
if (_cached)
set_property (CACHE ${varname} PROPERTY VALUE "${value}")
else ()
set (${varname} "${value}")
endif ()
unset (_cached)
endmacro ()
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
## Configure public header files ## Configure public header files
function (configure_headers out) function (configure_headers out)
......
...@@ -22,9 +22,9 @@ else () ...@@ -22,9 +22,9 @@ else ()
set (type static) set (type static)
endif () endif ()
if (BUILD_gflags_LIB) if (BUILD_gflags_LIB)
link_libraries (gflags-${type}) link_libraries (gflags_${type})
else () else ()
link_libraries (gflags_nothreads-${type}) link_libraries (gflags_nothreads_${type})
endif () endif ()
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
......
## gflags negative compilation tests ## gflags negative compilation tests
cmake_minimum_required (VERSION 2.8) cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
if (NOT TEST_NAME) if (NOT TEST_NAME)
message (FATAL_ERROR "Missing TEST_NAME CMake flag") message (FATAL_ERROR "Missing TEST_NAME CMake flag")
...@@ -13,4 +13,4 @@ find_package (gflags REQUIRED) ...@@ -13,4 +13,4 @@ find_package (gflags REQUIRED)
include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/..") include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/..")
add_definitions (-DTEST_${TEST_NAME_UPPER}) add_definitions (-DTEST_${TEST_NAME_UPPER})
add_executable (gflags_${TEST_NAME} gflags_nc.cc) add_executable (gflags_${TEST_NAME} gflags_nc.cc)
target_link_libraries(gflags_${TEST_NAME} ${gflags_LIBRARIES}) target_link_libraries(gflags_${TEST_NAME} gflags)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment