[libcamera-devel] [PATCH 02/11] libcamera: utils: Add a function to retrieve the libcamera source tree

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Apr 27 05:17:04 CEST 2020


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 currently leaks the path to the source tree in the
installed binary. The data is put in a separate section named .zero
which will need to be zeroed at installation time to fix this.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 meson.build                   |  2 ++
 src/libcamera/include/utils.h |  1 +
 src/libcamera/utils.cpp       | 37 ++++++++++++++++++++++++++++++++---
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index c6e6a934e54e..2058a6a77ceb 100644
--- a/meson.build
+++ b/meson.build
@@ -26,6 +26,8 @@ libcamera_version = libcamera_git_version.split('+')[0]
 cc = meson.get_compiler('c')
 config_h = configuration_data()
 
+config_h.set('LIBCAMERA_SOURCE_DIR', '"' + meson.current_source_dir() + '"')
+
 if cc.has_header_symbol('execinfo.h', 'backtrace')
     config_h.set('HAVE_BACKTRACE', 1)
 endif
diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
index 242eeded9d50..3334ff16613d 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 97f9b632e45b..056a67e93e0f 100644
--- a/src/libcamera/utils.cpp
+++ b/src/libcamera/utils.cpp
@@ -360,9 +360,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 +386,36 @@ std::string libcameraBuildPath()
 	return dirname(info.dli_fname) + "/../../";
 }
 
+namespace {
+/* \todo Figure out a way to zero this section at install time */
+__attribute__((section(".zero")))
+const char sourceDirectory[] = LIBCAMERA_SOURCE_DIR;
+} /* namespace */
+
+/**
+ * \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, or an empty
+ * string otherwise
+ */
+std::string libcameraSourcePath()
+{
+	if (isLibcameraInstalled())
+		return std::string();
+
+	return std::string(sourceDirectory) + "/";
+}
+
 } /* namespace utils */
 
 } /* namespace libcamera */
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list