[libcamera-devel] [PATCH LIBCAMERA 3/4] libcamera: ipa_proxy: search for proxy in build tree
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Mar 17 21:29:12 CET 2020
Hi Kaaira
On 17/03/2020 17:31, Kaaira Gupta wrote:
> When libcamera is build and tested before installing, it will
s/build/built/
> be unable to locate the path to proxy files,or previously
s/files,or/files, or/
> installed files in the system path may be incorrect to load.
>
> Hence, when libcamera is not installed and running from a build
> tree, identify the location of that tree by finding the path of
> active libcamera.so, and from that point add the relative path to
> the proxy file.
>
> Signed-off-by: Kaaira Gupta <kgupta at es.iitr.ac.in>
> ---
> src/libcamera/ipa_proxy.cpp | 54 +++++++++++++++++++++++++++++++++----
> 1 file changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
> index 363d034..d7c32a1 100644
> --- a/src/libcamera/ipa_proxy.cpp
> +++ b/src/libcamera/ipa_proxy.cpp
> @@ -9,7 +9,9 @@
>
> #include <string.h>
> #include <unistd.h>
> -
> +#include <dlfcn.h>
> +#include <elf.h>
> +#include <link.h>
Aha, we shouldn't need to bring this in here ... I'm sorry - I should
have spotted this in advance and we'll need to move the
isLibcameraInstalled() and libcameraPath() functions into
src/libcamera/utils.cpp
For that extra patch (which would then be patch 3 in the series), we
need to move the two fucntions below to utils.cpp, and add appropriate
doxygen briefs as they are then 'global' functions, and put the function
prototypes into src/libcamera/include/utils.h
At that point, the functions will be in the libcamera utils:: namespace
so we'll have to do a fixup in IPAManager::IPAManager() to call
utils::isLibcameraInstalled()
instead...
And of course as part of the code move, the headers that you had to
bring in here, can be removed from the ipa_manager.cpp file too.
> #include "log.h"
> #include "utils.h"
>
> @@ -20,6 +22,35 @@
> * \brief IPA Proxy
> */
>
> +static bool isLibcameraInstalled()
> +{
> + /* musl doesn't declare _DYNAMIC in link.h, declare it manually. */
> + extern ElfW(Dyn) _DYNAMIC[];
> +
> + /*
> + * 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;
> +}
> +
> +static std::string libcameraPath()
> +{
> + Dl_info info;
> +
> + /* Look up our own symbol. */
> + int ret = dladdr(reinterpret_cast<void *>(libcameraPath), &info);
> + if (ret == 0)
> + return nullptr;
> +
> + return info.dli_fname;
> +}
> +
As described above, isLibcameraInstalled() and libcameraPath() should
become utils::isLibcameraInstalled() and utils::libcameraPath() and then
these do not need to be added here.
> namespace libcamera {
>
> LOG_DEFINE_CATEGORY(IPAProxy)
> @@ -89,10 +120,23 @@ std::string IPAProxy::resolvePath(const std::string &file) const
> }
> }
>
> - /*Try finding the exec target from the install directory.*/
> - std::string proxyPath = std::string(IPA_PROXY_DIR) + proxyFile;
> - if (!access(proxyPath.c_str(), X_OK))
> - return proxyPath;
> + /*
> + *When libcamera is used before it is installed, load proxies from the
> + *same build directory as the libcamera directory itself. This requires
> + *identifying the path of the libcamera.so, and referencing a relative
> + *path for the proxies from that point.
> + */
There should always be a space after the * in a comment to separate the
words from the comment markers.
> + if (!isLibcameraInstalled()){
> + std::string ipaProxyDir = utils::dirname(libcameraPath()) + "/../../proxy";
> +
> + LOG(IPAProxy, Info)
> + << "libcamera is not installed. Adding '"
> + << ipaProxyDir << "' to the Proxy search path";
> +
> + std::string proxyPath = ipaProxyDir + proxyFile;
> + if (!access(proxyPath.c_str(), X_OK))
> + return proxyPath;
> + }
>
The actual additions here are good, and as I expected, so its' just some
whitespace fixes, and to remove the static helpers here so they aren't
duplicated.
> return std::string();
> }
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list