Comment 41 for bug 2002043

Revision history for this message
Andreas Hasenack (ahasenack) wrote : Re: [Bug 2002043] Re: Python extension modules get built using wrong compiler flags with python2

You can add something obvious, like -DMITCHELL_WAS_HERE :)

On Thu, 8 Feb 2024, 18:35 Mitchell Dzurick, <email address hidden>
wrote:

> That's a great idea Andreas! It's a little difficult to pinpoint the
> exact OPT flags as they are bunched up with the other compiler flags, so
> I'll add a test in addition to the current ones which makes it easier to
> see what's happening.
>
> --
> You received this bug notification because you are a member of Ubuntu
> Pythoneers, which is subscribed to python2.7 in Ubuntu.
> https://bugs.launchpad.net/bugs/2002043
>
> Title:
> Python extension modules get built using wrong compiler flags with
> python2
>
> Status in python2.7 package in Ubuntu:
> Invalid
> Status in python2.7 source package in Bionic:
> Won't Fix
> Status in python2.7 source package in Focal:
> Fix Committed
> Status in python2.7 source package in Jammy:
> Fix Committed
> Status in python2.7 source package in Kinetic:
> Invalid
> Status in python2.7 source package in Lunar:
> Invalid
> Status in python2.7 source package in Mantic:
> Invalid
>
> Bug description:
> [ Impact ]
>
> When compiling Python extensions using Python2, CFLAGS optimization
> flags are dropped.
>
> This behavior has been caused by our update in this patch
>
> http://archive.ubuntu.com/ubuntu/pool/universe/p/python2.7/python2.7_2.7.18-1~20.04.3.diff.gz
> which differs from upstream.
>
> The fix modifies the portion of code in Lib/distutils/sysconfig.py
> which gets the cflags from the environments, and includes the dropped
> OPT flag from get_config_vars().
>
> [ Test Plan ]
>
> There will be 2 separate tests for this bug:
> * Ensuring no-change rebuilds are not changed
> * Ensuring local builds are not changed unless environment variable is
> set
>
> Test 1) No-change rebuilds
>
> To test that no-change rebuilds are not changed, the package python-
> stdlib-extensions will be built against the new python2.7, and confirm
> the compiler flags are not altered. This will be a manual test and
> visual inspection of the build logs.
>
> Test 2) Functional test
>
> 1. Create test container
> $ lxc launch ubuntu:jammy jammy-2002043
> $ lxc shell ubuntu:jammy jammy-2002043
>
> 2. Install required packages
> For Jammy
> # apt update -y && apt install -y python2 python-pip
> For Focal
> # apt update -y && apt install -y python2 python-setuptools
>
> 3. Create test files
> # mkdir testprog
> # cd testprog
> # cat >setup.py <<EOL
> from setuptools import setup, Extension
>
> setup(
> name="test",
> ext_modules=[Extension("test", sources=["testmodule.c"])],
> zip_safe=False
> )
> EOL
> # cat >testmodule.c <<EOL
> #include <stdio.h>
>
> int main(void)
> {
> printf("This is test program");
> return 0;
> }
> EOL
>
> 4. Compile a test program
> # python2 setup.py build_ext --inplace
>
> 5. Check CFLAGS
> # python2 -c "import sysconfig;
> print(sysconfig.get_config_var('CFLAGS'))"
> -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
> -Wdate-time -D_FORTIFY_SOURCE=2 -g
> -ffile-prefix-map=/build/python2.7-W40Ff2/python2.7-2.7.18=. -flto=auto
> -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong
> -Wformat -Werror=format-security
>
> 6. Check the flags used to compile the test wheel
> # strings build/lib.linux-x86_64-2.7/test.so | grep -- -O
> GNU GIMPLE 11.4.0 -mtune=generic -march=x86-64 -g -g -g -g -O2
> -fno-openmp -fno-openacc -fcf-protection=full -fno-strict-aliasing -fwrapv
> -fstack-protector-strong -ffat-lto-objects -fstack-protector-strong -fPIC
> -fltrans
>
> 7. Install fixed python
> Once updated, this will simply be an apt update && apt upgrade
> # add-apt-repository ppa:mitchdz/python2.7-optimization-flags -y
> # apt install -y python2.7
> # dpkg -s python2.7 | grep Version:
> Version: 2.7.18-13ubuntu1.2~jammy9
>
> 8. Clean build
> # rm -rf build/ test.so
>
> 9. Enable opt-in environment variable
> # export APPLY_LP2002043_UBUNTU_CFLAGS_WORKAROUND=""
>
> 9. Rebuild with new python2.7 installed
> # python2 setup.py build_ext --inplace
>
> 10. Check build flags
> # strings build/lib.linux-x86_64-2.7/test.so | grep -- -O
> GNU GIMPLE 11.4.0 -mtune=generic -march=x86-64 -g -g -g -g -O2 -O2
> -fno-openmp -fno-openacc -fcf-protection=full -fno-strict-aliasing -fwrapv
> -fstack-protector-strong -ffat-lto-objects -fstack-protector-strong -fPIC
> -fltrans
> GNU C17 11.4.0 -mtune=generic -march=x86-64 -g -g -O2
> -fno-strict-aliasing -fwrapv -flto -flto -ffat-lto-objects
> -fstack-protector-strong -fPIC -fasynchronous-unwind-tables
> -fstack-protector-strong -fstack-clash-protection -fcf-protection
>
> [ Where problems could occur ]
>
> * Changing optimization flags can cause a myriad of unattended side
> effects, but the change being opt-in means the users should be aware a
> change is being made
> * The change is opt-in, so an informative message is printed to the
> console to spread awareness of the issue and how to use the workaround. A
> questionably made CI/CD system might see the new console output and flag it
> as a failure, so it is important to choose wording carefully.
>
> To manage notifications about this bug go to:
>
> https://bugs.launchpad.net/ubuntu/+source/python2.7/+bug/2002043/+subscriptions
>
> Launchpad-Notification-Type: bug
> Launchpad-Bug: distribution=ubuntu; sourcepackage=python2.7;
> component=universe; status=Invalid; importance=Undecided; assignee=None;
> Launchpad-Bug: distribution=ubuntu; distroseries=bionic;
> sourcepackage=python2.7; component=main; status=Won't Fix; importance=High;
> assignee=None;
> Launchpad-Bug: distribution=ubuntu; distroseries=focal;
> sourcepackage=python2.7; component=universe; status=Fix Committed;
> importance=High; <email address hidden>;
> Launchpad-Bug: distribution=ubuntu; distroseries=jammy;
> sourcepackage=python2.7; component=universe; status=Fix Committed;
> importance=High; <email address hidden>;
> Launchpad-Bug: distribution=ubuntu; distroseries=kinetic;
> sourcepackage=python2.7; component=None; status=Invalid; importance=High;
> assignee=None;
> Launchpad-Bug: distribution=ubuntu; distroseries=lunar;
> sourcepackage=python2.7; component=None; status=Invalid;
> importance=Undecided; assignee=None;
> Launchpad-Bug: distribution=ubuntu; distroseries=mantic;
> sourcepackage=python2.7; component=None; status=Invalid;
> importance=Undecided; assignee=None;
> Launchpad-Bug-Tags: patch se-sponsor-halves verification-needed
> verification-needed-focal verification-needed-jammy
> Launchpad-Bug-Information-Type: Public
> Launchpad-Bug-Private: no
> Launchpad-Bug-Security-Vulnerability: no
> Launchpad-Bug-Commenters: ahasenack crichton fabio.martins ghadi-rahme
> halves mitchdz nafeabd rpocase tjaalton vorlon xnox
> Launchpad-Bug-Reporter: Nafees (nafeabd)
> Launchpad-Bug-Modifier: Mitchell Dzurick (mitchdz)
> Launchpad-Message-Rationale: Subscriber (python2.7 in Ubuntu) @pythoneers
> Launchpad-Message-For: pythoneers
>
>