qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>,
	qemu devel list <qemu-devel@nongnu.org>
Cc: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] edk2 build scripts: work around TianoCore#1607 without forcing Python 2
Date: Wed, 18 Sep 2019 18:29:59 -0400	[thread overview]
Message-ID: <c17e512f-0b02-a2e2-64ea-d1a04470b686@redhat.com> (raw)
In-Reply-To: <20190918171141.15957-1-lersek@redhat.com>



On 9/18/19 1:11 PM, Laszlo Ersek wrote:
> It turns out that forcing python2 for running the edk2 "build" utility is
> neither necessary nor sufficient.
> 
> Forcing python2 is not sufficient for two reasons:
> 
> - QEMU is moving away from python2, with python2 nearing EOL,
> 

Thank you :)

> - according to my most recent testing, the lacking dependency information
>    in the makefiles that are generated by edk2's "build" utility can cause
>    parallel build failures even when "build" is executed by python2.
> 
> And forcing python2 is not necessary because we can still return to the
> original idea of filtering out jobserver-related options from MAKEFLAGS.
> So do that.
> 
> With this patch, the guest UEFI binaries that are used as part of the BIOS
> tables test, and the OVMF and ArmVirtQemu platform firmwares, will be
> built strictly in a single job, regardless of an outermost "-jN" make
> option. Alas, there appears to be no reliable way to build edk2 in an
> (outer make, inner make) environment, with a jobserver enabled.
> 
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Cc: John Snow <jsnow@redhat.com>
> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> Reported-by: John Snow <jsnow@redhat.com>
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>

Looks good to me, given your explanation of the situation so far.

Reviewed-by: John Snow <jsnow@redhat.com>

> ---
> 
> Notes:
>      - Tested on RHEL7 (where the outer "make" sets the old-style
>        "--jobserver-fds" flag) and on Fedora 29 (where the outer "make" sets
>        the new-style "--jobserver-auth" flag).
>      
>      - I've rebuilt all the edk2 binaries with this patch applied. Everything
>        works fine. However, if you test this patch, you might notice that git
>        reports all the build products as modified. That's because when using
>        the python3 code in edk2 BaseTools, the generated makefiles differ
>        greatly from the ones generated when running in python2 mode (e.g. due
>        to different random seeds in python hashes / dictionaries). As a
>        result, parts of the firmware volumes / firmware filesystems could
>        appear in a different order than before. This is harmless, and doesn't
>        necessitate checking in the rebuilt binaries.
> 
>   roms/edk2-build.sh             |  4 +---
>   roms/edk2-funcs.sh             | 17 +++++++++++++++++
>   tests/uefi-test-tools/build.sh |  6 +++---
>   3 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/roms/edk2-build.sh b/roms/edk2-build.sh
> index 4f46f8a6a217..8161c55ef507 100755
> --- a/roms/edk2-build.sh
> +++ b/roms/edk2-build.sh
> @@ -27,9 +27,6 @@ shift $num_args
>   
>   cd edk2
>   
> -# Work around <https://bugzilla.tianocore.org/show_bug.cgi?id=1607>.
> -export PYTHON_COMMAND=python2
> -
>   # Source "edksetup.sh" carefully.
>   set +e +u +C
>   source ./edksetup.sh
> @@ -43,6 +40,7 @@ fi
>   # any), for the edk2 "build" utility.
>   source ../edk2-funcs.sh
>   edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target")
> +MAKEFLAGS=$(qemu_edk2_quirk_tianocore_1607 "$MAKEFLAGS")
>   edk2_thread_count=$(qemu_edk2_get_thread_count "$MAKEFLAGS")
>   qemu_edk2_set_cross_env "$emulation_target"
>   
> diff --git a/roms/edk2-funcs.sh b/roms/edk2-funcs.sh
> index a9fae7ee891b..3f4485b201f1 100644
> --- a/roms/edk2-funcs.sh
> +++ b/roms/edk2-funcs.sh
> @@ -251,3 +251,20 @@ qemu_edk2_get_thread_count()
>       printf '1\n'
>     fi
>   }
> +
> +
> +# Work around <https://bugzilla.tianocore.org/show_bug.cgi?id=1607> by
> +# filtering jobserver-related flags out of MAKEFLAGS. Print the result to the
> +# standard output.
> +#
> +# Parameters:
> +#   $1: the value of the MAKEFLAGS variable
> +qemu_edk2_quirk_tianocore_1607()
> +{
> +  local makeflags="$1"
> +
> +  printf %s "$makeflags" \
> +  | LC_ALL=C sed --regexp-extended \
> +      --expression='s/--jobserver-(auth|fds)=[0-9]+,[0-9]+//' \
> +      --expression='s/-j([0-9]+)?//'
> +}
> diff --git a/tests/uefi-test-tools/build.sh b/tests/uefi-test-tools/build.sh
> index 8aa7935c43bb..eba7964a163b 100755
> --- a/tests/uefi-test-tools/build.sh
> +++ b/tests/uefi-test-tools/build.sh
> @@ -29,9 +29,6 @@ export PACKAGES_PATH=$(realpath -- "$edk2_dir")
>   export WORKSPACE=$PWD
>   mkdir -p Conf
>   
> -# Work around <https://bugzilla.tianocore.org/show_bug.cgi?id=1607>.
> -export PYTHON_COMMAND=python2
> -
>   # Source "edksetup.sh" carefully.
>   set +e +u +C
>   source "$PACKAGES_PATH/edksetup.sh"
> @@ -46,12 +43,15 @@ fi
>   source "$edk2_dir/../edk2-funcs.sh"
>   edk2_arch=$(qemu_edk2_get_arch "$emulation_target")
>   edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target")
> +MAKEFLAGS=$(qemu_edk2_quirk_tianocore_1607 "$MAKEFLAGS")
> +edk2_thread_count=$(qemu_edk2_get_thread_count "$MAKEFLAGS")
>   qemu_edk2_set_cross_env "$emulation_target"
>   
>   # Build the UEFI binary
>   mkdir -p log
>   build \
>     --arch="$edk2_arch" \
> +  -n "$edk2_thread_count" \
>     --buildtarget=DEBUG \
>     --platform=UefiTestToolsPkg/UefiTestToolsPkg.dsc \
>     --tagname="$edk2_toolchain" \
> 


  reply	other threads:[~2019-09-18 22:31 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-18 17:11 [Qemu-devel] [PATCH] edk2 build scripts: work around TianoCore#1607 without forcing Python 2 Laszlo Ersek
2019-09-18 22:29 ` John Snow [this message]
2019-09-19 13:41 ` Philippe Mathieu-Daudé
2019-09-19 18:54   ` Laszlo Ersek
2019-09-19 13:56 ` [Qemu-devel] " Philippe Mathieu-Daudé
2019-09-19 16:39 ` Philippe Mathieu-Daudé
2019-09-19 19:08   ` Laszlo Ersek
2019-09-19 19:56     ` Philippe Mathieu-Daudé
2019-09-19 21:40       ` Laszlo Ersek
2019-09-20  7:58         ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c17e512f-0b02-a2e2-64ea-d1a04470b686@redhat.com \
    --to=jsnow@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=lersek@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).