[libcamera-devel] [PATCH LIBCAMERA v3] libcamera: utils: adapt libcameraPath to match use cases
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Mar 19 14:35:50 CET 2020
Hi Kaaira,
Thank you for the patch.
On Thu, Mar 19, 2020 at 06:12:52PM +0530, Kaaira Gupta wrote:
> The two callers of functions libcameraPath() and isLibcameraInstalled()
> end up using the same process and finally use the path with
> libcamera.so. Hence write a function libcameraBuildPath() which
> combines their functions and returns the root of the build sources
> when the library has not been installed, but is running,thereby making
s/running,/running, /
We don't charge extra for white space :-)
> call sites simpler.
>
> When the library is imstalled, libcameraBuildPath() will return an empty
s/imstalled/installed/
> string.
>
> Make changes in the call sites accordingly.
>
> Signed-off-by: Kaaira Gupta <kgupta at es.iitr.ac.in>
> ---
> Changes since v2:
> - rename subject line and add necessary details in commit
> message.
> - Solve whitespace issues.
> - specify the final 'slash' for directory path in return
> statement itself.
>
> Changes since v1:
> - rename function to libcameraBuildPath() instead, and return
> the root of libcamera source, and not the source directory
> root.
> - Return empty string instead of nullptr when ret==0
>
> src/libcamera/include/utils.h | 2 +-
> src/libcamera/ipa_manager.cpp | 5 +++--
> src/libcamera/ipa_proxy.cpp | 6 +++---
> src/libcamera/utils.cpp | 16 +++++++++-------
> 4 files changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
> index bc96e79..5dea8d2 100644
> --- a/src/libcamera/include/utils.h
> +++ b/src/libcamera/include/utils.h
> @@ -145,7 +145,7 @@ details::StringSplitter split(const std::string &str, const std::string &delim);
>
> bool isLibcameraInstalled();
This function isn't used externally anymore, I would drop it from the
header.
>
> -std::string libcameraPath();
> +std::string libcameraBuildPath();
>
> } /* namespace utils */
>
> diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
> index 0bd280c..bcaae35 100644
> --- a/src/libcamera/ipa_manager.cpp
> +++ b/src/libcamera/ipa_manager.cpp
> @@ -119,8 +119,9 @@ IPAManager::IPAManager()
> * path for the IPA from that point. We need to recurse one level of
> * sub-directories to match the build tree.
> */
> - if (!utils::isLibcameraInstalled()) {
> - std::string ipaBuildPath = utils::dirname(utils::libcameraPath()) + "/../ipa";
> + std::string root = utils::libcameraBuildPath();
> + if (!root.empty()) {
> + std::string ipaBuildPath = root + "src/ipa";
Very neat :-)
> constexpr int maxDepth = 1;
>
> LOG(IPAManager, Info)
> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
> index 2f866cc..5fd88a4 100644
> --- a/src/libcamera/ipa_proxy.cpp
> +++ b/src/libcamera/ipa_proxy.cpp
> @@ -97,9 +97,9 @@ std::string IPAProxy::resolvePath(const std::string &file) const
> * This requires identifying the path of the libcamera.so, and
> * referencing a relative path for the proxy workers from that point.
> */
> - if (!utils::isLibcameraInstalled()) {
> - std::string ipaProxyDir = utils::dirname(utils::libcameraPath())
> - + "/proxy/worker";
> + std::string root = utils::libcameraBuildPath();
> + if (!root.empty()) {
> + std::string ipaProxyDir = root + "src/libcamera/proxy/worker";
>
> LOG(IPAProxy, Info)
> << "libcamera is not installed. Loading proxy workers from'"
> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
> index 7e118fa..42c5c76 100644
> --- a/src/libcamera/utils.cpp
> +++ b/src/libcamera/utils.cpp
> @@ -347,16 +347,18 @@ bool isLibcameraInstalled()
> *
> * \return A string stating the path
> */
> -std::string libcameraPath()
> +std::string libcameraBuildPath()
> {
> - Dl_info info;
> + if (!isLibcameraInstalled()) {
> + Dl_info info;
>
> - /* Look up our own symbol. */
> - int ret = dladdr(reinterpret_cast<void *>(libcameraPath), &info);
> - if (ret == 0)
> - return nullptr;
> + /* Look up our own symbol. */
> + int ret = dladdr(reinterpret_cast<void *>(libcameraBuildPath), &info);
> + if (ret)
> + return dirname(info.dli_fname) + "/../../";
> + }
>
> - return info.dli_fname;
> + return std::string();
Maybe it's my personal preference, but I find code easier to read when
dealing away with errors immediately:
if (isLibcameraInstalled())
return std::string();
Dl_info info;
/* Look up our own symbol. */
int ret = dladdr(reinterpret_cast<void *>(libcameraBuildPath), &info);
if (!ret)
return std::string();
return dirname(info.dli_fname) + "/../../";
This way you can reduce indentation for most of the code that implements
the real logic.
If you're fine with this, I'm sure Kieran can change it while applying.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> }
>
> } /* namespace utils */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list