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

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Jun 25 11:57:32 CEST 2021


Hi Hiro,

On 25/06/2021 04:22, Hirokazu Honda wrote:
> 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?

Ohhh good spot.

Indeed, all other file names use _ instead of -.

I always prefer the look of '-' ... hence automatically using it ;S

But I will change this now.


> 
>>      '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.

Yes, absolutely, I've updated that too.

Thanks!

> 
> 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