[libcamera-devel] utils: ipu3: Include libgen.h for basename()
diff mbox series

Message ID 20221202132706.15675-1-jacopo@jmondi.org
State Changes Requested
Headers show
Series
  • [libcamera-devel] utils: ipu3: Include libgen.h for basename()
Related show

Commit Message

Jacopo Mondi Dec. 2, 2022, 1:27 p.m. UTC
The "basename" function from the standard C library is defined in the
libgen.h header.

Include it to avoid errors triggered by -Wimplicit-function-declaration

../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 utils/ipu3/ipu3-pack.c   | 1 +
 utils/ipu3/ipu3-unpack.c | 1 +
 2 files changed, 2 insertions(+)

Comments

Umang Jain Dec. 2, 2022, 1:33 p.m. UTC | #1
Hello,

Thank you for the patch

On 12/2/22 9:27 PM, Jacopo Mondi via libcamera-devel wrote:
> The "basename" function from the standard C library is defined in the
> libgen.h header.
>
> Include it to avoid errors triggered by -Wimplicit-function-declaration
>
> ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>

> ---
>   utils/ipu3/ipu3-pack.c   | 1 +
>   utils/ipu3/ipu3-unpack.c | 1 +
>   2 files changed, 2 insertions(+)
>
> diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> index decbfc6c397a..27af44068956 100644
> --- a/utils/ipu3/ipu3-pack.c
> +++ b/utils/ipu3/ipu3-pack.c
> @@ -8,6 +8,7 @@
>   
>   #include <errno.h>
>   #include <fcntl.h>
> +#include <libgen.h>
>   #include <stdint.h>
>   #include <stdio.h>
>   #include <string.h>
> diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> index 9d2c1200d932..aa67e0b0ecf5 100644
> --- a/utils/ipu3/ipu3-unpack.c
> +++ b/utils/ipu3/ipu3-unpack.c
> @@ -8,6 +8,7 @@
>   
>   #include <errno.h>
>   #include <fcntl.h>
> +#include <libgen.h>
>   #include <stdint.h>
>   #include <stdio.h>
>   #include <string.h>
Laurent Pinchart Dec. 2, 2022, 1:33 p.m. UTC | #2
Hi Jacopo,

Thank you for the patch.

On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> The "basename" function from the standard C library is defined in the
> libgen.h header.
> 
> Include it to avoid errors triggered by -Wimplicit-function-declaration
> 
> ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  utils/ipu3/ipu3-pack.c   | 1 +
>  utils/ipu3/ipu3-unpack.c | 1 +
>  2 files changed, 2 insertions(+)
> 
> diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> index decbfc6c397a..27af44068956 100644
> --- a/utils/ipu3/ipu3-pack.c
> +++ b/utils/ipu3/ipu3-pack.c
> @@ -8,6 +8,7 @@
>  
>  #include <errno.h>
>  #include <fcntl.h>
> +#include <libgen.h>
>  #include <stdint.h>
>  #include <stdio.h>
>  #include <string.h>
> diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> index 9d2c1200d932..aa67e0b0ecf5 100644
> --- a/utils/ipu3/ipu3-unpack.c
> +++ b/utils/ipu3/ipu3-unpack.c
> @@ -8,6 +8,7 @@
>  
>  #include <errno.h>
>  #include <fcntl.h>
> +#include <libgen.h>
>  #include <stdint.h>
>  #include <stdio.h>
>  #include <string.h>
Jacopo Mondi Dec. 2, 2022, 1:48 p.m. UTC | #3
Not really...

I get with clang

../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
   21 |         printf("Usage: %s input-file output-file\n", basename(argv0));

Sorry, I should have tested before, but it seemed trivial.

I now wonder what 'basename' we were calling, or better, to which
function prototype we were referring to, which didn't trigger such
error...

On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > The "basename" function from the standard C library is defined in the
> > libgen.h header.
> >
> > Include it to avoid errors triggered by -Wimplicit-function-declaration
> >
> > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> >
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> > ---
> >  utils/ipu3/ipu3-pack.c   | 1 +
> >  utils/ipu3/ipu3-unpack.c | 1 +
> >  2 files changed, 2 insertions(+)
> >
> > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > index decbfc6c397a..27af44068956 100644
> > --- a/utils/ipu3/ipu3-pack.c
> > +++ b/utils/ipu3/ipu3-pack.c
> > @@ -8,6 +8,7 @@
> >
> >  #include <errno.h>
> >  #include <fcntl.h>
> > +#include <libgen.h>
> >  #include <stdint.h>
> >  #include <stdio.h>
> >  #include <string.h>
> > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > index 9d2c1200d932..aa67e0b0ecf5 100644
> > --- a/utils/ipu3/ipu3-unpack.c
> > +++ b/utils/ipu3/ipu3-unpack.c
> > @@ -8,6 +8,7 @@
> >
> >  #include <errno.h>
> >  #include <fcntl.h>
> > +#include <libgen.h>
> >  #include <stdint.h>
> >  #include <stdio.h>
> >  #include <string.h>
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Dec. 2, 2022, 1:59 p.m. UTC | #4
On Fri, Dec 02, 2022 at 02:48:27PM +0100, Jacopo Mondi wrote:
> Not really...
> 
> I get with clang
> 
> ../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
>    21 |         printf("Usage: %s input-file output-file\n", basename(argv0));
> 
> Sorry, I should have tested before, but it seemed trivial.
> 
> I now wonder what 'basename' we were calling, or better, to which
> function prototype we were referring to, which didn't trigger such
> error...

From libgen.h:

/* Return final component of PATH.

   This is the weird XPG version of this function.  It sometimes will
   modify its argument.  Therefore we normally use the GNU version (in
   <string.h>) and only if this header is included make the XPG
   version available under the real name.  */
extern char *__xpg_basename (char *__path) __THROW;
#define basename        __xpg_basename

So we're using the string.h version. The basename manpage mentions

NOTES
       There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after

               #define _GNU_SOURCE         /* See feature_test_macros(7) */
               #include <string.h>

       The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/".  There is  no  GNU  version  of
       dirname().

       With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.

We have utils::basename() to support different libc versions, but we
can't use it in utils/. Have you encountered this when compiling for
Android ? Maybe we can disable compilation of those utilities instead ?

> On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> > Hi Jacopo,
> >
> > Thank you for the patch.
> >
> > On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > The "basename" function from the standard C library is defined in the
> > > libgen.h header.
> > >
> > > Include it to avoid errors triggered by -Wimplicit-function-declaration
> > >
> > > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> > >
> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >
> > > ---
> > >  utils/ipu3/ipu3-pack.c   | 1 +
> > >  utils/ipu3/ipu3-unpack.c | 1 +
> > >  2 files changed, 2 insertions(+)
> > >
> > > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > > index decbfc6c397a..27af44068956 100644
> > > --- a/utils/ipu3/ipu3-pack.c
> > > +++ b/utils/ipu3/ipu3-pack.c
> > > @@ -8,6 +8,7 @@
> > >
> > >  #include <errno.h>
> > >  #include <fcntl.h>
> > > +#include <libgen.h>
> > >  #include <stdint.h>
> > >  #include <stdio.h>
> > >  #include <string.h>
> > > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > > index 9d2c1200d932..aa67e0b0ecf5 100644
> > > --- a/utils/ipu3/ipu3-unpack.c
> > > +++ b/utils/ipu3/ipu3-unpack.c
> > > @@ -8,6 +8,7 @@
> > >
> > >  #include <errno.h>
> > >  #include <fcntl.h>
> > > +#include <libgen.h>
> > >  #include <stdint.h>
> > >  #include <stdio.h>
> > >  #include <string.h>
Jacopo Mondi Dec. 2, 2022, 2:15 p.m. UTC | #5
Hi Laurent

On Fri, Dec 02, 2022 at 03:59:07PM +0200, Laurent Pinchart wrote:
> On Fri, Dec 02, 2022 at 02:48:27PM +0100, Jacopo Mondi wrote:
> > Not really...
> >
> > I get with clang
> >
> > ../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
> >    21 |         printf("Usage: %s input-file output-file\n", basename(argv0));
> >
> > Sorry, I should have tested before, but it seemed trivial.
> >
> > I now wonder what 'basename' we were calling, or better, to which
> > function prototype we were referring to, which didn't trigger such
> > error...
>
> From libgen.h:
>
> /* Return final component of PATH.
>
>    This is the weird XPG version of this function.  It sometimes will
>    modify its argument.  Therefore we normally use the GNU version (in
>    <string.h>) and only if this header is included make the XPG
>    version available under the real name.  */
> extern char *__xpg_basename (char *__path) __THROW;
> #define basename        __xpg_basename
>
> So we're using the string.h version. The basename manpage mentions

Spot on, I read the header file after sending the email....

>
> NOTES
>        There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after
>
>                #define _GNU_SOURCE         /* See feature_test_macros(7) */
>                #include <string.h>
>
>        The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/".  There is  no  GNU  version  of
>        dirname().
>
>        With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.
>
> We have utils::basename() to support different libc versions, but we
> can't use it in utils/. Have you encountered this when compiling for
> Android ? Maybe we can disable compilation of those utilities instead ?
>

Yes, I am trying compile with the NDK.

I think we can safely remove those scripts from the build (I wonder
how this would be decided), but I anticipate already that we'll have a
few hickups as in example:

../src/libcamera/media_device.cpp:167:2: error: use of undeclared identifier 'lockf'
        lockf(fd_.get(), F_ULOCK, 0);

As Android has instead the BSD-conformant flock(). So expect more
wrappers in utils::  (hopefully not many)

> > On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> > > Hi Jacopo,
> > >
> > > Thank you for the patch.
> > >
> > > On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > > The "basename" function from the standard C library is defined in the
> > > > libgen.h header.
> > > >
> > > > Include it to avoid errors triggered by -Wimplicit-function-declaration
> > > >
> > > > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > > > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> > > >
> > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > >
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > >
> > > > ---
> > > >  utils/ipu3/ipu3-pack.c   | 1 +
> > > >  utils/ipu3/ipu3-unpack.c | 1 +
> > > >  2 files changed, 2 insertions(+)
> > > >
> > > > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > > > index decbfc6c397a..27af44068956 100644
> > > > --- a/utils/ipu3/ipu3-pack.c
> > > > +++ b/utils/ipu3/ipu3-pack.c
> > > > @@ -8,6 +8,7 @@
> > > >
> > > >  #include <errno.h>
> > > >  #include <fcntl.h>
> > > > +#include <libgen.h>
> > > >  #include <stdint.h>
> > > >  #include <stdio.h>
> > > >  #include <string.h>
> > > > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > > > index 9d2c1200d932..aa67e0b0ecf5 100644
> > > > --- a/utils/ipu3/ipu3-unpack.c
> > > > +++ b/utils/ipu3/ipu3-unpack.c
> > > > @@ -8,6 +8,7 @@
> > > >
> > > >  #include <errno.h>
> > > >  #include <fcntl.h>
> > > > +#include <libgen.h>
> > > >  #include <stdint.h>
> > > >  #include <stdio.h>
> > > >  #include <string.h>
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Dec. 2, 2022, 3:34 p.m. UTC | #6
Hi Jacopo,

On Fri, Dec 02, 2022 at 03:15:21PM +0100, Jacopo Mondi wrote:
> On Fri, Dec 02, 2022 at 03:59:07PM +0200, Laurent Pinchart wrote:
> > On Fri, Dec 02, 2022 at 02:48:27PM +0100, Jacopo Mondi wrote:
> > > Not really...
> > >
> > > I get with clang
> > >
> > > ../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
> > >    21 |         printf("Usage: %s input-file output-file\n", basename(argv0));
> > >
> > > Sorry, I should have tested before, but it seemed trivial.
> > >
> > > I now wonder what 'basename' we were calling, or better, to which
> > > function prototype we were referring to, which didn't trigger such
> > > error...
> >
> > From libgen.h:
> >
> > /* Return final component of PATH.
> >
> >    This is the weird XPG version of this function.  It sometimes will
> >    modify its argument.  Therefore we normally use the GNU version (in
> >    <string.h>) and only if this header is included make the XPG
> >    version available under the real name.  */
> > extern char *__xpg_basename (char *__path) __THROW;
> > #define basename        __xpg_basename
> >
> > So we're using the string.h version. The basename manpage mentions
> 
> Spot on, I read the header file after sending the email....
> 
> >
> > NOTES
> >        There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after
> >
> >                #define _GNU_SOURCE         /* See feature_test_macros(7) */
> >                #include <string.h>
> >
> >        The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/".  There is  no  GNU  version  of
> >        dirname().
> >
> >        With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.
> >
> > We have utils::basename() to support different libc versions, but we
> > can't use it in utils/. Have you encountered this when compiling for
> > Android ? Maybe we can disable compilation of those utilities instead ?
> >
> 
> Yes, I am trying compile with the NDK.
> 
> I think we can safely remove those scripts from the build (I wonder
> how this would be decided),

Maybe a meson option ? Or doing so automatically based on a test at
configuration time to see if there's a compliant basename() ? Or even a
check on the platform type, if that's available.

> but I anticipate already that we'll have a
> few hickups as in example:
> 
> ../src/libcamera/media_device.cpp:167:2: error: use of undeclared identifier 'lockf'
>         lockf(fd_.get(), F_ULOCK, 0);
> 
> As Android has instead the BSD-conformant flock(). So expect more
> wrappers in utils::  (hopefully not many)

We could skip the whole locking on Android, as there will never be
multiple processes trying to use the same camera. However, the lockf()
issue seems weird, it seems to be available in bionic.

> > > On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> > > > Hi Jacopo,
> > > >
> > > > Thank you for the patch.
> > > >
> > > > On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > > > The "basename" function from the standard C library is defined in the
> > > > > libgen.h header.
> > > > >
> > > > > Include it to avoid errors triggered by -Wimplicit-function-declaration
> > > > >
> > > > > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > > > > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> > > > >
> > > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > > >
> > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > >
> > > > > ---
> > > > >  utils/ipu3/ipu3-pack.c   | 1 +
> > > > >  utils/ipu3/ipu3-unpack.c | 1 +
> > > > >  2 files changed, 2 insertions(+)
> > > > >
> > > > > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > > > > index decbfc6c397a..27af44068956 100644
> > > > > --- a/utils/ipu3/ipu3-pack.c
> > > > > +++ b/utils/ipu3/ipu3-pack.c
> > > > > @@ -8,6 +8,7 @@
> > > > >
> > > > >  #include <errno.h>
> > > > >  #include <fcntl.h>
> > > > > +#include <libgen.h>
> > > > >  #include <stdint.h>
> > > > >  #include <stdio.h>
> > > > >  #include <string.h>
> > > > > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > > > > index 9d2c1200d932..aa67e0b0ecf5 100644
> > > > > --- a/utils/ipu3/ipu3-unpack.c
> > > > > +++ b/utils/ipu3/ipu3-unpack.c
> > > > > @@ -8,6 +8,7 @@
> > > > >
> > > > >  #include <errno.h>
> > > > >  #include <fcntl.h>
> > > > > +#include <libgen.h>
> > > > >  #include <stdint.h>
> > > > >  #include <stdio.h>
> > > > >  #include <string.h>
Jacopo Mondi Dec. 2, 2022, 3:59 p.m. UTC | #7
Hi Laurent

On Fri, Dec 02, 2022 at 05:34:15PM +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Fri, Dec 02, 2022 at 03:15:21PM +0100, Jacopo Mondi wrote:
> > On Fri, Dec 02, 2022 at 03:59:07PM +0200, Laurent Pinchart wrote:
> > > On Fri, Dec 02, 2022 at 02:48:27PM +0100, Jacopo Mondi wrote:
> > > > Not really...
> > > >
> > > > I get with clang
> > > >
> > > > ../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
> > > >    21 |         printf("Usage: %s input-file output-file\n", basename(argv0));
> > > >
> > > > Sorry, I should have tested before, but it seemed trivial.
> > > >
> > > > I now wonder what 'basename' we were calling, or better, to which
> > > > function prototype we were referring to, which didn't trigger such
> > > > error...
> > >
> > > From libgen.h:
> > >
> > > /* Return final component of PATH.
> > >
> > >    This is the weird XPG version of this function.  It sometimes will
> > >    modify its argument.  Therefore we normally use the GNU version (in
> > >    <string.h>) and only if this header is included make the XPG
> > >    version available under the real name.  */
> > > extern char *__xpg_basename (char *__path) __THROW;
> > > #define basename        __xpg_basename
> > >
> > > So we're using the string.h version. The basename manpage mentions
> >
> > Spot on, I read the header file after sending the email....
> >
> > >
> > > NOTES
> > >        There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after
> > >
> > >                #define _GNU_SOURCE         /* See feature_test_macros(7) */
> > >                #include <string.h>
> > >
> > >        The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/".  There is  no  GNU  version  of
> > >        dirname().
> > >
> > >        With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.
> > >
> > > We have utils::basename() to support different libc versions, but we
> > > can't use it in utils/. Have you encountered this when compiling for
> > > Android ? Maybe we can disable compilation of those utilities instead ?
> > >
> >
> > Yes, I am trying compile with the NDK.
> >
> > I think we can safely remove those scripts from the build (I wonder
> > how this would be decided),
>
> Maybe a meson option ? Or doing so automatically based on a test at
> configuration time to see if there's a compliant basename() ? Or even a
> check on the platform type, if that's available.
>

We could indeed have a build option to compile the several platform
specific utilities. I can list utils/ipu3 and utils/rkisp1 while
utils/raspberry which contains CTT should probably be built
unconditionally ?

> > but I anticipate already that we'll have a
> > few hickups as in example:
> >
> > ../src/libcamera/media_device.cpp:167:2: error: use of undeclared identifier 'lockf'
> >         lockf(fd_.get(), F_ULOCK, 0);
> >
> > As Android has instead the BSD-conformant flock(). So expect more
> > wrappers in utils::  (hopefully not many)
>
> We could skip the whole locking on Android, as there will never be
> multiple processes trying to use the same camera. However, the lockf()
> issue seems weird, it seems to be available in bionic.
>

Only after API version 24 as far as I can tell, at least in NDK

#if __ANDROID_API__ >= 24
int lockf(int __fd, int __cmd, off_t __length) __RENAME_IF_FILE_OFFSET64(lockf64) __INTRODUCED_IN(24);

/**
 * Like lockf() but allows using a 64-bit length
 * even from a 32-bit process without `__FILE_OFFSET_BITS=64`.
 */
int lockf64(int __fd, int __cmd, off64_t __length) __INTRODUCED_IN(24);
#endif /* __ANDROID_API__ >= 24 */

I'll shortly send patches...

> > > > On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> > > > > Hi Jacopo,
> > > > >
> > > > > Thank you for the patch.
> > > > >
> > > > > On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > > > > The "basename" function from the standard C library is defined in the
> > > > > > libgen.h header.
> > > > > >
> > > > > > Include it to avoid errors triggered by -Wimplicit-function-declaration
> > > > > >
> > > > > > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > > > > > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> > > > > >
> > > > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > > > >
> > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > > >
> > > > > > ---
> > > > > >  utils/ipu3/ipu3-pack.c   | 1 +
> > > > > >  utils/ipu3/ipu3-unpack.c | 1 +
> > > > > >  2 files changed, 2 insertions(+)
> > > > > >
> > > > > > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > > > > > index decbfc6c397a..27af44068956 100644
> > > > > > --- a/utils/ipu3/ipu3-pack.c
> > > > > > +++ b/utils/ipu3/ipu3-pack.c
> > > > > > @@ -8,6 +8,7 @@
> > > > > >
> > > > > >  #include <errno.h>
> > > > > >  #include <fcntl.h>
> > > > > > +#include <libgen.h>
> > > > > >  #include <stdint.h>
> > > > > >  #include <stdio.h>
> > > > > >  #include <string.h>
> > > > > > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > > > > > index 9d2c1200d932..aa67e0b0ecf5 100644
> > > > > > --- a/utils/ipu3/ipu3-unpack.c
> > > > > > +++ b/utils/ipu3/ipu3-unpack.c
> > > > > > @@ -8,6 +8,7 @@
> > > > > >
> > > > > >  #include <errno.h>
> > > > > >  #include <fcntl.h>
> > > > > > +#include <libgen.h>
> > > > > >  #include <stdint.h>
> > > > > >  #include <stdio.h>
> > > > > >  #include <string.h>
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Dec. 2, 2022, 8:48 p.m. UTC | #8
Hi Jacopo,

On Fri, Dec 02, 2022 at 04:59:14PM +0100, Jacopo Mondi wrote:
> On Fri, Dec 02, 2022 at 05:34:15PM +0200, Laurent Pinchart wrote:
> > On Fri, Dec 02, 2022 at 03:15:21PM +0100, Jacopo Mondi wrote:
> > > On Fri, Dec 02, 2022 at 03:59:07PM +0200, Laurent Pinchart wrote:
> > > > On Fri, Dec 02, 2022 at 02:48:27PM +0100, Jacopo Mondi wrote:
> > > > > Not really...
> > > > >
> > > > > I get with clang
> > > > >
> > > > > ../utils/ipu3/ipu3-unpack.c:21:63: error: passing argument 1 of ‘__xpg_basename’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
> > > > >    21 |         printf("Usage: %s input-file output-file\n", basename(argv0));
> > > > >
> > > > > Sorry, I should have tested before, but it seemed trivial.
> > > > >
> > > > > I now wonder what 'basename' we were calling, or better, to which
> > > > > function prototype we were referring to, which didn't trigger such
> > > > > error...
> > > >
> > > > From libgen.h:
> > > >
> > > > /* Return final component of PATH.
> > > >
> > > >    This is the weird XPG version of this function.  It sometimes will
> > > >    modify its argument.  Therefore we normally use the GNU version (in
> > > >    <string.h>) and only if this header is included make the XPG
> > > >    version available under the real name.  */
> > > > extern char *__xpg_basename (char *__path) __THROW;
> > > > #define basename        __xpg_basename
> > > >
> > > > So we're using the string.h version. The basename manpage mentions
> > >
> > > Spot on, I read the header file after sending the email....
> > >
> > > >
> > > > NOTES
> > > >        There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after
> > > >
> > > >                #define _GNU_SOURCE         /* See feature_test_macros(7) */
> > > >                #include <string.h>
> > > >
> > > >        The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/".  There is  no  GNU  version  of
> > > >        dirname().
> > > >
> > > >        With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.
> > > >
> > > > We have utils::basename() to support different libc versions, but we
> > > > can't use it in utils/. Have you encountered this when compiling for
> > > > Android ? Maybe we can disable compilation of those utilities instead ?
> > > >
> > >
> > > Yes, I am trying compile with the NDK.
> > >
> > > I think we can safely remove those scripts from the build (I wonder
> > > how this would be decided),
> >
> > Maybe a meson option ? Or doing so automatically based on a test at
> > configuration time to see if there's a compliant basename() ? Or even a
> > check on the platform type, if that's available.
> 
> We could indeed have a build option to compile the several platform
> specific utilities. I can list utils/ipu3 and utils/rkisp1 while
> utils/raspberry which contains CTT should probably be built
> unconditionally ?

I'd skip any C/C++ tools from utils completely on Android to be honest,
I don't think any of them will be run on an Android device.

> > > but I anticipate already that we'll have a
> > > few hickups as in example:
> > >
> > > ../src/libcamera/media_device.cpp:167:2: error: use of undeclared identifier 'lockf'
> > >         lockf(fd_.get(), F_ULOCK, 0);
> > >
> > > As Android has instead the BSD-conformant flock(). So expect more
> > > wrappers in utils::  (hopefully not many)
> >
> > We could skip the whole locking on Android, as there will never be
> > multiple processes trying to use the same camera. However, the lockf()
> > issue seems weird, it seems to be available in bionic.
> 
> Only after API version 24 as far as I can tell, at least in NDK
> 
> #if __ANDROID_API__ >= 24
> int lockf(int __fd, int __cmd, off_t __length) __RENAME_IF_FILE_OFFSET64(lockf64) __INTRODUCED_IN(24);
> 
> /**
>  * Like lockf() but allows using a 64-bit length
>  * even from a 32-bit process without `__FILE_OFFSET_BITS=64`.
>  */
> int lockf64(int __fd, int __cmd, off64_t __length) __INTRODUCED_IN(24);
> #endif /* __ANDROID_API__ >= 24 */
> 
> I'll shortly send patches...
> 
> > > > > On Fri, Dec 02, 2022 at 03:33:56PM +0200, Laurent Pinchart wrote:
> > > > > > Hi Jacopo,
> > > > > >
> > > > > > Thank you for the patch.
> > > > > >
> > > > > > On Fri, Dec 02, 2022 at 02:27:06PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > > > > > The "basename" function from the standard C library is defined in the
> > > > > > > libgen.h header.
> > > > > > >
> > > > > > > Include it to avoid errors triggered by -Wimplicit-function-declaration
> > > > > > >
> > > > > > > ../utils/ipu3/ipu3-pack.c:21:47: error: implicit declaration of function
> > > > > > > 'basename' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> > > > > > >
> > > > > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > > > > >
> > > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > > > >
> > > > > > > ---
> > > > > > >  utils/ipu3/ipu3-pack.c   | 1 +
> > > > > > >  utils/ipu3/ipu3-unpack.c | 1 +
> > > > > > >  2 files changed, 2 insertions(+)
> > > > > > >
> > > > > > > diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
> > > > > > > index decbfc6c397a..27af44068956 100644
> > > > > > > --- a/utils/ipu3/ipu3-pack.c
> > > > > > > +++ b/utils/ipu3/ipu3-pack.c
> > > > > > > @@ -8,6 +8,7 @@
> > > > > > >
> > > > > > >  #include <errno.h>
> > > > > > >  #include <fcntl.h>
> > > > > > > +#include <libgen.h>
> > > > > > >  #include <stdint.h>
> > > > > > >  #include <stdio.h>
> > > > > > >  #include <string.h>
> > > > > > > diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
> > > > > > > index 9d2c1200d932..aa67e0b0ecf5 100644
> > > > > > > --- a/utils/ipu3/ipu3-unpack.c
> > > > > > > +++ b/utils/ipu3/ipu3-unpack.c
> > > > > > > @@ -8,6 +8,7 @@
> > > > > > >
> > > > > > >  #include <errno.h>
> > > > > > >  #include <fcntl.h>
> > > > > > > +#include <libgen.h>
> > > > > > >  #include <stdint.h>
> > > > > > >  #include <stdio.h>
> > > > > > >  #include <string.h>

Patch
diff mbox series

diff --git a/utils/ipu3/ipu3-pack.c b/utils/ipu3/ipu3-pack.c
index decbfc6c397a..27af44068956 100644
--- a/utils/ipu3/ipu3-pack.c
+++ b/utils/ipu3/ipu3-pack.c
@@ -8,6 +8,7 @@ 
 
 #include <errno.h>
 #include <fcntl.h>
+#include <libgen.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c
index 9d2c1200d932..aa67e0b0ecf5 100644
--- a/utils/ipu3/ipu3-unpack.c
+++ b/utils/ipu3/ipu3-unpack.c
@@ -8,6 +8,7 @@ 
 
 #include <errno.h>
 #include <fcntl.h>
+#include <libgen.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>