[libcamera-devel] [PATCH 05/16] libcamera: Separate source and build path helpers

Hirokazu Honda hiroh at chromium.org
Fri Jun 25 05:22:07 CEST 2021


Hi Kieran, thank you for the patch.

On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
<kieran.bingham at ideasonboard.com> wrote:
>
> The libcameraSourcePath and libcameraBuildPath helper functions are
> internal and specific to libcamera needs while operating with the meson
> build system.
>
> In preparation for the upcoming move of utils to a common library, move
> these helpers out of utils and into their own build unit.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
>  include/libcamera/internal/meson.build    |   1 +
>  include/libcamera/internal/source-paths.h |  19 ++++
>  src/libcamera/meson.build                 |   1 +
>  src/libcamera/source-paths.cpp            | 129 ++++++++++++++++++++++
>  src/libcamera/utils.cpp                   | 102 -----------------
>  5 files changed, 150 insertions(+), 102 deletions(-)
>  create mode 100644 include/libcamera/internal/source-paths.h
>  create mode 100644 src/libcamera/source-paths.cpp
>
> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
> index f019cfb3b0de..e5088177fe8e 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',

According to coding style guide
(https://libcamera.org/coding-style.html), there is no rule about a
file name.
But it seems like we use the snake case for file names. So,
source_paths.h and source_paths.cpp?

>      '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 000000000000..2591ebb1081b
> --- /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 387d20843203..e792094f5798 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 000000000000..b39f5f853e39
> --- /dev/null
> +++ b/src/libcamera/source-paths.cpp
> @@ -0,0 +1,129 @@
> +/* 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 <sys/stat.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::utils {
> +
> +/**
> + * \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;
> +}
> +

isLIbcameraInstalled() should be put in anonymous namespace as it is
used only in .cc file.

With these nits,
Reviewed-by: Hirokazu Honda<hiroh at chromium.org>
> +/**
> + * \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 libcamera::utils */
> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
> index 49b8fc9e211f..42f82d6158dd 100644
> --- a/src/libcamera/utils.cpp
> +++ b/src/libcamera/utils.cpp
> @@ -351,108 +351,6 @@ std::string toAscii(const std::string &str)
>         return ret;
>  }
>
> -/**
> - * \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
> --
> 2.30.2
>


More information about the libcamera-devel mailing list