diff options
author | Michael Dickens <michael.dickens@ettus.com> | 2014-08-25 13:29:12 -0400 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2014-09-25 13:06:18 -0700 |
commit | 2957ca5bbae8c8d15377c478b139627bc88a6962 (patch) | |
tree | da937fa8037d6cae282f38cd1d860ace46c372cc | |
parent | 9ac192ef39a42ba2bd86b20314e09072e5f60156 (diff) | |
download | uhd-2957ca5bbae8c8d15377c478b139627bc88a6962.tar.gz uhd-2957ca5bbae8c8d15377c478b139627bc88a6962.tar.bz2 uhd-2957ca5bbae8c8d15377c478b139627bc88a6962.zip |
cmake: Add in UHDConfig*.cmake files and install them into CMAKE_MODULES_DIR if provided (default value is "lib${LIB_SUFFIX}/cmake/"). Tested to work with GR's new FindUHD.cmake (as a daisy-chained "find_package(UHD ...)") as well as directly.
-rw-r--r-- | host/CMakeLists.txt | 23 | ||||
-rw-r--r-- | host/cmake/Modules/UHDConfig.cmake | 86 | ||||
-rw-r--r-- | host/cmake/Modules/UHDConfigVersion.cmake.in | 160 |
3 files changed, 269 insertions, 0 deletions
diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt index 9baebdb11..933e38f4a 100644 --- a/host/CMakeLists.txt +++ b/host/CMakeLists.txt @@ -279,6 +279,29 @@ IF(NOT LIBUHD_PKG AND NOT UHDHOST_PKG) ENDIF(NOT LIBUHD_PKG AND NOT UHDHOST_PKG) ######################################################################## +# Create and Install UHD cmake files +######################################################################## +IF(NOT CMAKE_MODULES_DIR) + SET(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake) +ENDIF(NOT CMAKE_MODULES_DIR) + +configure_file( + ${CMAKE_SOURCE_DIR}/cmake/Modules/UHDConfigVersion.cmake.in + ${CMAKE_BINARY_DIR}/cmake/Modules/UHDConfigVersion.cmake +@ONLY) + +SET(cmake_configs + ${CMAKE_SOURCE_DIR}/cmake/Modules/UHDConfig.cmake + ${CMAKE_BINARY_DIR}/cmake/Modules/UHDConfigVersion.cmake +) + +INSTALL( + FILES ${cmake_configs} + DESTINATION ${CMAKE_MODULES_DIR}/uhd + COMPONENT library +) + +######################################################################## # Handle pre-built images ######################################################################## IF(DEFINED UHD_IMAGES_DIR AND EXISTS "${UHD_IMAGES_DIR}") diff --git a/host/cmake/Modules/UHDConfig.cmake b/host/cmake/Modules/UHDConfig.cmake new file mode 100644 index 000000000..f68bc2f1e --- /dev/null +++ b/host/cmake/Modules/UHDConfig.cmake @@ -0,0 +1,86 @@ +# +# Copyright 2014 Ettus Research LLC +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +######################################################################## +# +# Find the header <uhd/config.hpp> and library "libuhd" for the USRP +# Hardware Driver. Priorty for prefix search is: +# 1) ENV(UHD_DIR) +# 2) pkg-config results, if available; +# 3) CMAKE_INSTALL_PREFIX +# 4) /usr/local/ +# 5) /usr/ +# +# Version info is handled by UHDConfigVersion.cmake only; not here. +# +######################################################################## + +SET(UHD_FOUND TRUE) +SET(UHD_INCLUDE_HINTS) +SET(UHD_LIBDIR_HINTS) +SET(UHD_DIR $ENV{UHD_DIR}) + +IF(UHD_DIR) + LIST(APPEND UHD_INCLUDE_HINTS ${UHD_DIR}/include) + LIST(APPEND UHD_LIBDIR_HINTS ${UHD_DIR}/lib) +ENDIF() + +INCLUDE(FindPkgConfig) +IF(PKG_CONFIG_FOUND) + IF(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.0") + SET(UHD_QUIET "QUIET") + ENDIF() + PKG_CHECK_MODULES(PC_UHD ${UHD_QUIET} uhd) + IF(PC_UHD_FOUND) + LIST(APPEND UHD_INCLUDE_HINTS ${PC_UHD_INCLUDEDIR}) + LIST(APPEND UHD_LIBDIR_HINTS ${PC_UHD_LIBDIR}) + ENDIF() +ENDIF() + +LIST(APPEND UHD_INCLUDE_HINTS ${CMAKE_INSTALL_PREFIX}/include) +LIST(APPEND UHD_LIBDIR_HINTS ${CMAKE_INSTALL_PREFIX}/lib) + +# Verify that <uhd/config.hpp> and libuhd are available, and, if a +# version is provided, that UHD meets the version requirements -- no +# matter what pkg-config might think. + +FIND_PATH( + UHD_INCLUDE_DIRS + NAMES uhd/config.hpp + HINTS ${UHD_INCLUDE_HINTS} + PATHS /usr/local/include + /usr/include +) + +FIND_LIBRARY( + UHD_LIBRARIES + NAMES uhd + HINTS ${UHD_LIBDIR_HINTS} + PATHS /usr/local/lib + /usr/lib +) + +IF(UHD_LIBRARIES AND UHD_INCLUDE_DIRS) + + INCLUDE(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(UHD DEFAULT_MSG UHD_LIBRARIES UHD_INCLUDE_DIRS) + MARK_AS_ADVANCED(UHD_LIBRARIES UHD_INCLUDE_DIRS) + +ELSEIF(UHD_FIND_REQUIRED) + + MESSAGE(FATAL_ERROR "UHD is required, but was not found.") + +ENDIF() diff --git a/host/cmake/Modules/UHDConfigVersion.cmake.in b/host/cmake/Modules/UHDConfigVersion.cmake.in new file mode 100644 index 000000000..d9b30a7e2 --- /dev/null +++ b/host/cmake/Modules/UHDConfigVersion.cmake.in @@ -0,0 +1,160 @@ +# +# Copyright 2014 Ettus Research LLC +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +######################################################################## +# When "find_package" is provided with UHD and a version, this file is +# called to try to determine if the requested version matches that +# provided by this UHD install. All version checking is done herein. +######################################################################## + +# version values as set in cmake/Modules/UHDVersion.cmake, placed +# statically in here to avoid using Python all over again. + +SET(MAJOR_VERSION @TRIMMED_VERSION_MAJOR@) +SET(MINOR_VERSION @TRIMMED_VERSION_MINOR@) +SET(PATCH_VERSION @TRIMMED_VERSION_PATCH@) + +SET(PACKAGE_VERSION @TRIMMED_UHD_VERSION@) + +# There is a bug in CMake whereby calling "find_package(FOO)" within +# "find_package(FOO)" results in the version being checked in the +# second version no matter if it was set. To get around this, check +# "PACKAGE_FIND_VERSION" and if empty set return variables to TRUE to +# make CMake happy. Not the best solution, but it does the trick. + +IF(NOT PACKAGE_FIND_VERSION) + SET(PACKAGE_VERSION_COMPATIBLE TRUE) + SET(PACKAGE_VERSION_EXACT TRUE) + RETURN() +ENDIF(NOT PACKAGE_FIND_VERSION) + +# assume incorrect versioning by default +SET(PACKAGE_VERSION_COMPATIBLE FALSE) +SET(PACKAGE_VERSION_EXACT FALSE) + +# do not use ABI for now +SET(UHD_USE_ABI FALSE) + +# leave the ABI checking in, for now, just in case it is wanted in the +# future. This code works nicely to find the ABI compatibility +# version from <uhd/version.hpp>. +IF(UHD_USE_ABI) + + # find ABI compatible version from <uhd/version.hpp> + + SET(UHD_INCLUDE_HINTS) + SET(UHD_DIR $ENV{UHD_DIR}) + + IF(UHD_DIR) + LIST(APPEND UHD_INCLUDE_HINTS ${UHD_DIR}/include) + ENDIF() + + INCLUDE(FindPkgConfig) + IF(PKG_CONFIG_FOUND) + IF(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.0") + SET(UHD_QUIET "QUIET") + ENDIF() + IF(PACKAGE_VERSION_EXACT) + PKG_CHECK_MODULES(PC_UHD ${UHD_QUIET} uhd=${UHD_FIND_VERSION}) + ELSE() + PKG_CHECK_MODULES(PC_UHD ${UHD_QUIET} uhd>=${UHD_FIND_VERSION}) + ENDIF() + IF(PC_UHD_FOUND) + LIST(APPEND UHD_INCLUDE_HINTS ${PC_UHD_INCLUDEDIR}) + ENDIF() + ENDIF() + + LIST(APPEND UHD_INCLUDE_HINTS ${CMAKE_INSTALL_PREFIX}/include) + + # Verify that <uhd/config.hpp> and libuhd are available, and, if a + # version is provided, that UHD meets the version requirements -- no + # matter what pkg-config might think. + + FIND_PATH( + UHD_INCLUDE_DIR + NAMES uhd/version.hpp + HINTS ${UHD_INCLUDE_HINTS} + PATHS /usr/local/include + /usr/include + ) + + IF(UHD_INCLUDE_DIR) + + # extract the UHD API version from the installed header + + FILE(STRINGS "${UHD_INCLUDE_DIR}/uhd/version.hpp" + UHD_STRING_VERSION REGEX "UHD_VERSION_ABI_STRING") + STRING(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" + UHD_ABI_VERSION_CONCISE ${UHD_STRING_VERSION}) + + # convert UHD_FIND_VERSION into concise #.#.# format for comparison + + STRING(REGEX REPLACE "([^\\.]*)\\.([^\\.]*)\\.([^\\.]*)" + "\\1.\\2.\\3" UHD_ABI_VERSION_TMP ${UHD_ABI_VERSION_CONCISE}) + + STRING(REPLACE "0" "" UHD_ABI_MAJOR ${CMAKE_MATCH_1}) + STRING(REPLACE "0" "" UHD_ABI_MINOR ${CMAKE_MATCH_2}) + STRING(REPLACE "0" "" UHD_ABI_PATCH ${CMAKE_MATCH_3}) + + # fix the case where the version number is "000" + + IF(NOT UHD_ABI_MAJOR) + SET(UHD_ABI_MAJOR "0") + ENDIF() + IF(NOT UHD_ABI_MINOR) + SET(UHD_ABI_MINOR "0") + ENDIF() + IF(NOT UHD_ABI_PATCH) + SET(UHD_ABI_PATCH "0") + ENDIF() + + SET(UHD_ABI_VERSION_CONCISE ${UHD_ABI_MAJOR}.${UHD_ABI_MINOR}.${UHD_ABI_PATCH}) + + ELSE(UHD_INCLUDE_DIR) + + # no header found ... not a good sign! Assume ABI version is the + # same as that known internally here. Let UHDConfig.cmake fail if + # it cannot find <uhd/config.hpp> or "libuhd" ... + + SET(UHD_ABI_VERSION_CONCISE ${PACKAGE_VERSION}) + + ENDIF(UHD_INCLUDE_DIR) + + # check for ABI compatibility, both: + # ACTUAL VERSION >= DESIRED VERSION >= ABI VERSION + + IF(NOT ${PACKAGE_FIND_VERSION} VERSION_LESS ${UHD_ABI_VERSION_CONCISE} AND + NOT ${PACKAGE_FIND_VERSION} VERSION_GREATER ${PACKAGE_VERSION}) + SET(PACKAGE_VERSION_COMPATIBLE TRUE) + ENDIF() + +ELSE(UHD_USE_ABI) + + # use API only, and assume compatible of requested <= actual + # which is the same as "not >" + + IF(NOT ${PACKAGE_FIND_VERSION} VERSION_GREATER ${PACKAGE_VERSION}) + SET(PACKAGE_VERSION_COMPATIBLE TRUE) + ENDIF() + +ENDIF(UHD_USE_ABI) + +# check for exact version + +IF(${PACKAGE_FIND_VERSION} VERSION_EQUAL ${PACKAGE_VERSION}) + SET(PACKAGE_VERSION_EXACT TRUE) +ENDIF() |