[libcamera-devel] libcamera: Auto-generate libcamera.h

Message ID 20190521164536.20920-1-laurent.pinchart@ideasonboard.com
State Superseded
Headers show
Series
  • [libcamera-devel] libcamera: Auto-generate libcamera.h
Related show

Commit Message

Laurent Pinchart May 21, 2019, 4:45 p.m. UTC
As shown by two missing includes, keeping the libcamera.h file in sync
when adding or removing headers is an error-prone manual process.
Automate it by generating the header automatically.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
 include/libcamera/libcamera.h   | 20 --------------------
 include/libcamera/meson.build   | 10 +++++++++-
 3 files changed, 35 insertions(+), 21 deletions(-)
 create mode 100755 include/libcamera/gen-header.sh
 delete mode 100644 include/libcamera/libcamera.h

Comments

Kieran Bingham May 22, 2019, 7:39 a.m. UTC | #1
Hi Laurent,

On 21/05/2019 17:45, Laurent Pinchart wrote:
> As shown by two missing includes, keeping the libcamera.h file in sync
> when adding or removing headers is an error-prone manual process.
> Automate it by generating the header automatically.

Great idea!

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

With the shellcheck issues considered, and the tabs fixed up in meson.build:

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>


> ---
>  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
>  include/libcamera/libcamera.h   | 20 --------------------
>  include/libcamera/meson.build   | 10 +++++++++-
>  3 files changed, 35 insertions(+), 21 deletions(-)
>  create mode 100755 include/libcamera/gen-header.sh
>  delete mode 100644 include/libcamera/libcamera.h
> 
> diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
> new file mode 100755
> index 000000000000..ea5b79a62520
> --- /dev/null
> +++ b/include/libcamera/gen-header.sh

Hrm... shouldn't this live in a utils directory?

Although there are some strong arguments for keeping it in
include/libcamera, such as:

 - It keeps the directory layout correct in git
 - The helper is in the place that the header will be output so it's
   easy to find

> @@ -0,0 +1,26 @@
> +#!/bin/sh
> +
> +src_dir=$1
> +dst_file=$2
> +
> +cat <<EOF > $dst_file
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/* This file is auto-generated, do not edit! */
> +/*
> + * Copyright (C) 2018, Google Inc.

Why not add `date +'%Y'` as it's autogenerated ? :-D

> + *
> + * libcamera.h - libcamera public API
> + */
> +#ifndef __LIBCAMERA_LIBCAMERA_H__
> +#define __LIBCAMERA_LIBCAMERA_H__
> +
> +EOF
> +
> +for header in $src_dir/*.h ; do
> +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
> +done


Are we ever expecting to have subdirs here?
I don't think so at the moment, and if we do - then we can update this
at that point

(I'm sure someone will notice if they can't include their headers :D)

> +
> +cat <<EOF >> $dst_file
> +
> +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> +EOF


Here's the output of running shellcheck on this script:

> shellcheck ./include/libcamera/gen-header.sh 
> 
> In ./include/libcamera/gen-header.sh line 6:
> cat <<EOF > $dst_file
>             ^-- SC2086: Double quote to prevent globbing and word splitting.
> 
> 
> In ./include/libcamera/gen-header.sh line 19:
> for header in $src_dir/*.h ; do
>               ^-- SC2231: Quote expansions in this for loop glob to prevent wordsplitting, e.g. "$dir"/*.txt .
> 
> 
> In ./include/libcamera/gen-header.sh line 20:
>         echo "#include <libcamera/$(basename $header)>" >> $dst_file
>                                              ^-- SC2086: Double quote to prevent globbing and word splitting.
>                                                            ^-- SC2086: Double quote to prevent globbing and word splitting.
> 
> 
> In ./include/libcamera/gen-header.sh line 23:
> cat <<EOF >> $dst_file
>              ^-- SC2086: Double quote to prevent globbing and word splitting.





> diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
> deleted file mode 100644
> index dda576e906fb..000000000000
> --- a/include/libcamera/libcamera.h
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> -/*
> - * Copyright (C) 2018, Google Inc.
> - *
> - * libcamera.h - libcamera public API
> - */
> -#ifndef __LIBCAMERA_LIBCAMERA_H__
> -#define __LIBCAMERA_LIBCAMERA_H__
> -
> -#include <libcamera/buffer.h>
> -#include <libcamera/camera.h>
> -#include <libcamera/camera_manager.h>
> -#include <libcamera/event_dispatcher.h>
> -#include <libcamera/event_notifier.h>
> -#include <libcamera/request.h>
> -#include <libcamera/signal.h>
> -#include <libcamera/stream.h>
> -#include <libcamera/timer.h>
> -
> -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> index 83d226ac5078..46aff0b6bc2f 100644
> --- a/include/libcamera/meson.build
> +++ b/include/libcamera/meson.build
> @@ -5,7 +5,6 @@ libcamera_api = files([
>      'event_dispatcher.h',
>      'event_notifier.h',
>      'geometry.h',
> -    'libcamera.h',
>      'object.h',
>      'request.h',
>      'signal.h',
> @@ -13,5 +12,14 @@ libcamera_api = files([
>      'timer.h',
>  ])
>  
> +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> +
> +custom_target('gen-header',
> +	      input: meson.current_source_dir(),
> +              output: 'libcamera.h',
> +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
> +	      install: true,
> +	      install_dir: 'include/libcamera')

I think some tabs have snuck in there.




> +
>  install_headers(libcamera_api,
>                  subdir : 'libcamera')
>
Niklas Söderlund May 22, 2019, 10:23 a.m. UTC | #2
Hi Laurent,

Thanks for your work.

On 2019-05-22 08:39:44 +0100, Kieran Bingham wrote:
> Hi Laurent,
> 
> On 21/05/2019 17:45, Laurent Pinchart wrote:
> > As shown by two missing includes, keeping the libcamera.h file in sync
> > when adding or removing headers is an error-prone manual process.
> > Automate it by generating the header automatically.
> 
> Great idea!
> 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> With the shellcheck issues considered, and the tabs fixed up in meson.build:
> 
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

With Kieran's comments addressed,

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> 
> 
> > ---
> >  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
> >  include/libcamera/libcamera.h   | 20 --------------------
> >  include/libcamera/meson.build   | 10 +++++++++-
> >  3 files changed, 35 insertions(+), 21 deletions(-)
> >  create mode 100755 include/libcamera/gen-header.sh
> >  delete mode 100644 include/libcamera/libcamera.h
> > 
> > diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
> > new file mode 100755
> > index 000000000000..ea5b79a62520
> > --- /dev/null
> > +++ b/include/libcamera/gen-header.sh
> 
> Hrm... shouldn't this live in a utils directory?
> 
> Although there are some strong arguments for keeping it in
> include/libcamera, such as:
> 
>  - It keeps the directory layout correct in git
>  - The helper is in the place that the header will be output so it's
>    easy to find
> 
> > @@ -0,0 +1,26 @@
> > +#!/bin/sh
> > +
> > +src_dir=$1
> > +dst_file=$2
> > +
> > +cat <<EOF > $dst_file
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/* This file is auto-generated, do not edit! */
> > +/*
> > + * Copyright (C) 2018, Google Inc.
> 
> Why not add `date +'%Y'` as it's autogenerated ? :-D
> 
> > + *
> > + * libcamera.h - libcamera public API
> > + */
> > +#ifndef __LIBCAMERA_LIBCAMERA_H__
> > +#define __LIBCAMERA_LIBCAMERA_H__
> > +
> > +EOF
> > +
> > +for header in $src_dir/*.h ; do
> > +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
> > +done
> 
> 
> Are we ever expecting to have subdirs here?
> I don't think so at the moment, and if we do - then we can update this
> at that point
> 
> (I'm sure someone will notice if they can't include their headers :D)
> 
> > +
> > +cat <<EOF >> $dst_file
> > +
> > +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > +EOF
> 
> 
> Here's the output of running shellcheck on this script:
> 
> > shellcheck ./include/libcamera/gen-header.sh 
> > 
> > In ./include/libcamera/gen-header.sh line 6:
> > cat <<EOF > $dst_file
> >             ^-- SC2086: Double quote to prevent globbing and word splitting.
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 19:
> > for header in $src_dir/*.h ; do
> >               ^-- SC2231: Quote expansions in this for loop glob to prevent wordsplitting, e.g. "$dir"/*.txt .
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 20:
> >         echo "#include <libcamera/$(basename $header)>" >> $dst_file
> >                                              ^-- SC2086: Double quote to prevent globbing and word splitting.
> >                                                            ^-- SC2086: Double quote to prevent globbing and word splitting.
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 23:
> > cat <<EOF >> $dst_file
> >              ^-- SC2086: Double quote to prevent globbing and word splitting.
> 
> 
> 
> 
> 
> > diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
> > deleted file mode 100644
> > index dda576e906fb..000000000000
> > --- a/include/libcamera/libcamera.h
> > +++ /dev/null
> > @@ -1,20 +0,0 @@
> > -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > -/*
> > - * Copyright (C) 2018, Google Inc.
> > - *
> > - * libcamera.h - libcamera public API
> > - */
> > -#ifndef __LIBCAMERA_LIBCAMERA_H__
> > -#define __LIBCAMERA_LIBCAMERA_H__
> > -
> > -#include <libcamera/buffer.h>
> > -#include <libcamera/camera.h>
> > -#include <libcamera/camera_manager.h>
> > -#include <libcamera/event_dispatcher.h>
> > -#include <libcamera/event_notifier.h>
> > -#include <libcamera/request.h>
> > -#include <libcamera/signal.h>
> > -#include <libcamera/stream.h>
> > -#include <libcamera/timer.h>
> > -
> > -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> > index 83d226ac5078..46aff0b6bc2f 100644
> > --- a/include/libcamera/meson.build
> > +++ b/include/libcamera/meson.build
> > @@ -5,7 +5,6 @@ libcamera_api = files([
> >      'event_dispatcher.h',
> >      'event_notifier.h',
> >      'geometry.h',
> > -    'libcamera.h',
> >      'object.h',
> >      'request.h',
> >      'signal.h',
> > @@ -13,5 +12,14 @@ libcamera_api = files([
> >      'timer.h',
> >  ])
> >  
> > +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> > +
> > +custom_target('gen-header',
> > +	      input: meson.current_source_dir(),
> > +              output: 'libcamera.h',
> > +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
> > +	      install: true,
> > +	      install_dir: 'include/libcamera')
> 
> I think some tabs have snuck in there.
> 
> 
> 
> 
> > +
> >  install_headers(libcamera_api,
> >                  subdir : 'libcamera')
> > 
> 
> -- 
> Regards
> --
> Kieran
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Kieran Bingham May 22, 2019, 1:25 p.m. UTC | #3
Hi Laurent,

On 21/05/2019 17:45, Laurent Pinchart wrote:
> As shown by two missing includes, keeping the libcamera.h file in sync
> when adding or removing headers is an error-prone manual process.
> Automate it by generating the header automatically.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
>  include/libcamera/libcamera.h   | 20 --------------------
>  include/libcamera/meson.build   | 10 +++++++++-
>  3 files changed, 35 insertions(+), 21 deletions(-)
>  create mode 100755 include/libcamera/gen-header.sh
>  delete mode 100644 include/libcamera/libcamera.h
> 
> diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
> new file mode 100755
> index 000000000000..ea5b79a62520
> --- /dev/null
> +++ b/include/libcamera/gen-header.sh
> @@ -0,0 +1,26 @@
> +#!/bin/sh
> +
> +src_dir=$1
> +dst_file=$2
> +
> +cat <<EOF > $dst_file
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/* This file is auto-generated, do not edit! */
> +/*
> + * Copyright (C) 2018, Google Inc.
> + *
> + * libcamera.h - libcamera public API
> + */
> +#ifndef __LIBCAMERA_LIBCAMERA_H__
> +#define __LIBCAMERA_LIBCAMERA_H__
> +
> +EOF
> +
> +for header in $src_dir/*.h ; do
> +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
> +done
> +
> +cat <<EOF >> $dst_file
> +
> +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> +EOF
> diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
> deleted file mode 100644
> index dda576e906fb..000000000000
> --- a/include/libcamera/libcamera.h
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> -/*
> - * Copyright (C) 2018, Google Inc.
> - *
> - * libcamera.h - libcamera public API
> - */
> -#ifndef __LIBCAMERA_LIBCAMERA_H__
> -#define __LIBCAMERA_LIBCAMERA_H__
> -
> -#include <libcamera/buffer.h>
> -#include <libcamera/camera.h>
> -#include <libcamera/camera_manager.h>
> -#include <libcamera/event_dispatcher.h>
> -#include <libcamera/event_notifier.h>
> -#include <libcamera/request.h>
> -#include <libcamera/signal.h>
> -#include <libcamera/stream.h>
> -#include <libcamera/timer.h>
> -
> -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> index 83d226ac5078..46aff0b6bc2f 100644
> --- a/include/libcamera/meson.build
> +++ b/include/libcamera/meson.build
> @@ -5,7 +5,6 @@ libcamera_api = files([
>      'event_dispatcher.h',
>      'event_notifier.h',
>      'geometry.h',
> -    'libcamera.h',
>      'object.h',
>      'request.h',
>      'signal.h',
> @@ -13,5 +12,14 @@ libcamera_api = files([
>      'timer.h',
>  ])
>  
> +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> +
> +custom_target('gen-header',
> +	      input: meson.current_source_dir(),
> +              output: 'libcamera.h',
> +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
> +	      install: true,
> +	      install_dir: 'include/libcamera')
> +

Hrm... should this rebuild if libcamera_api changes at all ?

Also - Note that the following warning has appeared in my build with
this patch applied:


WARNING: Custom target input '.../libcamera/include/libcamera' can't be
converted to File object(s).
This will become a hard error in the future.




>  install_headers(libcamera_api,
>                  subdir : 'libcamera')
>
Laurent Pinchart May 22, 2019, 2:26 p.m. UTC | #4
Hi Kieran,

On Wed, May 22, 2019 at 02:25:59PM +0100, Kieran Bingham wrote:
> On 21/05/2019 17:45, Laurent Pinchart wrote:
> > As shown by two missing includes, keeping the libcamera.h file in sync
> > when adding or removing headers is an error-prone manual process.
> > Automate it by generating the header automatically.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
> >  include/libcamera/libcamera.h   | 20 --------------------
> >  include/libcamera/meson.build   | 10 +++++++++-
> >  3 files changed, 35 insertions(+), 21 deletions(-)
> >  create mode 100755 include/libcamera/gen-header.sh
> >  delete mode 100644 include/libcamera/libcamera.h
> > 
> > diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
> > new file mode 100755
> > index 000000000000..ea5b79a62520
> > --- /dev/null
> > +++ b/include/libcamera/gen-header.sh
> > @@ -0,0 +1,26 @@
> > +#!/bin/sh
> > +
> > +src_dir=$1
> > +dst_file=$2
> > +
> > +cat <<EOF > $dst_file
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/* This file is auto-generated, do not edit! */
> > +/*
> > + * Copyright (C) 2018, Google Inc.
> > + *
> > + * libcamera.h - libcamera public API
> > + */
> > +#ifndef __LIBCAMERA_LIBCAMERA_H__
> > +#define __LIBCAMERA_LIBCAMERA_H__
> > +
> > +EOF
> > +
> > +for header in $src_dir/*.h ; do
> > +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
> > +done
> > +
> > +cat <<EOF >> $dst_file
> > +
> > +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > +EOF
> > diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
> > deleted file mode 100644
> > index dda576e906fb..000000000000
> > --- a/include/libcamera/libcamera.h
> > +++ /dev/null
> > @@ -1,20 +0,0 @@
> > -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > -/*
> > - * Copyright (C) 2018, Google Inc.
> > - *
> > - * libcamera.h - libcamera public API
> > - */
> > -#ifndef __LIBCAMERA_LIBCAMERA_H__
> > -#define __LIBCAMERA_LIBCAMERA_H__
> > -
> > -#include <libcamera/buffer.h>
> > -#include <libcamera/camera.h>
> > -#include <libcamera/camera_manager.h>
> > -#include <libcamera/event_dispatcher.h>
> > -#include <libcamera/event_notifier.h>
> > -#include <libcamera/request.h>
> > -#include <libcamera/signal.h>
> > -#include <libcamera/stream.h>
> > -#include <libcamera/timer.h>
> > -
> > -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> > index 83d226ac5078..46aff0b6bc2f 100644
> > --- a/include/libcamera/meson.build
> > +++ b/include/libcamera/meson.build
> > @@ -5,7 +5,6 @@ libcamera_api = files([
> >      'event_dispatcher.h',
> >      'event_notifier.h',
> >      'geometry.h',
> > -    'libcamera.h',
> >      'object.h',
> >      'request.h',
> >      'signal.h',
> > @@ -13,5 +12,14 @@ libcamera_api = files([
> >      'timer.h',
> >  ])
> >  
> > +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> > +
> > +custom_target('gen-header',
> > +	      input: meson.current_source_dir(),
> > +              output: 'libcamera.h',
> > +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
> > +	      install: true,
> > +	      install_dir: 'include/libcamera')
> > +
> 
> Hrm... should this rebuild if libcamera_api changes at all ?

It should, but from my tests this is already ensured indirectly.
Changing libcamera_api changes meson.build, which triggers a
regeneration of all the related ninja files. As the timestamp of the
ninja files changes, they rebuild all the rules they contain.

> Also - Note that the following warning has appeared in my build with
> this patch applied:
> 
> 
> WARNING: Custom target input '.../libcamera/include/libcamera' can't be
> converted to File object(s).
> This will become a hard error in the future.

Which version of meson are you using ?

> >  install_headers(libcamera_api,
> >                  subdir : 'libcamera')
Laurent Pinchart May 22, 2019, 2:47 p.m. UTC | #5
Hi Kieran,

On Wed, May 22, 2019 at 08:39:44AM +0100, Kieran Bingham wrote:
> On 21/05/2019 17:45, Laurent Pinchart wrote:
> > As shown by two missing includes, keeping the libcamera.h file in sync
> > when adding or removing headers is an error-prone manual process.
> > Automate it by generating the header automatically.
> 
> Great idea!
> 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> With the shellcheck issues considered, and the tabs fixed up in meson.build:
> 
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> 
> > ---
> >  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
> >  include/libcamera/libcamera.h   | 20 --------------------
> >  include/libcamera/meson.build   | 10 +++++++++-
> >  3 files changed, 35 insertions(+), 21 deletions(-)
> >  create mode 100755 include/libcamera/gen-header.sh
> >  delete mode 100644 include/libcamera/libcamera.h
> > 
> > diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
> > new file mode 100755
> > index 000000000000..ea5b79a62520
> > --- /dev/null
> > +++ b/include/libcamera/gen-header.sh
> 
> Hrm... shouldn't this live in a utils directory?
> 
> Although there are some strong arguments for keeping it in
> include/libcamera, such as:
> 
>  - It keeps the directory layout correct in git
>  - The helper is in the place that the header will be output so it's
>    easy to find

I considered both options and found it more logical to keep the file
there. It doesn't get installed, so it shouldn't be an issue. If we
later extend the script to generate more headers, or more files, than
libcamera.h, then we could move it.

> > @@ -0,0 +1,26 @@
> > +#!/bin/sh
> > +
> > +src_dir=$1
> > +dst_file=$2
> > +
> > +cat <<EOF > $dst_file
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/* This file is auto-generated, do not edit! */
> > +/*
> > + * Copyright (C) 2018, Google Inc.
> 
> Why not add `date +'%Y'` as it's autogenerated ? :-D

Good point. I however wonder how to treat copyright on auto-generated
files. The generation process doesn't create any additional work that
can be attributed to an entity entitled to copyrights as far as I
understand, so the copyright on libcamera.h would come from the
copyright on its source. In this case the source is the combination of
the directory layout (hardly copyrightable I believe) and this script.
It thus seems that the copyright year should be fixed in the script (and
should be 2018-2019), and should only change when the script is
significantly modified. I'm no expert in this field though.

> > + *
> > + * libcamera.h - libcamera public API
> > + */
> > +#ifndef __LIBCAMERA_LIBCAMERA_H__
> > +#define __LIBCAMERA_LIBCAMERA_H__
> > +
> > +EOF
> > +
> > +for header in $src_dir/*.h ; do
> > +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
> > +done
> 
> Are we ever expecting to have subdirs here?
> I don't think so at the moment, and if we do - then we can update this
> at that point
> 
> (I'm sure someone will notice if they can't include their headers :D)

Yes, let's handle this later :-)

> > +
> > +cat <<EOF >> $dst_file
> > +
> > +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > +EOF
> 
> Here's the output of running shellcheck on this script:
> 
> > shellcheck ./include/libcamera/gen-header.sh 
> > 
> > In ./include/libcamera/gen-header.sh line 6:
> > cat <<EOF > $dst_file
> >             ^-- SC2086: Double quote to prevent globbing and word splitting.
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 19:
> > for header in $src_dir/*.h ; do
> >               ^-- SC2231: Quote expansions in this for loop glob to prevent wordsplitting, e.g. "$dir"/*.txt .
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 20:
> >         echo "#include <libcamera/$(basename $header)>" >> $dst_file
> >                                              ^-- SC2086: Double quote to prevent globbing and word splitting.
> >                                                            ^-- SC2086: Double quote to prevent globbing and word splitting.
> > 
> > 
> > In ./include/libcamera/gen-header.sh line 23:
> > cat <<EOF >> $dst_file
> >              ^-- SC2086: Double quote to prevent globbing and word splitting.

I'll fix these, thank you.

> > diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
> > deleted file mode 100644
> > index dda576e906fb..000000000000
> > --- a/include/libcamera/libcamera.h
> > +++ /dev/null
> > @@ -1,20 +0,0 @@
> > -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > -/*
> > - * Copyright (C) 2018, Google Inc.
> > - *
> > - * libcamera.h - libcamera public API
> > - */
> > -#ifndef __LIBCAMERA_LIBCAMERA_H__
> > -#define __LIBCAMERA_LIBCAMERA_H__
> > -
> > -#include <libcamera/buffer.h>
> > -#include <libcamera/camera.h>
> > -#include <libcamera/camera_manager.h>
> > -#include <libcamera/event_dispatcher.h>
> > -#include <libcamera/event_notifier.h>
> > -#include <libcamera/request.h>
> > -#include <libcamera/signal.h>
> > -#include <libcamera/stream.h>
> > -#include <libcamera/timer.h>
> > -
> > -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
> > diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> > index 83d226ac5078..46aff0b6bc2f 100644
> > --- a/include/libcamera/meson.build
> > +++ b/include/libcamera/meson.build
> > @@ -5,7 +5,6 @@ libcamera_api = files([
> >      'event_dispatcher.h',
> >      'event_notifier.h',
> >      'geometry.h',
> > -    'libcamera.h',
> >      'object.h',
> >      'request.h',
> >      'signal.h',
> > @@ -13,5 +12,14 @@ libcamera_api = files([
> >      'timer.h',
> >  ])
> >  
> > +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> > +
> > +custom_target('gen-header',
> > +	      input: meson.current_source_dir(),
> > +              output: 'libcamera.h',
> > +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
> > +	      install: true,
> > +	      install_dir: 'include/libcamera')
> 
> I think some tabs have snuck in there.

My bad :-( Will fix too.

> > +
> >  install_headers(libcamera_api,
> >                  subdir : 'libcamera')
> >
Kieran Bingham May 22, 2019, 3:34 p.m. UTC | #6
Hi Laurent,

On 22/05/2019 15:26, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Wed, May 22, 2019 at 02:25:59PM +0100, Kieran Bingham wrote:
>> On 21/05/2019 17:45, Laurent Pinchart wrote:
>>> As shown by two missing includes, keeping the libcamera.h file in sync
>>> when adding or removing headers is an error-prone manual process.
>>> Automate it by generating the header automatically.
>>>
>>> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>>> ---
>>>  include/libcamera/gen-header.sh | 26 ++++++++++++++++++++++++++
>>>  include/libcamera/libcamera.h   | 20 --------------------
>>>  include/libcamera/meson.build   | 10 +++++++++-
>>>  3 files changed, 35 insertions(+), 21 deletions(-)
>>>  create mode 100755 include/libcamera/gen-header.sh
>>>  delete mode 100644 include/libcamera/libcamera.h
>>>
>>> diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
>>> new file mode 100755
>>> index 000000000000..ea5b79a62520
>>> --- /dev/null
>>> +++ b/include/libcamera/gen-header.sh
>>> @@ -0,0 +1,26 @@
>>> +#!/bin/sh
>>> +
>>> +src_dir=$1
>>> +dst_file=$2
>>> +
>>> +cat <<EOF > $dst_file
>>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>> +/* This file is auto-generated, do not edit! */
>>> +/*
>>> + * Copyright (C) 2018, Google Inc.
>>> + *
>>> + * libcamera.h - libcamera public API
>>> + */
>>> +#ifndef __LIBCAMERA_LIBCAMERA_H__
>>> +#define __LIBCAMERA_LIBCAMERA_H__
>>> +
>>> +EOF
>>> +
>>> +for header in $src_dir/*.h ; do
>>> +	echo "#include <libcamera/$(basename $header)>" >> $dst_file
>>> +done
>>> +
>>> +cat <<EOF >> $dst_file
>>> +
>>> +#endif /* __LIBCAMERA_LIBCAMERA_H__ */
>>> +EOF
>>> diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
>>> deleted file mode 100644
>>> index dda576e906fb..000000000000
>>> --- a/include/libcamera/libcamera.h
>>> +++ /dev/null
>>> @@ -1,20 +0,0 @@
>>> -/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>> -/*
>>> - * Copyright (C) 2018, Google Inc.
>>> - *
>>> - * libcamera.h - libcamera public API
>>> - */
>>> -#ifndef __LIBCAMERA_LIBCAMERA_H__
>>> -#define __LIBCAMERA_LIBCAMERA_H__
>>> -
>>> -#include <libcamera/buffer.h>
>>> -#include <libcamera/camera.h>
>>> -#include <libcamera/camera_manager.h>
>>> -#include <libcamera/event_dispatcher.h>
>>> -#include <libcamera/event_notifier.h>
>>> -#include <libcamera/request.h>
>>> -#include <libcamera/signal.h>
>>> -#include <libcamera/stream.h>
>>> -#include <libcamera/timer.h>
>>> -
>>> -#endif /* __LIBCAMERA_LIBCAMERA_H__ */
>>> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
>>> index 83d226ac5078..46aff0b6bc2f 100644
>>> --- a/include/libcamera/meson.build
>>> +++ b/include/libcamera/meson.build
>>> @@ -5,7 +5,6 @@ libcamera_api = files([
>>>      'event_dispatcher.h',
>>>      'event_notifier.h',
>>>      'geometry.h',
>>> -    'libcamera.h',
>>>      'object.h',
>>>      'request.h',
>>>      'signal.h',
>>> @@ -13,5 +12,14 @@ libcamera_api = files([
>>>      'timer.h',
>>>  ])
>>>  
>>> +gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
>>> +
>>> +custom_target('gen-header',
>>> +	      input: meson.current_source_dir(),
>>> +              output: 'libcamera.h',
>>> +	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
>>> +	      install: true,
>>> +	      install_dir: 'include/libcamera')
>>> +
>>
>> Hrm... should this rebuild if libcamera_api changes at all ?
> 
> It should, but from my tests this is already ensured indirectly.
> Changing libcamera_api changes meson.build, which triggers a
> regeneration of all the related ninja files. As the timestamp of the
> ninja files changes, they rebuild all the rules they contain.

OK - that sounds fine then.


>> Also - Note that the following warning has appeared in my build with
>> this patch applied:
>>
>>
>> WARNING: Custom target input '.../libcamera/include/libcamera' can't be
>> converted to File object(s).
>> This will become a hard error in the future.
> 
> Which version of meson are you using ?


$ meson --version
0.49.0


> 
>>>  install_headers(libcamera_api,
>>>                  subdir : 'libcamera')
>

Patch

diff --git a/include/libcamera/gen-header.sh b/include/libcamera/gen-header.sh
new file mode 100755
index 000000000000..ea5b79a62520
--- /dev/null
+++ b/include/libcamera/gen-header.sh
@@ -0,0 +1,26 @@ 
+#!/bin/sh
+
+src_dir=$1
+dst_file=$2
+
+cat <<EOF > $dst_file
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/* This file is auto-generated, do not edit! */
+/*
+ * Copyright (C) 2018, Google Inc.
+ *
+ * libcamera.h - libcamera public API
+ */
+#ifndef __LIBCAMERA_LIBCAMERA_H__
+#define __LIBCAMERA_LIBCAMERA_H__
+
+EOF
+
+for header in $src_dir/*.h ; do
+	echo "#include <libcamera/$(basename $header)>" >> $dst_file
+done
+
+cat <<EOF >> $dst_file
+
+#endif /* __LIBCAMERA_LIBCAMERA_H__ */
+EOF
diff --git a/include/libcamera/libcamera.h b/include/libcamera/libcamera.h
deleted file mode 100644
index dda576e906fb..000000000000
--- a/include/libcamera/libcamera.h
+++ /dev/null
@@ -1,20 +0,0 @@ 
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2018, Google Inc.
- *
- * libcamera.h - libcamera public API
- */
-#ifndef __LIBCAMERA_LIBCAMERA_H__
-#define __LIBCAMERA_LIBCAMERA_H__
-
-#include <libcamera/buffer.h>
-#include <libcamera/camera.h>
-#include <libcamera/camera_manager.h>
-#include <libcamera/event_dispatcher.h>
-#include <libcamera/event_notifier.h>
-#include <libcamera/request.h>
-#include <libcamera/signal.h>
-#include <libcamera/stream.h>
-#include <libcamera/timer.h>
-
-#endif /* __LIBCAMERA_LIBCAMERA_H__ */
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 83d226ac5078..46aff0b6bc2f 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -5,7 +5,6 @@  libcamera_api = files([
     'event_dispatcher.h',
     'event_notifier.h',
     'geometry.h',
-    'libcamera.h',
     'object.h',
     'request.h',
     'signal.h',
@@ -13,5 +12,14 @@  libcamera_api = files([
     'timer.h',
 ])
 
+gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
+
+custom_target('gen-header',
+	      input: meson.current_source_dir(),
+              output: 'libcamera.h',
+	      command: [gen_header, '@INPUT@', '@OUTPUT@'],
+	      install: true,
+	      install_dir: 'include/libcamera')
+
 install_headers(libcamera_api,
                 subdir : 'libcamera')