[{"id":4069,"web_url":"https://patchwork.libcamera.org/comment/4069/","msgid":"<20200318122541.GE4733@pendragon.ideasonboard.com>","date":"2020-03-18T12:25:41","subject":"Re: [libcamera-devel] [PATCH LIBCAMERA v3 3/6] libcamera: utils:\n\tadd Libcamera installed & path","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kaaira,\n\nThank you for the patch.\n\nOn Wed, Mar 18, 2020 at 05:28:43PM +0530, Kaaira Gupta wrote:\n> Add a global functions 'isLibcameraInstalled' to check if libcamera is\n> installed or not, and another global function 'libcameraPath' to return\n> the path of libcamera.so in utils.\n> \n> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>\n> ---\n>  src/libcamera/include/utils.h |  4 +++\n>  src/libcamera/utils.cpp       | 48 +++++++++++++++++++++++++++++++++++\n>  2 files changed, 52 insertions(+)\n> \n> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h\n> index 9405977..bc96e79 100644\n> --- a/src/libcamera/include/utils.h\n> +++ b/src/libcamera/include/utils.h\n> @@ -143,6 +143,10 @@ private:\n>  \n>  details::StringSplitter split(const std::string &str, const std::string &delim);\n>  \n> +bool isLibcameraInstalled();\n> +\n> +std::string libcameraPath();\n> +\n>  } /* namespace utils */\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp\n> index f566e88..aeaf163 100644\n> --- a/src/libcamera/utils.cpp\n> +++ b/src/libcamera/utils.cpp\n> @@ -12,12 +12,18 @@\n>  #include <stdlib.h>\n>  #include <string.h>\n>  #include <unistd.h>\n> +#include <dlfcn.h>\n> +#include <elf.h>\n> +#include <link.h>\n\nCould you please keep headers alphabetically sorted ? The header order\nis explained in section \"Order of Includes\" of\nDocumentation/coding-style.rst.\n\n>  \n>  /**\n>   * \\file utils.h\n>   * \\brief Miscellaneous utility functions\n>   */\n>  \n> +/* musl doesn't declare _DYNAMIC in link.h, declare it manually. */\n> +extern ElfW(Dyn) _DYNAMIC[];\n> +\n>  namespace libcamera {\n>  \n>  namespace utils {\n> @@ -310,6 +316,48 @@ details::StringSplitter split(const std::string &str, const std::string &delim)\n>  \treturn details::StringSplitter(str, delim);\n>  }\n>  \n> +/**\n> + * \\brief Checks if Libcamera is installed or not\n\ns/Checks/Check/\n\n(We use the imperative mood for \\brief statements through the code)\n\nand\n\ns/Libcamera/libcamera/\n\n\"libcamera\" is spelled in lower case, with the exception of symbols in\nthe code where the camelCase rule forces usage of \"Libcamera\".\n\n> + *\n> + * Utilises the build_rpath dynamic tag which is stripped out by meson at\n\ns/Utilises/Utilise/ or \"This function utilises ...\".\n\n> + * install time to determine at runtime if the library currently executing\n> + * has been installed or not.\n> + *\n> + * \\return A bool stating if libcamera is installed or not\n\nThe usual documentation style would be\n\n * \\return True if libcamera is installed, false otherwise\n\n> + */\n> +bool isLibcameraInstalled()\n> +{\n> +\t/*\n> +\t * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on\n> +\t * install.\n> +\t */\n> +\tfor (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) {\n> +\t\tif (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH)\n> +\t\t\treturn false;\n> +\t}\n> +\n> +\treturn true;\n> +}\n> +\n> +/**\n> + * \\brief Identifies libcamera path\n\nMaybe \"Identify the libcamera.so path\" ?\n\n> + *\n> + * Identifies the location by finding the path of the active libcamera.so itself.\n\nPlease wrap lines at the 80 columns limit when possible. We have a 120\ncolumns hard limit and a 80 columns soft limit.\n\n\"Path\" is a bit ambiguous I think, as it's not clear if it includes\n\"libcamera.so\" at the end or not. How about clarifying this with\n\n * This function locates the running libcamera.so and returns its full\n * path, including the file name.\n\n> + *\n> + * \\return A string stating the path.\n\nTo match the documentation style of the rest of libcamera, no period is\nneeded at tne end.\n\n> + */\n> +std::string libcameraPath()\n> +{\n> +\tDl_info info;\n> +\n> +\t/* Look up our own symbol. */\n> +\tint ret = dladdr(reinterpret_cast<void *>(libcameraPath), &info);\n> +\tif (ret == 0)\n> +\t\treturn nullptr;\n> +\n> +\treturn info.dli_fname;\n> +}\n\nI wonder if we should merge the two functions into a\nlibcameraBuildPath() that would return an empty string if libcamera is\ninstalled and the path (with the libcamera.so) otherwise, as that's what\nall callers end up doing. This can be done on top of this series if\ndesired. Kieran, any opinion ?\n\n> +\n>  } /* namespace utils */\n>  \n>  } /* namespace libcamera */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6AD6060418\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Mar 2020 13:25:47 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C458AF9;\n\tWed, 18 Mar 2020 13:25:46 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584534347;\n\tbh=digjQWC7s2VnU31KuDsRTDSKCrH1GSby2jqZad1mBHQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=cUlmPGrcWfakMbCAoDVu9pg2s35hlW7f+s3qYYypVL+/MeFkhWgtHWR5wWWJQe2oa\n\tlfYKST7/0ySF9ih0MFZAjC7tlUmP9Djl9Cvqs/bM7/8kai20Gr2XgFfODyUZyghUSv\n\t5MOIS6jXeOxz3Sh69I+qr9JCI97RqQCu1yBjI0tw=","Date":"Wed, 18 Mar 2020 14:25:41 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kaaira Gupta <kgupta@es.iitr.ac.in>","Cc":"Helen Koike <helen.koike@collabora.com>,\n\tVaishali Thakkar <vthakkar@vaishalithakkar.in>,\n\tkieran.bingham@ideasonboard.com, libcamera-devel@lists.libcamera.org","Message-ID":"<20200318122541.GE4733@pendragon.ideasonboard.com>","References":"<20200318115846.7975-1-kgupta@es.iitr.ac.in>\n\t<20200318115846.7975-4-kgupta@es.iitr.ac.in>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200318115846.7975-4-kgupta@es.iitr.ac.in>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH LIBCAMERA v3 3/6] libcamera: utils:\n\tadd Libcamera installed & path","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Wed, 18 Mar 2020 12:25:47 -0000"}},{"id":4076,"web_url":"https://patchwork.libcamera.org/comment/4076/","msgid":"<448e3e0b-1634-b007-cc88-2195f036ad55@ideasonboard.com>","date":"2020-03-18T13:07:12","subject":"Re: [libcamera-devel] [PATCH LIBCAMERA v3 3/6] libcamera: utils:\n\tadd Libcamera installed & path","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Kaaira,\n\nLooks like Laurent beat me to the review while I was testing, so I'll\nlet you work through his comments.\n\nSmall additional comment here that the $SUBJECT also has a 'Libcamera'\nreference which should be 'libcamera' to match the style used elsewhere.\n\nand going below for the question to me...\n\nOn 18/03/2020 12:25, Laurent Pinchart wrote:\n> Hi Kaaira,\n> \n> Thank you for the patch.\n> \n> On Wed, Mar 18, 2020 at 05:28:43PM +0530, Kaaira Gupta wrote:\n>> Add a global functions 'isLibcameraInstalled' to check if libcamera is\n>> installed or not, and another global function 'libcameraPath' to return\n>> the path of libcamera.so in utils.\n>>\n>> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>\n>> ---\n>>  src/libcamera/include/utils.h |  4 +++\n>>  src/libcamera/utils.cpp       | 48 +++++++++++++++++++++++++++++++++++\n>>  2 files changed, 52 insertions(+)\n>>\n>> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h\n>> index 9405977..bc96e79 100644\n>> --- a/src/libcamera/include/utils.h\n>> +++ b/src/libcamera/include/utils.h\n>> @@ -143,6 +143,10 @@ private:\n>>  \n>>  details::StringSplitter split(const std::string &str, const std::string &delim);\n>>  \n>> +bool isLibcameraInstalled();\n>> +\n>> +std::string libcameraPath();\n>> +\n>>  } /* namespace utils */\n>>  \n>>  } /* namespace libcamera */\n>> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp\n>> index f566e88..aeaf163 100644\n>> --- a/src/libcamera/utils.cpp\n>> +++ b/src/libcamera/utils.cpp\n>> @@ -12,12 +12,18 @@\n>>  #include <stdlib.h>\n>>  #include <string.h>\n>>  #include <unistd.h>\n>> +#include <dlfcn.h>\n>> +#include <elf.h>\n>> +#include <link.h>\n> \n> Could you please keep headers alphabetically sorted ? The header order\n> is explained in section \"Order of Includes\" of\n> Documentation/coding-style.rst.\n> \n>>  \n>>  /**\n>>   * \\file utils.h\n>>   * \\brief Miscellaneous utility functions\n>>   */\n>>  \n>> +/* musl doesn't declare _DYNAMIC in link.h, declare it manually. */\n>> +extern ElfW(Dyn) _DYNAMIC[];\n>> +\n>>  namespace libcamera {\n>>  \n>>  namespace utils {\n>> @@ -310,6 +316,48 @@ details::StringSplitter split(const std::string &str, const std::string &delim)\n>>  \treturn details::StringSplitter(str, delim);\n>>  }\n>>  \n>> +/**\n>> + * \\brief Checks if Libcamera is installed or not\n> \n> s/Checks/Check/\n> \n> (We use the imperative mood for \\brief statements through the code)\n> \n> and\n> \n> s/Libcamera/libcamera/\n> \n> \"libcamera\" is spelled in lower case, with the exception of symbols in\n> the code where the camelCase rule forces usage of \"Libcamera\".\n> \n>> + *\n>> + * Utilises the build_rpath dynamic tag which is stripped out by meson at\n> \n> s/Utilises/Utilise/ or \"This function utilises ...\".\n> \n>> + * install time to determine at runtime if the library currently executing\n>> + * has been installed or not.\n>> + *\n>> + * \\return A bool stating if libcamera is installed or not\n> \n> The usual documentation style would be\n> \n>  * \\return True if libcamera is installed, false otherwise\n> \n>> + */\n>> +bool isLibcameraInstalled()\n>> +{\n>> +\t/*\n>> +\t * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on\n>> +\t * install.\n>> +\t */\n>> +\tfor (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) {\n>> +\t\tif (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH)\n>> +\t\t\treturn false;\n>> +\t}\n>> +\n>> +\treturn true;\n>> +}\n>> +\n>> +/**\n>> + * \\brief Identifies libcamera path\n> \n> Maybe \"Identify the libcamera.so path\" ?\n> \n>> + *\n>> + * Identifies the location by finding the path of the active libcamera.so itself.\n> \n> Please wrap lines at the 80 columns limit when possible. We have a 120\n> columns hard limit and a 80 columns soft limit.\n> \n> \"Path\" is a bit ambiguous I think, as it's not clear if it includes\n> \"libcamera.so\" at the end or not. How about clarifying this with\n> \n>  * This function locates the running libcamera.so and returns its full\n>  * path, including the file name.\n> \n>> + *\n>> + * \\return A string stating the path.\n> \n> To match the documentation style of the rest of libcamera, no period is\n> needed at tne end.\n> \n>> + */\n>> +std::string libcameraPath()\n>> +{\n>> +\tDl_info info;\n>> +\n>> +\t/* Look up our own symbol. */\n>> +\tint ret = dladdr(reinterpret_cast<void *>(libcameraPath), &info);\n>> +\tif (ret == 0)\n>> +\t\treturn nullptr;\n>> +\n>> +\treturn info.dli_fname;\n>> +}\n> \n> I wonder if we should merge the two functions into a\n> libcameraBuildPath() that would return an empty string if libcamera is\n> installed and the path (with the libcamera.so) otherwise, as that's what\n> all callers end up doing. This can be done on top of this series if\n> desired. Kieran, any opinion ?\n\nIt might indeed make sense, but I'm happy to do it on top, so we don't\nover complicate this series.\n\n--\nKieran\n\n\n>> +\n>>  } /* namespace utils */\n>>  \n>>  } /* namespace libcamera */\n>","headers":{"Return-Path":"<kieran.bingham@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CF8BB60418\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Mar 2020 14:07:16 +0100 (CET)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 136D6AC0;\n\tWed, 18 Mar 2020 14:07:16 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584536836;\n\tbh=YhhcDQsbOaxzryJ33H08+slKuSreB27UcAnxRgDDNIE=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=DoJbHUD62ab/rXAPklfFsmj4W3GlvvLe93if239Dkmvddvv4D9Y851FfCkI9sUFJY\n\t7l/PhiiwkiSXOtIQO+84DR/iiuVQf42SdCrzkkjPf30Y4EdBndcO6VBs7izKlVtJPN\n\tkCyXpBTwmEQMAE2cIa2071q71ru+LATJlPkH8vz4=","Reply-To":"kieran.bingham@ideasonboard.com","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tKaaira Gupta <kgupta@es.iitr.ac.in>","Cc":"Helen Koike <helen.koike@collabora.com>,\n\tVaishali Thakkar <vthakkar@vaishalithakkar.in>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20200318115846.7975-1-kgupta@es.iitr.ac.in>\n\t<20200318115846.7975-4-kgupta@es.iitr.ac.in>\n\t<20200318122541.GE4733@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Openpgp":"preference=signencrypt","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<448e3e0b-1634-b007-cc88-2195f036ad55@ideasonboard.com>","Date":"Wed, 18 Mar 2020 13:07:12 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101\n\tThunderbird/60.9.1","MIME-Version":"1.0","In-Reply-To":"<20200318122541.GE4733@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH LIBCAMERA v3 3/6] libcamera: utils:\n\tadd Libcamera installed & path","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Wed, 18 Mar 2020 13:07:17 -0000"}}]