[v4,6/7] utils: Add cmdline_shebang_wrapper util.

Message ID 20220614131652.566471-6-ptsneves@gmail.com
State Accepted, archived
Commit 6edc1fffcbe1405d8c309a75643d7d6cd9a92848
Headers show
Series [v4,1/7] python: Avoid shebang overflow on python-config.py | expand

Commit Message

Paulo Neves June 14, 2022, 1:16 p.m. UTC
Useful to work around shebang relocation issues, where
shebangs are too long or have arguments in them, thus preventing them
from using the /usr/bin/env shebang.
---
 .../wrapper/cmdline-shebang-wrapper-test.bb   | 21 ++++++++++++
 .../recipes-test/wrapper/files/test.awk       |  2 ++
 meta/classes/utils.bbclass                    | 34 +++++++++++++++++++
 meta/lib/oeqa/selftest/cases/wrapper.py       | 11 ++++++
 4 files changed, 68 insertions(+)
 create mode 100644 meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
 create mode 100644 meta-selftest/recipes-test/wrapper/files/test.awk
 create mode 100644 meta/lib/oeqa/selftest/cases/wrapper.py

Comments

Martin Jansa June 14, 2022, 1:39 p.m. UTC | #1
FILESEXTRAPATHS:prepend doesn't seem to be needed and LICENSE is really
CLOSED?

On Tue, Jun 14, 2022 at 3:17 PM Paulo Neves <ptsneves@gmail.com> wrote:

> Useful to work around shebang relocation issues, where
> shebangs are too long or have arguments in them, thus preventing them
> from using the /usr/bin/env shebang.
> ---
>  .../wrapper/cmdline-shebang-wrapper-test.bb   | 21 ++++++++++++
>  .../recipes-test/wrapper/files/test.awk       |  2 ++
>  meta/classes/utils.bbclass                    | 34 +++++++++++++++++++
>  meta/lib/oeqa/selftest/cases/wrapper.py       | 11 ++++++
>  4 files changed, 68 insertions(+)
>  create mode 100644 meta-selftest/recipes-test/wrapper/
> cmdline-shebang-wrapper-test.bb
>  create mode 100644 meta-selftest/recipes-test/wrapper/files/test.awk
>  create mode 100644 meta/lib/oeqa/selftest/cases/wrapper.py
>
> diff --git a/meta-selftest/recipes-test/wrapper/
> cmdline-shebang-wrapper-test.bb b/meta-selftest/recipes-test/wrapper/
> cmdline-shebang-wrapper-test.bb
> new file mode 100644
> index 0000000000..302eea8901
> --- /dev/null
> +++ b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
> @@ -0,0 +1,21 @@
> +FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
> +SUMMARY = "Check that create_cmdline_shebang works"
> +LICENSE = "CLOSED"
> +INHIBIT_DEFAULT_DEPS = "1"
> +
> +SRC_URI += "file://test.awk"
> +
> +EXCLUDE_FROM_WORLD = "1"
> +do_install() {
> +    install -d ${D}${bindir}
> +    install -m 0755 ${WORKDIR}/test.awk ${D}${bindir}/test
> +    sed -i -e 's|@AWK_BIN@|${bindir}/awk|g' ${D}${bindir}/test
> +    create_cmdline_shebang_wrapper ${D}${bindir}/test
> +    if [ $(${D}${bindir}/test) != "Don't Panic!" ]; then
> +        bbfatal "Wrapper is broken"
> +    else
> +        bbnote "Wrapper is good"
> +    fi
> +}
> +
> +BBCLASSEXTEND = "native"
> diff --git a/meta-selftest/recipes-test/wrapper/files/test.awk
> b/meta-selftest/recipes-test/wrapper/files/test.awk
> new file mode 100644
> index 0000000000..91429197b1
> --- /dev/null
> +++ b/meta-selftest/recipes-test/wrapper/files/test.awk
> @@ -0,0 +1,2 @@
> +#! @AWK_BIN@ -f
> +BEGIN { print "Don't Panic!" }
> diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass
> index b4eb3d38ab..b617632d9f 100644
> --- a/meta/classes/utils.bbclass
> +++ b/meta/classes/utils.bbclass
> @@ -184,6 +184,40 @@ END
>         chmod +x $cmd
>  }
>
> +create_cmdline_shebang_wrapper () {
> +       # Create a wrapper script where commandline options are needed
> +       #
> +       # These are useful to work around shebang relocation issues, where
> shebangs are too
> +  # long or have arguments in them, thus preventing them from using the
> /usr/bin/env
> +       # shebang
> +       #
> +       # Usage: create_cmdline_wrapper FILENAME <extra-options>
> +
> +       cmd=$1
> +       shift
> +
> +       echo "Generating wrapper script for $cmd"
> +
> +  # Strip #! and get remaining interpreter + arg
> +  argument="$(basename "$(head -n1 $cmd | sed -e 's|#![ ]*||g' )")"
> +  # strip the shebang from the real script as we do not want it to be
> usable anyway
> +  tail -n +2 $cmd > $cmd.real
> +       cmdname=$(basename $cmd)
> +       dirname=$(dirname $cmd)
> +       cmdoptions=$@
> +       if [ "${base_prefix}" != "" ]; then
> +               relpath=`python3 -c "import os;
> print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
> +               cmdoptions=`echo $@ | sed -e
> "s:${base_prefix}:\\$realdir/$relpath:g"`
> +       fi
> +       cat <<END >$cmd
> +#!/usr/bin/env bash
> +realpath=\`readlink -fn \$0\`
> +realdir=\`dirname \$realpath\`
> +exec -a \$realdir/$cmdname $argument \$realdir/$cmdname.real $cmdoptions
> "\$@"
> +END
> +       chmod +x $cmd
> +}
> +
>  create_wrapper () {
>         # Create a wrapper script where extra environment variables are
> needed
>         #
> diff --git a/meta/lib/oeqa/selftest/cases/wrapper.py
> b/meta/lib/oeqa/selftest/cases/wrapper.py
> new file mode 100644
> index 0000000000..6de63310c0
> --- /dev/null
> +++ b/meta/lib/oeqa/selftest/cases/wrapper.py
> @@ -0,0 +1,11 @@
> +from oeqa.selftest.case import OESelftestTestCase
> +from oeqa.utils.commands import bitbake
> +
> +class WrapperTests(OESelftestTestCase):
> +    def test_shebang_wrapper(self):
> +        """
> +        Summary:   Build a recipe which will fail if the
> cmdline_shebang_wrapper function is defective.
> +        Expected:  Exit status to be 0.
> +        Author:    Paulo Neves <ptsneves@gmail.com>
> +        """
> +        res = bitbake("cmdline-shebang-wrapper-test -c install",
> ignore_status=False)
> --
> 2.25.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#166887):
> https://lists.openembedded.org/g/openembedded-core/message/166887
> Mute This Topic: https://lists.openembedded.org/mt/91748692/3617156
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> Martin.Jansa@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
Paulo Neves June 14, 2022, 1:46 p.m. UTC | #2
Regarding the FILESEXTRAPATHS:prepend  i was convinced that 
${THISDIR}/files was not automatically added and was needed for the 
test.awk file. I guess I have been cargo culting for some time on this. 
Will remove it.

This is a recipe for a test and if i add a license different than CLOSED 
than i need to add a license file, which seems a bit overkill for a one 
line. Am I wrong? What license should it even be? Dont Panic is a common 
string used in awk docs.

Paulo Neves

On 6/14/22 15:39, Martin Jansa wrote:
> FILESEXTRAPATHS:prepend doesn't seem to be needed and LICENSE is 
> really CLOSED?
>
> On Tue, Jun 14, 2022 at 3:17 PM Paulo Neves <ptsneves@gmail.com> wrote:
>
>     Useful to work around shebang relocation issues, where
>     shebangs are too long or have arguments in them, thus preventing them
>     from using the /usr/bin/env shebang.
>     ---
>      .../wrapper/cmdline-shebang-wrapper-test.bb
>     <http://cmdline-shebang-wrapper-test.bb>  | 21 ++++++++++++
>      .../recipes-test/wrapper/files/test.awk       |  2 ++
>      meta/classes/utils.bbclass                    | 34
>     +++++++++++++++++++
>      meta/lib/oeqa/selftest/cases/wrapper.py       | 11 ++++++
>      4 files changed, 68 insertions(+)
>      create mode 100644
>     meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>     <http://cmdline-shebang-wrapper-test.bb>
>      create mode 100644 meta-selftest/recipes-test/wrapper/files/test.awk
>      create mode 100644 meta/lib/oeqa/selftest/cases/wrapper.py
>
>     diff --git
>     a/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>     <http://cmdline-shebang-wrapper-test.bb>
>     b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>     <http://cmdline-shebang-wrapper-test.bb>
>     new file mode 100644
>     index 0000000000..302eea8901
>     --- /dev/null
>     +++
>     b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>     <http://cmdline-shebang-wrapper-test.bb>
>     @@ -0,0 +1,21 @@
>     +FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
>     +SUMMARY = "Check that create_cmdline_shebang works"
>     +LICENSE = "CLOSED"
>     +INHIBIT_DEFAULT_DEPS = "1"
>     +
>     +SRC_URI += "file://test.awk"
>     +
>     +EXCLUDE_FROM_WORLD = "1"
>     +do_install() {
>     +    install -d ${D}${bindir}
>     +    install -m 0755 ${WORKDIR}/test.awk ${D}${bindir}/test
>     +    sed -i -e 's|@AWK_BIN@|${bindir}/awk|g' ${D}${bindir}/test
>     +    create_cmdline_shebang_wrapper ${D}${bindir}/test
>     +    if [ $(${D}${bindir}/test) != "Don't Panic!" ]; then
>     +        bbfatal "Wrapper is broken"
>     +    else
>     +        bbnote "Wrapper is good"
>     +    fi
>     +}
>     +
>     +BBCLASSEXTEND = "native"
>     diff --git a/meta-selftest/recipes-test/wrapper/files/test.awk
>     b/meta-selftest/recipes-test/wrapper/files/test.awk
>     new file mode 100644
>     index 0000000000..91429197b1
>     --- /dev/null
>     +++ b/meta-selftest/recipes-test/wrapper/files/test.awk
>     @@ -0,0 +1,2 @@
>     +#! @AWK_BIN@ -f
>     +BEGIN { print "Don't Panic!" }
>     diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass
>     index b4eb3d38ab..b617632d9f 100644
>     --- a/meta/classes/utils.bbclass
>     +++ b/meta/classes/utils.bbclass
>     @@ -184,6 +184,40 @@ END
>             chmod +x $cmd
>      }
>
>     +create_cmdline_shebang_wrapper () {
>     +       # Create a wrapper script where commandline options are needed
>     +       #
>     +       # These are useful to work around shebang relocation
>     issues, where shebangs are too
>     +  # long or have arguments in them, thus preventing them from
>     using the /usr/bin/env
>     +       # shebang
>     +       #
>     +       # Usage: create_cmdline_wrapper FILENAME <extra-options>
>     +
>     +       cmd=$1
>     +       shift
>     +
>     +       echo "Generating wrapper script for $cmd"
>     +
>     +  # Strip #! and get remaining interpreter + arg
>     +  argument="$(basename "$(head -n1 $cmd | sed -e 's|#![ ]*||g' )")"
>     +  # strip the shebang from the real script as we do not want it
>     to be usable anyway
>     +  tail -n +2 $cmd > $cmd.real
>     +       cmdname=$(basename $cmd)
>     +       dirname=$(dirname $cmd)
>     +       cmdoptions=$@
>     +       if [ "${base_prefix}" != "" ]; then
>     +               relpath=`python3 -c "import os;
>     print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
>     +               cmdoptions=`echo $@ | sed -e
>     "s:${base_prefix}:\\$realdir/$relpath:g"`
>     +       fi
>     +       cat <<END >$cmd
>     +#!/usr/bin/env bash
>     +realpath=\`readlink -fn \$0\`
>     +realdir=\`dirname \$realpath\`
>     +exec -a \$realdir/$cmdname $argument \$realdir/$cmdname.real
>     $cmdoptions "\$@"
>     +END
>     +       chmod +x $cmd
>     +}
>     +
>      create_wrapper () {
>             # Create a wrapper script where extra environment
>     variables are needed
>             #
>     diff --git a/meta/lib/oeqa/selftest/cases/wrapper.py
>     b/meta/lib/oeqa/selftest/cases/wrapper.py
>     new file mode 100644
>     index 0000000000..6de63310c0
>     --- /dev/null
>     +++ b/meta/lib/oeqa/selftest/cases/wrapper.py
>     @@ -0,0 +1,11 @@
>     +from oeqa.selftest.case import OESelftestTestCase
>     +from oeqa.utils.commands import bitbake
>     +
>     +class WrapperTests(OESelftestTestCase):
>     +    def test_shebang_wrapper(self):
>     +        """
>     +        Summary:   Build a recipe which will fail if the
>     cmdline_shebang_wrapper function is defective.
>     +        Expected:  Exit status to be 0.
>     +        Author:    Paulo Neves <ptsneves@gmail.com>
>     +        """
>     +        res = bitbake("cmdline-shebang-wrapper-test -c install",
>     ignore_status=False)
>     -- 
>     2.25.1
>
>
>     
>
Martin Jansa June 14, 2022, 2:17 p.m. UTC | #3
You can use bitbake-getvar to see the default FILESPATH, but "files" next
to recipe is included by default (I prefer to use BPN directory for
slightly faster lookup - unless the files are shared between different
recipes). FILESEXTRAPATHS is usually only needed from bbappends which add
new files to SRC_URI.

For LICENSE you can use MIT and
LIC_FILES_CHKSUM =
"file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
like many "pure-metadata" recipes in oe-core.

On Tue, Jun 14, 2022 at 3:46 PM Paulo Neves <ptsneves@gmail.com> wrote:

> Regarding the FILESEXTRAPATHS:prepend  i was convinced that
> ${THISDIR}/files was not automatically added and was needed for the
> test.awk file. I guess I have been cargo culting for some time on this.
> Will remove it.
>
> This is a recipe for a test and if i add a license different than CLOSED
> than i need to add a license file, which seems a bit overkill for a one
> line. Am I wrong? What license should it even be? Dont Panic is a common
> string used in awk docs.
>
> Paulo Neves
>
> On 6/14/22 15:39, Martin Jansa wrote:
>
> FILESEXTRAPATHS:prepend doesn't seem to be needed and LICENSE is really
> CLOSED?
>
> On Tue, Jun 14, 2022 at 3:17 PM Paulo Neves <ptsneves@gmail.com> wrote:
>
>> Useful to work around shebang relocation issues, where
>> shebangs are too long or have arguments in them, thus preventing them
>> from using the /usr/bin/env shebang.
>> ---
>>  .../wrapper/cmdline-shebang-wrapper-test.bb   | 21 ++++++++++++
>>  .../recipes-test/wrapper/files/test.awk       |  2 ++
>>  meta/classes/utils.bbclass                    | 34 +++++++++++++++++++
>>  meta/lib/oeqa/selftest/cases/wrapper.py       | 11 ++++++
>>  4 files changed, 68 insertions(+)
>>  create mode 100644 meta-selftest/recipes-test/wrapper/
>> cmdline-shebang-wrapper-test.bb
>>  create mode 100644 meta-selftest/recipes-test/wrapper/files/test.awk
>>  create mode 100644 meta/lib/oeqa/selftest/cases/wrapper.py
>>
>> diff --git a/meta-selftest/recipes-test/wrapper/
>> cmdline-shebang-wrapper-test.bb b/meta-selftest/recipes-test/wrapper/
>> cmdline-shebang-wrapper-test.bb
>> new file mode 100644
>> index 0000000000..302eea8901
>> --- /dev/null
>> +++ b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>> @@ -0,0 +1,21 @@
>> +FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
>> +SUMMARY = "Check that create_cmdline_shebang works"
>> +LICENSE = "CLOSED"
>> +INHIBIT_DEFAULT_DEPS = "1"
>> +
>> +SRC_URI += "file://test.awk"
>> +
>> +EXCLUDE_FROM_WORLD = "1"
>> +do_install() {
>> +    install -d ${D}${bindir}
>> +    install -m 0755 ${WORKDIR}/test.awk ${D}${bindir}/test
>> +    sed -i -e 's|@AWK_BIN@|${bindir}/awk|g' ${D}${bindir}/test
>> +    create_cmdline_shebang_wrapper ${D}${bindir}/test
>> +    if [ $(${D}${bindir}/test) != "Don't Panic!" ]; then
>> +        bbfatal "Wrapper is broken"
>> +    else
>> +        bbnote "Wrapper is good"
>> +    fi
>> +}
>> +
>> +BBCLASSEXTEND = "native"
>> diff --git a/meta-selftest/recipes-test/wrapper/files/test.awk
>> b/meta-selftest/recipes-test/wrapper/files/test.awk
>> new file mode 100644
>> index 0000000000..91429197b1
>> --- /dev/null
>> +++ b/meta-selftest/recipes-test/wrapper/files/test.awk
>> @@ -0,0 +1,2 @@
>> +#! @AWK_BIN@ -f
>> +BEGIN { print "Don't Panic!" }
>> diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass
>> index b4eb3d38ab..b617632d9f 100644
>> --- a/meta/classes/utils.bbclass
>> +++ b/meta/classes/utils.bbclass
>> @@ -184,6 +184,40 @@ END
>>         chmod +x $cmd
>>  }
>>
>> +create_cmdline_shebang_wrapper () {
>> +       # Create a wrapper script where commandline options are needed
>> +       #
>> +       # These are useful to work around shebang relocation issues,
>> where shebangs are too
>> +  # long or have arguments in them, thus preventing them from using the
>> /usr/bin/env
>> +       # shebang
>> +       #
>> +       # Usage: create_cmdline_wrapper FILENAME <extra-options>
>> +
>> +       cmd=$1
>> +       shift
>> +
>> +       echo "Generating wrapper script for $cmd"
>> +
>> +  # Strip #! and get remaining interpreter + arg
>> +  argument="$(basename "$(head -n1 $cmd | sed -e 's|#![ ]*||g' )")"
>> +  # strip the shebang from the real script as we do not want it to be
>> usable anyway
>> +  tail -n +2 $cmd > $cmd.real
>> +       cmdname=$(basename $cmd)
>> +       dirname=$(dirname $cmd)
>> +       cmdoptions=$@
>> +       if [ "${base_prefix}" != "" ]; then
>> +               relpath=`python3 -c "import os;
>> print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
>> +               cmdoptions=`echo $@ | sed -e
>> "s:${base_prefix}:\\$realdir/$relpath:g"`
>> +       fi
>> +       cat <<END >$cmd
>> +#!/usr/bin/env bash
>> +realpath=\`readlink -fn \$0\`
>> +realdir=\`dirname \$realpath\`
>> +exec -a \$realdir/$cmdname $argument \$realdir/$cmdname.real $cmdoptions
>> "\$@"
>> +END
>> +       chmod +x $cmd
>> +}
>> +
>>  create_wrapper () {
>>         # Create a wrapper script where extra environment variables are
>> needed
>>         #
>> diff --git a/meta/lib/oeqa/selftest/cases/wrapper.py
>> b/meta/lib/oeqa/selftest/cases/wrapper.py
>> new file mode 100644
>> index 0000000000..6de63310c0
>> --- /dev/null
>> +++ b/meta/lib/oeqa/selftest/cases/wrapper.py
>> @@ -0,0 +1,11 @@
>> +from oeqa.selftest.case import OESelftestTestCase
>> +from oeqa.utils.commands import bitbake
>> +
>> +class WrapperTests(OESelftestTestCase):
>> +    def test_shebang_wrapper(self):
>> +        """
>> +        Summary:   Build a recipe which will fail if the
>> cmdline_shebang_wrapper function is defective.
>> +        Expected:  Exit status to be 0.
>> +        Author:    Paulo Neves <ptsneves@gmail.com>
>> +        """
>> +        res = bitbake("cmdline-shebang-wrapper-test -c install",
>> ignore_status=False)
>> --
>> 2.25.1
>>
>>
>> -=-=-=-=-=-=-=-=-=-=-=-
>> Links: You receive all messages sent to this group.
>> View/Reply Online (#166887):
>> https://lists.openembedded.org/g/openembedded-core/message/166887
>> Mute This Topic: https://lists.openembedded.org/mt/91748692/3617156
>> Group Owner: openembedded-core+owner@lists.openembedded.org
>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
>> Martin.Jansa@gmail.com]
>> -=-=-=-=-=-=-=-=-=-=-=-
>>
>>
>
Paulo Neves June 14, 2022, 3:12 p.m. UTC | #4
Thanks for the great tips. Yeah the habit of using the FILESPATH is that 
mostly I work on bbappends. Today i learned.

I sent a new v5 with the corrections you mention.

Paulo Neves

On 6/14/22 16:17, Martin Jansa wrote:
> You can use bitbake-getvar to see the default FILESPATH, but "files" 
> next to recipe is included by default (I prefer to use BPN directory 
> for slightly faster lookup - unless the files are shared between 
> different recipes). FILESEXTRAPATHS is usually only needed from 
> bbappends which add new files to SRC_URI.
>
> For LICENSE you can use MIT and
> LIC_FILES_CHKSUM = 
> "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
> like many "pure-metadata" recipes in oe-core.
>
> On Tue, Jun 14, 2022 at 3:46 PM Paulo Neves <ptsneves@gmail.com> wrote:
>
>     Regarding the FILESEXTRAPATHS:prepend  i was convinced that
>     ${THISDIR}/files was not automatically added and was needed for
>     the test.awk file. I guess I have been cargo culting for some time
>     on this. Will remove it.
>
>     This is a recipe for a test and if i add a license different than
>     CLOSED than i need to add a license file, which seems a bit
>     overkill for a one line. Am I wrong? What license should it even
>     be? Dont Panic is a common string used in awk docs.
>
>     Paulo Neves
>
>     On 6/14/22 15:39, Martin Jansa wrote:
>>     FILESEXTRAPATHS:prepend doesn't seem to be needed and LICENSE is
>>     really CLOSED?
>>
>>     On Tue, Jun 14, 2022 at 3:17 PM Paulo Neves <ptsneves@gmail.com>
>>     wrote:
>>
>>         Useful to work around shebang relocation issues, where
>>         shebangs are too long or have arguments in them, thus
>>         preventing them
>>         from using the /usr/bin/env shebang.
>>         ---
>>          .../wrapper/cmdline-shebang-wrapper-test.bb
>>         <http://cmdline-shebang-wrapper-test.bb>  | 21 ++++++++++++
>>          .../recipes-test/wrapper/files/test.awk       |  2 ++
>>          meta/classes/utils.bbclass                    | 34
>>         +++++++++++++++++++
>>          meta/lib/oeqa/selftest/cases/wrapper.py       | 11 ++++++
>>          4 files changed, 68 insertions(+)
>>          create mode 100644
>>         meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>>         <http://cmdline-shebang-wrapper-test.bb>
>>          create mode 100644
>>         meta-selftest/recipes-test/wrapper/files/test.awk
>>          create mode 100644 meta/lib/oeqa/selftest/cases/wrapper.py
>>
>>         diff --git
>>         a/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>>         <http://cmdline-shebang-wrapper-test.bb>
>>         b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>>         <http://cmdline-shebang-wrapper-test.bb>
>>         new file mode 100644
>>         index 0000000000..302eea8901
>>         --- /dev/null
>>         +++
>>         b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
>>         <http://cmdline-shebang-wrapper-test.bb>
>>         @@ -0,0 +1,21 @@
>>         +FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
>>         +SUMMARY = "Check that create_cmdline_shebang works"
>>         +LICENSE = "CLOSED"
>>         +INHIBIT_DEFAULT_DEPS = "1"
>>         +
>>         +SRC_URI += "file://test.awk"
>>         +
>>         +EXCLUDE_FROM_WORLD = "1"
>>         +do_install() {
>>         +    install -d ${D}${bindir}
>>         +    install -m 0755 ${WORKDIR}/test.awk ${D}${bindir}/test
>>         +    sed -i -e 's|@AWK_BIN@|${bindir}/awk|g' ${D}${bindir}/test
>>         +    create_cmdline_shebang_wrapper ${D}${bindir}/test
>>         +    if [ $(${D}${bindir}/test) != "Don't Panic!" ]; then
>>         +        bbfatal "Wrapper is broken"
>>         +    else
>>         +        bbnote "Wrapper is good"
>>         +    fi
>>         +}
>>         +
>>         +BBCLASSEXTEND = "native"
>>         diff --git
>>         a/meta-selftest/recipes-test/wrapper/files/test.awk
>>         b/meta-selftest/recipes-test/wrapper/files/test.awk
>>         new file mode 100644
>>         index 0000000000..91429197b1
>>         --- /dev/null
>>         +++ b/meta-selftest/recipes-test/wrapper/files/test.awk
>>         @@ -0,0 +1,2 @@
>>         +#! @AWK_BIN@ -f
>>         +BEGIN { print "Don't Panic!" }
>>         diff --git a/meta/classes/utils.bbclass
>>         b/meta/classes/utils.bbclass
>>         index b4eb3d38ab..b617632d9f 100644
>>         --- a/meta/classes/utils.bbclass
>>         +++ b/meta/classes/utils.bbclass
>>         @@ -184,6 +184,40 @@ END
>>                 chmod +x $cmd
>>          }
>>
>>         +create_cmdline_shebang_wrapper () {
>>         +       # Create a wrapper script where commandline options
>>         are needed
>>         +       #
>>         +       # These are useful to work around shebang relocation
>>         issues, where shebangs are too
>>         +  # long or have arguments in them, thus preventing them
>>         from using the /usr/bin/env
>>         +       # shebang
>>         +       #
>>         +       # Usage: create_cmdline_wrapper FILENAME <extra-options>
>>         +
>>         +       cmd=$1
>>         +       shift
>>         +
>>         +       echo "Generating wrapper script for $cmd"
>>         +
>>         +  # Strip #! and get remaining interpreter + arg
>>         +  argument="$(basename "$(head -n1 $cmd | sed -e 's|#![
>>         ]*||g' )")"
>>         +  # strip the shebang from the real script as we do not want
>>         it to be usable anyway
>>         +  tail -n +2 $cmd > $cmd.real
>>         +       cmdname=$(basename $cmd)
>>         +       dirname=$(dirname $cmd)
>>         +       cmdoptions=$@
>>         +       if [ "${base_prefix}" != "" ]; then
>>         +               relpath=`python3 -c "import os;
>>         print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
>>         +               cmdoptions=`echo $@ | sed -e
>>         "s:${base_prefix}:\\$realdir/$relpath:g"`
>>         +       fi
>>         +       cat <<END >$cmd
>>         +#!/usr/bin/env bash
>>         +realpath=\`readlink -fn \$0\`
>>         +realdir=\`dirname \$realpath\`
>>         +exec -a \$realdir/$cmdname $argument \$realdir/$cmdname.real
>>         $cmdoptions "\$@"
>>         +END
>>         +       chmod +x $cmd
>>         +}
>>         +
>>          create_wrapper () {
>>                 # Create a wrapper script where extra environment
>>         variables are needed
>>                 #
>>         diff --git a/meta/lib/oeqa/selftest/cases/wrapper.py
>>         b/meta/lib/oeqa/selftest/cases/wrapper.py
>>         new file mode 100644
>>         index 0000000000..6de63310c0
>>         --- /dev/null
>>         +++ b/meta/lib/oeqa/selftest/cases/wrapper.py
>>         @@ -0,0 +1,11 @@
>>         +from oeqa.selftest.case import OESelftestTestCase
>>         +from oeqa.utils.commands import bitbake
>>         +
>>         +class WrapperTests(OESelftestTestCase):
>>         +    def test_shebang_wrapper(self):
>>         +        """
>>         +        Summary:   Build a recipe which will fail if the
>>         cmdline_shebang_wrapper function is defective.
>>         +        Expected:  Exit status to be 0.
>>         +        Author:    Paulo Neves <ptsneves@gmail.com>
>>         +        """
>>         +        res = bitbake("cmdline-shebang-wrapper-test -c
>>         install", ignore_status=False)
>>         -- 
>>         2.25.1
>>
>>
>>         
>>
>

Patch

diff --git a/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
new file mode 100644
index 0000000000..302eea8901
--- /dev/null
+++ b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb
@@ -0,0 +1,21 @@ 
+FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
+SUMMARY = "Check that create_cmdline_shebang works"
+LICENSE = "CLOSED"
+INHIBIT_DEFAULT_DEPS = "1"
+
+SRC_URI += "file://test.awk"
+
+EXCLUDE_FROM_WORLD = "1"
+do_install() {
+    install -d ${D}${bindir}
+    install -m 0755 ${WORKDIR}/test.awk ${D}${bindir}/test
+    sed -i -e 's|@AWK_BIN@|${bindir}/awk|g' ${D}${bindir}/test
+    create_cmdline_shebang_wrapper ${D}${bindir}/test
+    if [ $(${D}${bindir}/test) != "Don't Panic!" ]; then
+        bbfatal "Wrapper is broken"
+    else
+        bbnote "Wrapper is good"
+    fi
+}
+
+BBCLASSEXTEND = "native"
diff --git a/meta-selftest/recipes-test/wrapper/files/test.awk b/meta-selftest/recipes-test/wrapper/files/test.awk
new file mode 100644
index 0000000000..91429197b1
--- /dev/null
+++ b/meta-selftest/recipes-test/wrapper/files/test.awk
@@ -0,0 +1,2 @@ 
+#! @AWK_BIN@ -f
+BEGIN { print "Don't Panic!" }
diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass
index b4eb3d38ab..b617632d9f 100644
--- a/meta/classes/utils.bbclass
+++ b/meta/classes/utils.bbclass
@@ -184,6 +184,40 @@  END
 	chmod +x $cmd
 }
 
+create_cmdline_shebang_wrapper () {
+	# Create a wrapper script where commandline options are needed
+	#
+	# These are useful to work around shebang relocation issues, where shebangs are too
+  # long or have arguments in them, thus preventing them from using the /usr/bin/env
+	# shebang
+	#
+	# Usage: create_cmdline_wrapper FILENAME <extra-options>
+
+	cmd=$1
+	shift
+
+	echo "Generating wrapper script for $cmd"
+
+  # Strip #! and get remaining interpreter + arg
+  argument="$(basename "$(head -n1 $cmd | sed -e 's|#![ ]*||g' )")"
+  # strip the shebang from the real script as we do not want it to be usable anyway
+  tail -n +2 $cmd > $cmd.real
+	cmdname=$(basename $cmd)
+	dirname=$(dirname $cmd)
+	cmdoptions=$@
+	if [ "${base_prefix}" != "" ]; then
+		relpath=`python3 -c "import os; print(os.path.relpath('${D}${base_prefix}', '$dirname'))"`
+		cmdoptions=`echo $@ | sed -e "s:${base_prefix}:\\$realdir/$relpath:g"`
+	fi
+	cat <<END >$cmd
+#!/usr/bin/env bash
+realpath=\`readlink -fn \$0\`
+realdir=\`dirname \$realpath\`
+exec -a \$realdir/$cmdname $argument \$realdir/$cmdname.real $cmdoptions "\$@"
+END
+	chmod +x $cmd
+}
+
 create_wrapper () {
 	# Create a wrapper script where extra environment variables are needed
 	#
diff --git a/meta/lib/oeqa/selftest/cases/wrapper.py b/meta/lib/oeqa/selftest/cases/wrapper.py
new file mode 100644
index 0000000000..6de63310c0
--- /dev/null
+++ b/meta/lib/oeqa/selftest/cases/wrapper.py
@@ -0,0 +1,11 @@ 
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.utils.commands import bitbake
+
+class WrapperTests(OESelftestTestCase):
+    def test_shebang_wrapper(self):
+        """
+        Summary:   Build a recipe which will fail if the cmdline_shebang_wrapper function is defective.
+        Expected:  Exit status to be 0.
+        Author:    Paulo Neves <ptsneves@gmail.com>
+        """
+        res = bitbake("cmdline-shebang-wrapper-test -c install", ignore_status=False)