Message ID | 20220619192041.1113263-6-ptsneves@gmail.com |
---|---|
State | Accepted, archived |
Commit | 6edc1fffcbe1405d8c309a75643d7d6cd9a92848 |
Headers | show |
Series | [v6,1/7] python: Avoid shebang overflow on python-config.py | expand |
On 6/19/22 21:20, Paulo Neves 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..c4126a41fc > --- /dev/null > +++ b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb > @@ -0,0 +1,21 @@ > +SUMMARY = "Check that create_cmdline_shebang works" > +LICENSE = "MIT" > +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" > +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..b58c22771f 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="$(sed -ne 's/^#! *//p;q' $cmd)" > + # 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 > +} > + Maybe this has already been raised before, but the wrapper above does a couple of addtitional forks, which could be avoided if we use a python wrapper script instead. Jacob > 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) > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#167044): https://lists.openembedded.org/g/openembedded-core/message/167044 > Mute This Topic: https://lists.openembedded.org/mt/91863579/4454410 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [jacob.kroon@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
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..c4126a41fc --- /dev/null +++ b/meta-selftest/recipes-test/wrapper/cmdline-shebang-wrapper-test.bb @@ -0,0 +1,21 @@ +SUMMARY = "Check that create_cmdline_shebang works" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +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..b58c22771f 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="$(sed -ne 's/^#! *//p;q' $cmd)" + # 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)