diff options
-rw-r--r-- | include/libcamera/internal/meson.build | 1 | ||||
-rw-r--r-- | include/libcamera/internal/source_paths.h | 19 | ||||
-rw-r--r-- | src/libcamera/meson.build | 1 | ||||
-rw-r--r-- | src/libcamera/source_paths.cpp | 139 | ||||
-rw-r--r-- | src/libcamera/utils.cpp | 111 |
5 files changed, 160 insertions, 111 deletions
diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index f019cfb3..205b36a9 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -39,6 +39,7 @@ libcamera_internal_headers = files([ 'process.h', 'pub_key.h', 'semaphore.h', + 'source_paths.h', 'sysfs.h', 'thread.h', 'timer.h', diff --git a/include/libcamera/internal/source_paths.h b/include/libcamera/internal/source_paths.h new file mode 100644 index 00000000..111c25b0 --- /dev/null +++ b/include/libcamera/internal/source_paths.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * source_paths.h - Identify libcamera source and build paths + */ +#ifndef __LIBCAMERA_INTERNAL_SOURCE_PATHS_H__ +#define __LIBCAMERA_INTERNAL_SOURCE_PATHS_H__ + +#include <string> + +namespace libcamera::utils { + +std::string libcameraBuildPath(); +std::string libcameraSourcePath(); + +} /* namespace libcamera::utils */ + +#endif /* __LIBCAMERA_INTERNAL_SOURCE_PATHS_H__ */ diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index 387d2084..693008d5 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -46,6 +46,7 @@ libcamera_sources = files([ 'request.cpp', 'semaphore.cpp', 'signal.cpp', + 'source_paths.cpp', 'stream.cpp', 'sysfs.cpp', 'thread.cpp', diff --git a/src/libcamera/source_paths.cpp b/src/libcamera/source_paths.cpp new file mode 100644 index 00000000..834b698f --- /dev/null +++ b/src/libcamera/source_paths.cpp @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google Inc. + * + * source_paths.cpp - Identify libcamera source and build paths + */ + +#include "libcamera/internal/source_paths.h" + +#include <dlfcn.h> +#include <elf.h> +#include <link.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include "libcamera/internal/utils.h" + +/** + * \file source_paths.h + * \brief Identify the build and source path of a not-yet-installed library + */ + +/* musl doesn't declare _DYNAMIC in link.h, declare it manually. */ +extern ElfW(Dyn) _DYNAMIC[]; + +namespace libcamera { + +namespace { + +/** + * \brief Check if libcamera is installed or not + * + * Utilise the build_rpath dynamic tag which is stripped out by meson at + * install time to determine at runtime if the library currently executing + * has been installed or not. + * + * \return True if libcamera is installed, false otherwise + */ +bool isLibcameraInstalled() +{ + /* + * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on + * install. + */ + for (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) { + if (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH) + return false; + } + + return true; +} + +} /* namespace */ + +namespace utils { + +/** + * \brief Retrieve the path to the build directory + * + * During development, it is useful to run libcamera binaries directly from the + * build directory without installing them. This function helps components that + * need to locate resources in the build tree, such as IPA modules or IPA proxy + * workers, by providing them with the path to the root of the build directory. + * Callers can then use it to complement or override searches in system-wide + * directories. + * + * If libcamera has been installed, the build directory path is not available + * and this function returns an empty string. + * + * \return The path to the build directory if running from a build, or an empty + * string otherwise + */ +std::string libcameraBuildPath() +{ + if (isLibcameraInstalled()) + return std::string(); + + Dl_info info; + + /* Look up our own symbol. */ + int ret = dladdr(reinterpret_cast<void *>(libcameraBuildPath), &info); + if (ret == 0) + return std::string(); + + std::string path = dirname(info.dli_fname) + "/../../"; + + char *real = realpath(path.c_str(), nullptr); + if (!real) + return std::string(); + + path = real; + free(real); + + return path + "/"; +} + +/** + * \brief Retrieve the path to the source directory + * + * During development, it is useful to run libcamera binaries directly from the + * build directory without installing them. This function helps components that + * need to locate resources in the source tree, such as IPA configuration + * files, by providing them with the path to the root of the source directory. + * Callers can then use it to complement or override searches in system-wide + * directories. + * + * If libcamera has been installed, the source directory path is not available + * and this function returns an empty string. + * + * \return The path to the source directory if running from a build directory, + * or an empty string otherwise + */ +std::string libcameraSourcePath() +{ + std::string path = libcameraBuildPath(); + if (path.empty()) + return std::string(); + + path += "source"; + + char *real = realpath(path.c_str(), nullptr); + if (!real) + return std::string(); + + path = real; + free(real); + + struct stat statbuf; + int ret = stat(path.c_str(), &statbuf); + if (ret < 0 || (statbuf.st_mode & S_IFMT) != S_IFDIR) + return std::string(); + + return path + "/"; +} + +} /* namespace utils */ + +} /* namespace libcamera */ diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp index 49b8fc9e..c7ebef68 100644 --- a/src/libcamera/utils.cpp +++ b/src/libcamera/utils.cpp @@ -7,16 +7,10 @@ #include "libcamera/internal/utils.h" -#include <dlfcn.h> -#include <elf.h> #include <iomanip> -#include <limits.h> -#include <link.h> #include <sstream> #include <stdlib.h> #include <string.h> -#include <sys/stat.h> -#include <sys/types.h> #include <unistd.h> /** @@ -24,9 +18,6 @@ * \brief Miscellaneous utility functions */ -/* musl doesn't declare _DYNAMIC in link.h, declare it manually. */ -extern ElfW(Dyn) _DYNAMIC[]; - namespace libcamera { namespace utils { @@ -352,108 +343,6 @@ std::string toAscii(const std::string &str) } /** - * \brief Check if libcamera is installed or not - * - * Utilise the build_rpath dynamic tag which is stripped out by meson at - * install time to determine at runtime if the library currently executing - * has been installed or not. - * - * \return True if libcamera is installed, false otherwise - */ -bool isLibcameraInstalled() -{ - /* - * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on - * install. - */ - for (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) { - if (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH) - return false; - } - - return true; -} - -/** - * \brief Retrieve the path to the build directory - * - * During development, it is useful to run libcamera binaries directly from the - * build directory without installing them. This function helps components that - * need to locate resources in the build tree, such as IPA modules or IPA proxy - * workers, by providing them with the path to the root of the build directory. - * Callers can then use it to complement or override searches in system-wide - * directories. - * - * If libcamera has been installed, the build directory path is not available - * and this function returns an empty string. - * - * \return The path to the build directory if running from a build, or an empty - * string otherwise - */ -std::string libcameraBuildPath() -{ - if (isLibcameraInstalled()) - return std::string(); - - Dl_info info; - - /* Look up our own symbol. */ - int ret = dladdr(reinterpret_cast<void *>(libcameraBuildPath), &info); - if (ret == 0) - return std::string(); - - std::string path = dirname(info.dli_fname) + "/../../"; - - char *real = realpath(path.c_str(), nullptr); - if (!real) - return std::string(); - - path = real; - free(real); - - return path + "/"; -} - -/** - * \brief Retrieve the path to the source directory - * - * During development, it is useful to run libcamera binaries directly from the - * build directory without installing them. This function helps components that - * need to locate resources in the source tree, such as IPA configuration - * files, by providing them with the path to the root of the source directory. - * Callers can then use it to complement or override searches in system-wide - * directories. - * - * If libcamera has been installed, the source directory path is not available - * and this function returns an empty string. - * - * \return The path to the source directory if running from a build directory, - * or an empty string otherwise - */ -std::string libcameraSourcePath() -{ - std::string path = libcameraBuildPath(); - if (path.empty()) - return std::string(); - - path += "source"; - - char *real = realpath(path.c_str(), nullptr); - if (!real) - return std::string(); - - path = real; - free(real); - - struct stat statbuf; - int ret = stat(path.c_str(), &statbuf); - if (ret < 0 || (statbuf.st_mode & S_IFMT) != S_IFDIR) - return std::string(); - - return path + "/"; -} - -/** * \fn alignDown(unsigned int value, unsigned int alignment) * \brief Align \a value down to \a alignment * \param[in] value The value to align |