[libcamera-devel] [PATCH v2] libcamera: skip auto version generation when building for Chromium OS

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Jul 11 09:46:57 CEST 2019


Hi Laurent,

On 11/07/2019 03:23, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Wed, Jul 10, 2019 at 09:32:31PM +0100, Kieran Bingham wrote:
>> On 10/07/2019 15:23, Paul Elder wrote:
>>> Commit b817bcec6b53 ("libcamera: Auto generate version information")
>>> causes the build to fail in the Chromium OS build environment, because
>>> git update-index tries to take a lock (ie. write) in the git repo that
>>> is outside of the build directory.
>>
>> ouch ...
>>
>>> The solution is to simply skip git update-index if we are building in
>>> the Chromium OS build environment, and this decision is made if the
>>> build directory is not a subdirectory of the source directory.
>>
>> Thanks for looking into a fix,
>>
>> Running shellcheck highlights a few improvements on this patch
>>
>>> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
>>> ---
>>> Changes in v2:
>>> - add quotes around variable accessess, and the string matcher
>>> - make the two path arguments to gen-version.sh required
>>> - actually run gen-version.sh from the needed place in meson
>>>
>>>  meson.build               |  3 ++-
>>>  src/libcamera/meson.build |  2 +-
>>>  utils/gen-version.sh      | 14 +++++++++++---
>>>  3 files changed, 14 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/meson.build b/meson.build
>>> index 8f3d0ce..99a3a80 100644
>>> --- a/meson.build
>>> +++ b/meson.build
>>> @@ -15,7 +15,8 @@ project('libcamera', 'c', 'cpp',
>>>  # git version tag, the build metadata (e.g. +211-c94a24f4) is omitted from
>>>  # libcamera_git_version.
>>>  libcamera_git_version = run_command('utils/gen-version.sh',
>>> -                                    meson.source_root()).stdout().strip()
>>> +                                    meson.source_root(),
>>> +                                    meson.build_root()).stdout().strip()
>>>  if libcamera_git_version == ''
>>>      libcamera_git_version = meson.project_version()
>>>  endif
>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>> index 97ff86e..4c442b9 100644
>>> --- a/src/libcamera/meson.build
>>> +++ b/src/libcamera/meson.build
>>> @@ -81,7 +81,7 @@ libcamera_sources += control_types_cpp
>>>  
>>>  gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
>>>  
>>> -version_cpp = vcs_tag(command : [gen_version, meson.source_root()],
>>> +version_cpp = vcs_tag(command : [gen_version, meson.source_root(), meson.build_root()],
>>>                        input : 'version.cpp.in',
>>>                        output : 'version.cpp',
>>>                        fallback : meson.project_version())
>>> diff --git a/utils/gen-version.sh b/utils/gen-version.sh
>>> index 708c01d..5005db9 100755
>>> --- a/utils/gen-version.sh
>>> +++ b/utils/gen-version.sh
>>> @@ -3,11 +3,16 @@
>>>  # SPDX-License-Identifier: GPL-2.0-or-later
>>>  # Generate a version string using git describe
>>>  
>>> -if [ -n "$1" ]
>>> +src_dir="$1"
>>> +build_dir="$2"
>>> +
>>> +if [ -z "$src_dir" -o -z "$build_dir" ]
>>
>> Shellcheck reports the following:
>>
>> In utils/gen-version.sh line 9:
>> if [ -z "$src_dir" -o -z "$build_dir" ]
>>                    ^-- SC2166: Prefer [ p ] || [ q ] as [ p -o q ] is
>> not well defined.
>>
>> So perhaps this line could be:
>>
>>  if [ -z "$src_dir" ] || [ -z "$build_dir" ]
>>
>>>  then
>>> -	cd "$1" 2>/dev/null || exit 1
>>> +	exit
>>>  fi
>>
>> It's a shame that we can't just run the command from the source tree any
>> more to get the output, but as that's just really for testing and
>> development, that's not a real issue.
> 
> We could drop the src_dir argument as the script is always run from the
> source directory by meson. Then we can make build_dir optional, as it's
> only needed to skip git update-index.

Either route is fine with me, I'm not worried about this part at the
moment. We're in control of the calling parameters at the points that we
need this.


>>> +cd "$src_dir" 2>/dev/null || exit 1
>>> +
>>>  # Bail out if the directory isn't under git control
>>>  git rev-parse --git-dir >/dev/null 2>&1 || exit 1
>>>  
>>> @@ -24,7 +29,10 @@ fi
>>>  
>>>  # Append a '-dirty' suffix if the working tree is dirty. Prevent false
>>>  # positives due to changed timestamps by running git update-index.
>>> -git update-index --refresh > /dev/null 2>&1
>>> +if [ -n "$(echo "$build_dir" | grep "$src_dir")" ]
>>
>> Shellcheck reports:
>>
>> In utils/gen-version.sh line 32:
>> if [ -n "$(echo "$build_dir" | grep "$src_dir")" ]
>>      ^-- SC2143: Use grep -q instead of comparing output with [ -n .. ].
>>
>> Perhaps this line could be:
>>
>>  if (echo "$build_dir" | grep -vq "$src_dir")
> 
> Won't the ( ... ) create a subshell that prevents the status to be
> reported up ?

The subshell should return the status should it not?

Here's a basic test to verify this:


~~~~~~~~~~~~~ check-subshell.sh ~~~~~~~~~~~~~
srcdir=/path/to/src
intreebuild=/path/to/src/build
outtreebuild=/path/to/build

# '-vq' is a quiet negated search.
# True if needle is not found in haystack
# (the logic our script wants)
if (echo "$outtreebuild" | grep -vq "$srcdir");
then
  echo "OutOfTree";
  echo "Test Pass";
else
  echo "InTree";
  echo "TEST FAIL";
fi


if (echo "$intreebuild" | grep -vq "$srcdir");
then
  echo "OutOfTree";
  echo "TEST FAIL";
else
  echo "InTree";
  echo "Test Pass";
fi
~~~~~~~~~~~~~ check-subshell.sh ~~~~~~~~~~~~~


$ /bin/bash ./check-subshell.sh
OutOfTree
Test Pass
InTree
Test Pass

$ /bin/dash ./check-subshell.sh
OutOfTree
Test Pass
InTree
Test Pass





> 
>> With shellcheck running cleanly on utils/gen-version.sh:
>>
>> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>
>>> +then
>>> +	git update-index --refresh > /dev/null 2>&1
>>> +fi
>>>  git diff-index --quiet HEAD || version="$version-dirty"
>>>  
>>>  # Replace first '-' with a '+' to denote build metadata, strip the 'g' in from
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list