[libcamera-devel] [PATCH] libcamera: Auto generate version information

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Jun 11 22:32:37 CEST 2019


Hi Kieran,

Thank you for the patch.

On Tue, Jun 11, 2019 at 09:14:11PM +0100, Kieran Bingham wrote:
> Generate a version string, and provide a global singleton object which
> allows applications to interogate the current libcamera version
> information.
> 
> The version header is automatically updated by meson on each build.
> The string roughly follows the semver [0] conventions of
> major.minor.patch-label as a value.
> 
> [0] https://semver.org/
> 
> The utils/version-gen script will look for tags in the form vX.Y as
> starting points for the version string. While the repository does not
> have any matching tags, v0.0 will be assumed, resulting in versions with
> both major and minor being set to '0', and the patch count resulting
> from the number of patches in the history to that point.
> 
> Finally, a uniquely identifying shortened checksum is provided from git:
> 
> 	v0.0.509.c544
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
>  Documentation/conf.py         |  6 ++++--
>  include/libcamera/meson.build |  1 +
>  include/libcamera/version.h   | 23 ++++++++++++++++++++
>  meson.build                   |  9 +++++++-
>  src/libcamera/meson.build     |  1 +
>  src/libcamera/version.cpp     | 40 +++++++++++++++++++++++++++++++++++
>  utils/version-gen             | 36 +++++++++++++++++++++++++++++++
>  version.h.in                  |  3 +++
>  8 files changed, 116 insertions(+), 3 deletions(-)
>  create mode 100644 include/libcamera/version.h
>  create mode 100644 src/libcamera/version.cpp
>  create mode 100755 utils/version-gen
>  create mode 100644 version.h.in
> 
> diff --git a/Documentation/conf.py b/Documentation/conf.py
> index 970edf3d7298..e5980b98216d 100644
> --- a/Documentation/conf.py
> +++ b/Documentation/conf.py
> @@ -23,10 +23,12 @@ project = 'libcamera'
>  copyright = '2018-2019, The libcamera documentation authors'
>  author = u'Kieran Bingham, Jacopo Mondi, Laurent Pinchart, Niklas Söderlund'
>  
> +# Vesion information is provided by the build environment.

s/Vesion/Version/

> +#
>  # The short X.Y version
> -version = ''
> +# version = ''
>  # The full version, including alpha/beta/rc tags
> -release = '0.1'
> +# release = '0.1'

Should we just delete the version and release lines ?

>  # -- General configuration ---------------------------------------------------
> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
> index 1b86fdc7fca4..201832105457 100644
> --- a/include/libcamera/meson.build
> +++ b/include/libcamera/meson.build
> @@ -12,6 +12,7 @@ libcamera_api = files([
>      'signal.h',
>      'stream.h',
>      'timer.h',
> +    'version.h',
>  ])
>  
>  gen_header = join_paths(meson.current_source_dir(), 'gen-header.sh')
> diff --git a/include/libcamera/version.h b/include/libcamera/version.h
> new file mode 100644
> index 000000000000..ad21f148e748
> --- /dev/null
> +++ b/include/libcamera/version.h
> @@ -0,0 +1,23 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * version.h - Library version information
> + */
> +#ifndef __LIBCAMERA_VERSION_H__
> +#define __LIBCAMERA_VERSION_H__
> +
> +namespace libcamera {
> +
> +class LibcameraVersion
> +{
> +public:
> +	LibcameraVersion();
> +	std::string toString();
> +};
> +
> +extern LibcameraVersion version;
> +
> +} /* namespace libcamera */
> +
> +#endif /* __LIBCAMERA_VERSION_H__ */

This seems a bit overkill, can't we just install version.h ?

> diff --git a/meson.build b/meson.build
> index 4d3e99d3e58f..5182546382c5 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1,6 +1,8 @@
>  project('libcamera', 'c', 'cpp',
>      meson_version : '>= 0.40',
> -    version : '0.1',
> +    version : run_command('utils/version-gen',
> +                          '@0@'.format(meson.source_root()),
> +                          check : true).stdout().strip(),
>      default_options : [
>          'werror=true',
>          'warning_level=2',
> @@ -13,6 +15,11 @@ project('libcamera', 'c', 'cpp',
>  #       generated from this too.
>  api_version = '0.1'
>  
> +vcs_tag(command: ['utils/version-gen', '.'],
> +        input: 'version.h.in',
> +	output: 'version.h',
> +	fallback: '')

Mixing tabs and spaces.

Don't you need to add the customtarget object returned by vcs_tag to
dependencies or sources for something ? Otherwise meson won't know what
depends on version.h.

> +
>  cc = meson.get_compiler('c')
>  config_h = configuration_data()
>  
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index 1ca1083cf5c7..b9a4153839c9 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -25,6 +25,7 @@ libcamera_sources = files([
>      'utils.cpp',
>      'v4l2_device.cpp',
>      'v4l2_subdevice.cpp',
> +    'version.cpp',
>  ])
>  
>  libcamera_headers = files([
> diff --git a/src/libcamera/version.cpp b/src/libcamera/version.cpp
> new file mode 100644
> index 000000000000..81f692f7cae7
> --- /dev/null
> +++ b/src/libcamera/version.cpp
> @@ -0,0 +1,40 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * version.cpp - Version information
> + */
> +
> +#include <libcamera/version.h>
> +
> +#include "log.h"
> +
> +/* The version header is automatically generated at the base of the project. */
> +#include "../../version.h"
> +
> +namespace libcamera {
> +
> +LOG_DEFINE_CATEGORY(Version)
> +
> +/**
> + * \class LibcameraVersion
> + *
> + * Reports library version information
> + */
> +
> +LibcameraVersion::LibcameraVersion()
> +{
> +	LOG(Version, Info) << "Libcamera Version " << toString();
> +}
> +
> +/**
> + * \brief Return the library version as a string
> + */
> +std::string LibcameraVersion::toString()
> +{
> +	return LIBCAMERA_VERSION;
> +}
> +
> +static LibcameraVersion version;
> +
> +} /* namespace libcamera */
> diff --git a/utils/version-gen b/utils/version-gen
> new file mode 100755
> index 000000000000..b8e53d77b63e
> --- /dev/null
> +++ b/utils/version-gen
> @@ -0,0 +1,36 @@
> +#!/bin/sh

Missing SPDX header.

> +
> +if test -n "$1"

Please use

if [[ ]] ; then

Our scripts rely on bash, so I think I would specify that explicitly
instead of /bin/sh.

> +then
> +	cd "$1"
> +fi
> +
> +# No fall back is provided for tarball releases or such, as we do not yet provide releases.

Line break at 80 columns ?

Tarball releases should just ship version.h.

> +
> +# Get a short description from the tree.
> +version=$(git describe --abbrev=4 --match "v[0-9]*" 2>/dev/null)
> +
> +if test -z "$version"
> +then

if [[ -z "$version" ]] ; then

> +	# Handle an un-tagged repository
> +	sha=$(git describe --abbrev=4 --always 2>/dev/null)
> +	commits=$(git log --oneline | wc -l 2>/dev/null)
> +	version=v0.0.$commits.$sha
> +fi
> +
> +
> +git update-index --refresh > /dev/null 2>&1

What does this do ?

> +dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=

$(...) instead of `...`

> +
> +# Strip the 'g'

Anything wrong with the 'g' ? :-)

> +version=$(echo "$version" | sed -e 's/-g/-/g')
> +
> +# Fix the '-' (the patch count) to a '.' as a version increment.
> +version=$(echo "$version" | sed -e 's/-/./g')
> +
> +if test -n "$dirty"
> +then

if [[ -n "$dirty" ]] ; then

> +	version=$version-dirty
> +fi
> +
> +echo $version
> diff --git a/version.h.in b/version.h.in
> new file mode 100644
> index 000000000000..142819645b64
> --- /dev/null
> +++ b/version.h.in
> @@ -0,0 +1,3 @@

Should this have a comment stating that the file is auto-generated ?

> +#pragma once

We usually use #ifdef #define #endif, is there a specific reason to use
a #pragma instead ?

> +
> +#define LIBCAMERA_VERSION "@VCS_TAG@"

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list