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?
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