diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-04-27 05:29:29 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-04-28 01:54:34 +0300 |
commit | cc15ab43161b805bade5220e2769908d4ceefeff (patch) | |
tree | a9ec6feaac0377c14a7541b7ec58fd6fddd5d13d | |
parent | 6e1cd1394e5d73dfd4c4334cbf8beee79072de21 (diff) |
libcamera: utils: Add a function to retrieve the libcamera source tree
Similarly to libcameraBuildPath(), there's a need to locate resources
within the source tree when running libcamera without installing it.
Support this use case with a new utils::libcameraSourcePath() function.
The implementation uses a symlink from the build root to the source root
in order to avoid hardcoding the path to the source root in the
libcamera.so binary.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r-- | meson.build | 6 | ||||
-rw-r--r-- | src/libcamera/include/utils.h | 1 | ||||
-rw-r--r-- | src/libcamera/utils.cpp | 49 |
3 files changed, 53 insertions, 3 deletions
diff --git a/meson.build b/meson.build index c6e6a934..9fc5cc52 100644 --- a/meson.build +++ b/meson.build @@ -93,6 +93,12 @@ if get_option('test') subdir('test') endif +# Create a symlink from the build root to the source root. This is used when +# running libcamera from the build directory to locate resources in the source +# directory (such as IPA configuration files). +run_command('ln', '-fsT', meson.source_root(), + join_paths(meson.build_root(), 'source')) + configure_file(output : 'config.h', configuration : config_h) pkg_mod = import('pkgconfig') diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h index 242eeded..3334ff16 100644 --- a/src/libcamera/include/utils.h +++ b/src/libcamera/include/utils.h @@ -188,6 +188,7 @@ private: details::StringSplitter split(const std::string &str, const std::string &delim); std::string libcameraBuildPath(); +std::string libcameraSourcePath(); } /* namespace utils */ diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp index 97f9b632..a96ca7f4 100644 --- a/src/libcamera/utils.cpp +++ b/src/libcamera/utils.cpp @@ -10,10 +10,13 @@ #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> /** @@ -360,9 +363,10 @@ bool isLibcameraInstalled() * * 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, 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. + * 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. @@ -385,6 +389,45 @@ std::string libcameraBuildPath() return dirname(info.dli_fname) + "/../../"; } +/** + * \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 */ |