aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Dickens <michael.dickens@ettus.com>2014-08-25 13:29:12 -0400
committerMartin Braun <martin.braun@ettus.com>2014-09-25 13:06:18 -0700
commit2957ca5bbae8c8d15377c478b139627bc88a6962 (patch)
treeda937fa8037d6cae282f38cd1d860ace46c372cc
parent9ac192ef39a42ba2bd86b20314e09072e5f60156 (diff)
downloaduhd-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.txt23
-rw-r--r--host/cmake/Modules/UHDConfig.cmake86
-rw-r--r--host/cmake/Modules/UHDConfigVersion.cmake.in160
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()