Re: Fedora 32 System-Wide Change proposal: Use update-alternatives for /usr/bin/cc and /usr/bin/c++

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 20, 2019 at 5:25 PM Tom Stellard <tstellar@xxxxxxxxxx> wrote:
>
> On 12/20/2019 03:20 PM, Neal Gompa wrote:
> > On Fri, Dec 20, 2019 at 5:19 PM Tom Stellard <tstellar@xxxxxxxxxx> wrote:
> >>
> >> On 12/20/2019 02:01 PM, Neal Gompa wrote:
> >>> On Fri, Dec 20, 2019 at 3:24 PM Tom Stellard <tstellar@xxxxxxxxxx> wrote:
> >>>>
> >>>> On 12/20/2019 03:33 AM, Nicolas Chauvet wrote:
> >>>>> Le jeu. 19 déc. 2019 à 22:44, Ben Cotton <bcotton@xxxxxxxxxx> a écrit :
> >>>>>>
> >>>>>> https://fedoraproject.org/wiki/Changes/Use-Update-Alternatives-For-usr-bin-cc
> >>>>>>
> >>>>>> == Summary ==
> >>>>>> Modify the gcc package so that the /usr/bin/cc and /usr/bin/c++
> >>>>>> symlinks are managed by update-alternatives.
> >>>>>>
> >>>>>> == Owner ==
> >>>>>> * Name: [[User:tstellar| Tom Stellard]]
> >>>>>> * Email: <tstellar@xxxxxxxxxx>
> >>>>>>
> >>>>>> == Detailed Description ==
> >>>>>> The gcc package currently installs symlinks to /usr/bin/cc and
> >>>>>> /usr/bin/c++ which point to /usr/bin/gcc and /usr/bin/g++
> >>>>>> respectively.  For this change, the gcc package will be modified so
> >>>>>> that update-alternatives creates and manages these symlinks.
> >>>>>>
> >>>>>> In addition to modifying the gcc package, the clang package will be
> >>>>>> modified so that /usr/bin/clang and /usr/bin/clang++ can be used as
> >>>>>> alternatives for /usr/bin/cc and /usr/bin/c++.  The clang alternatives
> >>>>>> will have a lower priority than the gcc alternatives, so that by
> >>>>>> default, gcc will provide the /usr/bin/cc and /usr/bin/c++
> >>>>>> implementations.
> >>>>>>
> >>>>>> The clang package currently has a run-time dependency on gcc, so this
> >>>>>> ensures that gcc will always provide the default implementation,
> >>>>>> because it's impossible to install clang without gcc.
> >>>>>>
> >>>>>> The only way users will be able to change the /usr/bin/cc or
> >>>>>> /usr/bin/c++ implementations will be by explicitly using the
> >>>>>> update-alternatives tool.
> >>>>>>
> >>>>>> == Benefit to Fedora ==
> >>>>>> Many build systems default to using /usr/bin/cc and /usr/bin/c++ as
> >>>>>> the default C/C++ compilers.  Being able to easily swap out these
> >>>>>> implementation will provide a lot of flexibility within Fedora for
> >>>>>> doing things like:
> >>>>>>
> >>>>>> * Setting up alternative buildroots for testing.
> >>>>>> * Installing a gcc wrapper script to /usr/bin/cc to help migrate
> >>>>>> packages to new compiler flags or to capture statistics about compiler
> >>>>>> usage.
> >>>>>> * Letting users experiment easily with alternate compilers.
> >>>>>> * Easily switch between system gcc and a development version of gcc.
> >>>>>>
> >>>>>> == Scope ==
> >>>>>> * Proposal owners: The proposal owner will implement the necessary
> >>>>>> changes in the gcc and clang packages.
> >>>>>>
> >>>>>> * Other developers: The gcc maintainers will be responsible for
> >>>>>> reviewing and approving changes to the gcc package.
> >>>>>>
> >>>>>> * Release engineering: (a check of an impact with Release Engineering is needed)
> >>>>>> * Policies and guidelines: No policies or guidelines will need to be
> >>>>>> updated as a result of this change.
> >>>>>> * Trademark approval: N/A (not needed for this Change)
> >>>>>>
> >>>>>>
> >>>>>> == Upgrade/compatibility impact ==
> >>>>>> This change should not impact upgradeability.
> >>>>>>
> >>>>>> == How To Test ==
> >>>>>> CI tests will be added to the gcc package to ensure that /usr/bin/cc
> >>>>>> and /usr/bin/c++ still point to /usr/bin/gcc and /usr/bin/g++ when
> >>>>>> installed.  There will also be a CI test added to the clang package to
> >>>>>> ensure that /usr/bin/gcc and /usr/bin/g++ remain the default when
> >>>>>> clang is installed.
> >>>>>>
> >>>>>> == User Experience ==
> >>>>>> This change will give users a much better way to experiment using
> >>>>>> other compilers for their own development.  They will be able to
> >>>>>> easily switch between different compilers without having to modify
> >>>>>> their projects build system or make non-standard changes to their
> >>>>>> Fedora system.
> >>>>>>
> >>>>>> == Dependencies ==
> >>>>>> This change has no other dependencies besides the changes to the gcc
> >>>>>> and clang packages.
> >>>>>>
> >>>>>> == Contingency Plan ==
> >>>>>> * Contingency mechanism: (What to do?  Who will do it?) Proposal Owner
> >>>>>> will revert changes made to gcc and clang packages and rebuild.
> >>>>>> * Contingency deadline: If the changes are not complete by 2 weeks
> >>>>>> before the mass rebuild, then we will consider postponing to the next
> >>>>>> Fedora release and back out any changes that were made.
> >>>>>> * Blocks release? No
> >>>>>> * Blocks product? None
> >>>>>>
> >>>>>> == Documentation ==
> >>>>>> Release notes will be added for this change.
> >>>>>>
> >>>>>> == Release Notes ==
> >>>>>> The user /usr/bin/cc and /usr/bin/c++ symlinks are now managed by
> >>>>>> update-alternatives.  If you would like to change these symlinks to
> >>>>>> point to another compiler, like clang, for example, you can use these
> >>>>>> commands:
> >>>>>>
> >>>>>> `update-alternatives --set cc /usr/bin/clang`
> >>>>>>
> >>>>>> `update-alternatives --set c++ /usr/bin/clang++`
> >>>>>
> >>>>> Does this process even works in RPM context ? given rpm -E %{__cc}
> >>>>> outputs gcc, I don't think /usr/bin/cc is ever used anywhere. (same
> >>>>> for __cxx, __cpp)
> >>>>
> >>>> /usr/bin/cc is the default compiler for cmake projects.
> >>>>
> >>>>> If that's only supposed to work in a local compilation context (not
> >>>>> with RPM), what is the benefit from using alternatives rather than
> >>>>> export CC=clang ?
> >>>>
> >>>> I'm actually not sure how much better alternatives is that using only CC=clang.
> >>>> I haven't done a full rebuild with only CC=clang and without
> >>>> the proposed /usr/bin/cc alternative pointing to clang to see what the
> >>>> numbers look like.
> >>>>
> >>>> What I have done is build all the packages that depend on gcc with /usr/bin/cc
> >>>> pointing to clang and also CC=/usr/bin/cc (and the same for the c++ compilers).
> >>>> With these changes at least 1281 of 4271 packages still build with gcc.
> >>>> So the best case scenario for CC=/usr/bin/clang is that it will work for about 70%
> >>>> of packages.
> >>>>
> >>>>> What about ccache ? (does it need to also be registered with alternatives) ?
> >>>>>
> >>>>
> >>>> No, because if you want to use ccache with the cc compiler you run:
> >>>> /usr/lib64/ccache/cc
> >>>>
> >>>>
> >>>>> As I imagine, setting clang for a given package with such alternatives
> >>>>> would requires to add a BR of some clang-default that will call
> >>>>> alternatives in %post.
> >>>>> At first sight, I would dramatically prefer to have a RPM macro that
> >>>>> would set __cc, __cpp,__cxx and the relevant cflags ldflgas in %prep.
> >>>>> (and eventually another macro that would set then back to default).
> >>>>>
> >>>>
> >>>> This is something I have been looking at as well, but less as a solution
> >>>> to the "mass-rebuilds with clang" problem, and more focused on getting
> >>>> a consistent experience for packages that currently do build with clang.
> >>>> e.g.
> >>>>
> >>>> %enable_cc_clang \
> >>>>   %__cc clang \
> >>>>   %__cxx clang++ \
> >>>>   %__cpp clang-cpp \
> >>>>   %global optflags %(echo %{optflags} | sed -e-e 's/-fstack-clash-protection//g')
> >>>>
> >>>> I think this is something packages could use in %prep, but it would be nice to
> >>>> take this a step further and have something we could conditionally enable for all packages
> >>>> to allow the kinds of mass rebuilds I would like to try.  I just haven't been able to
> >>>> figure out the best way to do this yet.  If you have any suggestions for how to
> >>>> make this work, I would like to hear them.
> >>>>
> >>>
> >>> Since Koji 1.18, you can set macros on a Koji tag, which would
> >>> influence the settings of the package build underneath it. If your
> >>> mass building is done in a Koji instance, that's a way to do it.
> >>> Alternatively, if you have an Open Build Service instance, you can set
> >>> the macro at the OBS project level, import all the Fedora sources, and
> >>> watch it rebuild with a different compiler automatically.
> >>>
> >>
> >> This is good to know.  For now I'm experimenting with mock + jenkins, but
> >> I would like to move to koji at some point int the future.
> >>
> >> One question I have about a macro solution is how do I inject
> >> export CC=%__cc into the builds?  Do I need to add this
> >> to the %prep macro?
> >>
> >
> > You'd probably need to change %set_build_flags to add definitions for those.
> >
>
> Will that take affect for all builds?  I only see it being used by the
> %configure macro.

I believe it's also used by the %cmake and %meson macros.


-- 
真実はいつも一つ!/ Always, there's only one truth!
_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux