https://fedoraproject.org/wiki/Changes/CompilerPolicy

== Summary ==
Fedora has historically forced packages to build with GCC unless the
upstream project for the package only supported Clang/LLVM.  This
change proposal replaces that policy with one where, given a good
technical reason, a packager may:
* Choose to build with their package with clang even if the upstream
project supports gcc.
* Choose to build with gcc even if upstream does not support it.

The goal is to give the packager the ability to use their own
technical judgement to choose the best compiler.

Note this change is only for compiler selection.  It does not change
existing policies WRT runtime library selection, linker selection,
debuggers, etc.

== Owner ==
* Name: Jeff Law
* Name: Tom Stellard
* Email: tstel...@redhat.com


== Detailed Description ==

The main goal here is to give a packager some freedom to select the
best compiler for their package.  This policy change will allow
packagers to choose to use a non-default compiler for their package,
if they have a valid technical reason to do so.  The default compiler
for Fedora is gcc or when upstream doesn't support gcc, then the
default compiler is clang. Examples of valid technical reasons to not
use the default compiler, include but are not limited to:

* The default compiler cannot build a package correctly.
* The packager needs to disable a compiler feature (e.g. LTO) in order
for the default compiler to correctly compile their package.
* The default compiler takes significantly longer to build a package.
* The default compiler is missing a feature that would benefit the package.

If this policy is implemented, it may be beneficial for packagers to
use conditional macros to switch between different compilers.  This
could be useful when trying to make a comparison between the two
compilers or to make it easy to change back to the default compiler.
Therefore, in addition to updating the compiler policy, we are also
proposing to add the following macros to redhat-rpm-config to help
facilitate easily switching between different compilers:
The new macros are:

* %cc   - equivalent to %__cc (C Compiler)
* %cxx  - equivalent to %__cxx (C++ Compiler)
* %cpp  - equivalent to %_cpp (C preprocessor)

The policy update will also recommend that packagers use standardized
macro names when using conditional options to control the compiler
choice:

%bcond_with toolchain_clang
%bcond_with toolchain_gcc

[https://pagure.io/packaging-committee/pull-request/1066 Pull request]
with proposed policy changes.

Note this change is only for compiler selection.  It does not change
existing policies WRT runtime library selection, linker selection,
debuggers, etc.

It is worth noting that Clang/LLVM's implementation of
-fstack-clash-protection, which is one of Fedora's default compiler
flags, is under development and does not yet have an implementation
for AArch64.

== Feedback ==
* The original proposal stated that Fedora packagers should follow
upstream's compiler preferences, but based on feedback, the proposal
was updated to allow a packager to choose the compiler they feel is
best as long as there is a valid technical reason to do so.

== Benefit to Fedora ==

This change allows packagers more freedom to use the compiler that
produces the best version of their package, which helps to give our
users a better overall experience.  Also, giving package maintainers
more freedom to select the best compiler, let's them spend more time
focusing on package improvements and less time on debugging compiler
issues.

An example of a package that could benefit from this policy is
Firefox.  Upstream, the Firefox project builds primarily with
Clang/LLVM.  Yet we force the Fedora package owner to find and fix
issues building with GCC then either carry those custom fixes forward
in Fedora or negotiate with upstream to get those changes upstreamed.
While this process can be helpful in finding non-portable code, this
is ultimately a poor use of the packager's time.

Additionally Fedora loses the benefit of the testing provided by other
distributions where Firefox is compiled in the same way as the
upstream project -- when issues arise the Fedora team must consider
the possibility that the problem is due to using GCC instead of
Clang/LLVM or the patches to make that possible.  Again, this is a
poor use of Fedora developer's time.

Other packages that may benefit include:
* llvm/clang (currently has to disable LTO due to compilation failures).
* qemu (could take advantage of clang's CFI hardening feature).

== Scope ==
* Proposal owners:
** Update the Fedora Packaging Guidelines to reflect the policy change
and submit patch with new macros to redhat-rpm-config.
* Other developers:
** Developers that want to use a new compiler in accordance with the
policy may update their packages if they want, but there is no
required action for packagers with this change.
* Release engineering: [https://pagure.io/releng/issue/9503] (a check
of an impact with Release Engineering is needed)
** I do not believe this change requires any coordination with release
engineering.  No mass rebuild is required.
* Policies and guidelines:
** Yes, the packaging guidelines certainly need to be updated for this
feature.  That can happen as soon as the exact text is agreed upon.
* Trademark approval: N/A (not needed for this Change)

== Upgrade/compatibility impact ==
This should not require any configuration changes or data migration,
nor should it change existing functionality.

== How To Test ==
For packages where the compiler should change, the package owner will
need to update the spec file and build the package with the new
compiler.  Once done, the package's testsuite should be run (if it's
not part of the standard build process).

In general, I would think the standard Fedora QE work should be
sufficient here, perhaps with a bit of additional attention to the
affected packages.  The graphical nature of some of the potentially
affected packages like Firefox and Chrome will make testing difficult
on some of Fedora's architectures.

== User Experience ==
Users should not notice any change.

== Dependencies ==
There are no dependencies, once the policy change is made, if
packagers choose to update their packages, they can do it at any time.

== Contingency Plan ==
The backup plan is trivial.  We can keep the current policy in place.

* Contingency mechanism:
** It seems like we could institute the policy change anytime we
choose.  But it also seems like once the policy change is in place,
packages that are going to convert should do so before beta freeze.
* Contingency deadline: Fedora can ship with this feature in an
incomplete state.
* Blocks release? No
* Blocks product? N/A

== Documentation ==
Several years ago Red Hat's tools team championed for Fedora policy to strongly
discourage the use of LLVM/Clang for package building.  Exceptions were made for
packages that could only be built with Clang/LLVM:

https://docs.fedoraproject.org/en-US/packaging-guidelines/#compiler


At that point in history Red Hat had no Clang/LLVM engineers or expertise.  In
fact, the LLVM packages were actually maintained by an engineer on the desktop
team (they had a hard requirement for llvm-pipe, so they got to own the
Clang/LLVM bits).  The policy essentially was a risk management strategy for
Fedora.

Times have changed and as a result we should revisit that Fedora policy.

The Red Hat tools team believes that LLVM/Clang and GCC should be
considered equals from
a Fedora policy standpoint.  Selection of one toolchain over the other should be
driven by the packager's preferences not by Fedora specific policy.
The only policy restriction should be that the compiler must exist in
Fedora.

== Release Notes ==
This change should not have any end user impacts nor does it strictly
require a release note.  However, a short release note could be
written if FESCO or the development community thinks it would be
useful.


-- 
Ben Cotton
He / Him / His
Senior Program Manager, Fedora & CentOS Stream
Red Hat
TZ=America/Indiana/Indianapolis
_______________________________________________
devel-announce mailing list -- devel-announce@lists.fedoraproject.org
To unsubscribe send an email to devel-announce-le...@lists.fedoraproject.org
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-announce@lists.fedoraproject.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to