From 2a87970a9ca5bf98c555ad216c551263663fedcc Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 9 Aug 2010 11:24:08 -0700 Subject: uhd: created library code to handle paths for images and modules - read from environment variable paths - utility functions to get paths and search for images - modified load modules to call the utility functions - added private header constants.hpp to contain cmake variables of interest - modified version.cpp to use this constants file --- host/lib/CMakeLists.txt | 8 ++-- host/lib/constants.hpp.in | 28 +++++++++++ host/lib/utils/CMakeLists.txt | 1 + host/lib/utils/load_modules.cpp | 55 ++++----------------- host/lib/utils/paths.cpp | 103 ++++++++++++++++++++++++++++++++++++++++ host/lib/version.cpp | 23 +++++++++ host/lib/version.cpp.in | 22 --------- 7 files changed, 169 insertions(+), 71 deletions(-) create mode 100644 host/lib/constants.hpp.in create mode 100644 host/lib/utils/paths.cpp create mode 100644 host/lib/version.cpp delete mode 100644 host/lib/version.cpp.in (limited to 'host/lib') diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index 25a2b168f..48cfe742e 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -54,14 +54,16 @@ INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/utils/CMakeLists.txt) # Append to the list of sources for lib uhd ######################################################################## CONFIGURE_FILE( - ${CMAKE_CURRENT_SOURCE_DIR}/version.cpp.in - ${CMAKE_CURRENT_BINARY_DIR}/version.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/constants.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/constants.hpp @ONLY) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) LIBUHD_APPEND_SOURCES( + ${CMAKE_CURRENT_BINARY_DIR}/constants.hpp ${CMAKE_CURRENT_SOURCE_DIR}/device.cpp ${CMAKE_CURRENT_SOURCE_DIR}/types.cpp - ${CMAKE_CURRENT_BINARY_DIR}/version.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/version.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wax.cpp ) diff --git a/host/lib/constants.hpp.in b/host/lib/constants.hpp.in new file mode 100644 index 000000000..295c8f16c --- /dev/null +++ b/host/lib/constants.hpp.in @@ -0,0 +1,28 @@ +// +// Copyright 2010 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 . +// + +#ifndef INCLUDED_LIBUHD_CONSTANTS_HPP +#define INCLUDED_LIBUHD_CONSTANTS_HPP + +#include +#include + +static const std::string UHD_VERSION_STRING = "@CPACK_PACKAGE_VERSION@"; +static const std::string UHD_INSTALL_PREFIX = "@CMAKE_INSTALL_PREFIX@"; +static const std::string UHD_PKG_DATA_DIR = "@PKG_DATA_DIR@"; + +#endif /* INCLUDED_LIBUHD_CONSTANTS_HPP */ diff --git a/host/lib/utils/CMakeLists.txt b/host/lib/utils/CMakeLists.txt index 23580d12a..68945545a 100644 --- a/host/lib/utils/CMakeLists.txt +++ b/host/lib/utils/CMakeLists.txt @@ -80,6 +80,7 @@ LIBUHD_APPEND_SOURCES( ${CMAKE_SOURCE_DIR}/lib/utils/assert.cpp ${CMAKE_SOURCE_DIR}/lib/utils/gain_group.cpp ${CMAKE_SOURCE_DIR}/lib/utils/load_modules.cpp + ${CMAKE_SOURCE_DIR}/lib/utils/paths.cpp ${CMAKE_SOURCE_DIR}/lib/utils/props.cpp ${CMAKE_SOURCE_DIR}/lib/utils/thread_priority.cpp ${CMAKE_SOURCE_DIR}/lib/utils/warning.cpp diff --git a/host/lib/utils/load_modules.cpp b/host/lib/utils/load_modules.cpp index dbb8d0695..623d31eb6 100644 --- a/host/lib/utils/load_modules.cpp +++ b/host/lib/utils/load_modules.cpp @@ -18,13 +18,12 @@ #include #include #include -#include #include -#include #include #include +#include +#include -namespace po = boost::program_options; namespace fs = boost::filesystem; /*********************************************************************** @@ -32,7 +31,6 @@ namespace fs = boost::filesystem; **********************************************************************/ #if defined(HAVE_DLFCN_H) #include -static const std::string env_path_sep = ":"; static void load_module(const std::string &file_name){ if (dlopen(file_name.c_str(), RTLD_LAZY) == NULL){ @@ -44,7 +42,6 @@ static void load_module(const std::string &file_name){ #elif defined(HAVE_WINDOWS_H) #include -static const std::string env_path_sep = ";"; static void load_module(const std::string &file_name){ if (LoadLibrary(file_name.c_str()) == NULL){ @@ -55,7 +52,6 @@ static void load_module(const std::string &file_name){ } #else -static const std::string env_path_sep = ":"; static void load_module(const std::string &file_name){ throw std::runtime_error(str( @@ -74,9 +70,9 @@ static void load_module(const std::string &file_name){ * Does not throw, prints to std error. * \param path the filesystem path */ -static void load_path(const fs::path &path){ +static void load_module_path(const fs::path &path){ if (not fs::exists(path)){ - std::cerr << boost::format("Module path \"%s\" not found.") % path.file_string() << std::endl; + //std::cerr << boost::format("Module path \"%s\" not found.") % path.file_string() << std::endl; return; } @@ -87,7 +83,7 @@ static void load_path(const fs::path &path){ dir_itr != fs::directory_iterator(); ++dir_itr ){ - load_path(dir_itr->path()); + load_module_path(dir_itr->path()); } return; } @@ -101,46 +97,13 @@ static void load_path(const fs::path &path){ } } -//! The string constant for the module path environment variable -static const std::string MODULE_PATH_KEY = "UHD_MODULE_PATH"; +std::vector get_module_paths(void); //defined in paths.cpp /*! - * Name mapper function for the environment variable parser. - * Map environment variable names (that we use) to option names. - * \param the variable name - * \return the option name or blank string - */ -static std::string name_mapper(const std::string &var_name){ - if (var_name == MODULE_PATH_KEY) return var_name; - return ""; -} - -/*! - * Load all the modules given by the module path enviroment variable. - * The path variable may be several paths split by path separators. + * Load all the modules given in the module paths. */ UHD_STATIC_BLOCK(load_modules){ - //register the options - std::string env_module_path; - po::options_description desc("UHD Module Options"); - desc.add_options() - (MODULE_PATH_KEY.c_str(), po::value(&env_module_path)->default_value("")) - ; - - //parse environment variables - po::variables_map vm; - po::store(po::parse_environment(desc, &name_mapper), vm); - po::notify(vm); - - if (env_module_path == "") return; - //std::cout << "env_module_path: " << env_module_path << std::endl; - - //split the path at the path separators - std::vector module_paths; - boost::split(module_paths, env_module_path, boost::is_any_of(env_path_sep)); - - //load modules in each path - BOOST_FOREACH(const std::string &module_path, module_paths){ - load_path(fs::system_complete(fs::path(module_path))); + BOOST_FOREACH(const fs::path &path, get_module_paths()){ + load_module_path(path); } } diff --git a/host/lib/utils/paths.cpp b/host/lib/utils/paths.cpp new file mode 100644 index 000000000..0805a44fe --- /dev/null +++ b/host/lib/utils/paths.cpp @@ -0,0 +1,103 @@ +// +// Copyright 2010 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 . +// + +#include "constants.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace po = boost::program_options; +namespace fs = boost::filesystem; + +/*********************************************************************** + * Determine the paths separator + **********************************************************************/ +#ifdef UHD_PLATFORM_WIN32 + static const std::string env_path_sep = ";"; +#else + static const std::string env_path_sep = ":"; +#endif /*UHD_PLATFORM_WIN32*/ + +/*********************************************************************** + * Get a list of paths for an environment variable + **********************************************************************/ +static std::string name_mapper(const std::string &key, const std::string &var_name){ + return (var_name == key)? var_name : ""; +} + +static std::vector get_env_paths(const std::string &var_name){ + //register the options + std::string var_value; + po::options_description desc; + desc.add_options() + (var_name.c_str(), po::value(&var_value)->default_value("")) + ; + + //parse environment variables + po::variables_map vm; + po::store(po::parse_environment(desc, boost::bind(&name_mapper, var_name, _1)), vm); + po::notify(vm); + + //split the path at the path separators + std::vector path_strings; + boost::split(path_strings, var_value, boost::is_any_of(env_path_sep)); + + //convert to filesystem path, filter blank paths + std::vector paths; + BOOST_FOREACH(std::string &path_string, path_strings){ + if (path_string.size() == 0) continue; + paths.push_back(fs::system_complete(path_string)); + } + return paths; +} + +/*********************************************************************** + * Get a list of special purpose paths + **********************************************************************/ +static const fs::path pkg_data_path = fs::path(UHD_INSTALL_PREFIX) / UHD_PKG_DATA_DIR; + +std::vector get_image_paths(void){ + std::vector paths = get_env_paths("UHD_IMAGE_PATH"); + paths.push_back(pkg_data_path / "images"); + return paths; +} + +std::vector get_module_paths(void){ + std::vector paths = get_env_paths("UHD_MODULE_PATH"); + paths.push_back(pkg_data_path / "modules"); + return paths; +} + +/*********************************************************************** + * Find a image in the image paths + **********************************************************************/ +std::string find_image_path(const std::string &image_name){ + if (fs::exists(image_name)){ + return fs::system_complete(image_name).file_string(); + } + BOOST_FOREACH(const fs::path &path, get_image_paths()){ + fs::path image_path = path / image_name; + if (fs::exists(image_path)) return image_path.file_string(); + } + throw std::runtime_error("Could not find path for image: " + image_name); +} diff --git a/host/lib/version.cpp b/host/lib/version.cpp new file mode 100644 index 000000000..5edbca09b --- /dev/null +++ b/host/lib/version.cpp @@ -0,0 +1,23 @@ +// +// Copyright 2010 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 . +// + +#include "constants.hpp" +#include + +std::string uhd::get_version_string(void){ + return UHD_VERSION_STRING; +} diff --git a/host/lib/version.cpp.in b/host/lib/version.cpp.in deleted file mode 100644 index f3a5afc45..000000000 --- a/host/lib/version.cpp.in +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright 2010 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 . -// - -#include - -std::string uhd::get_version_string(void){ - return "@CPACK_PACKAGE_VERSION@"; -} -- cgit v1.2.3