You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/glossary.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ sidebar_position: 27
15
15
16
16
## ABI
17
17
18
-
**A**pplication **B**inary **I**nterface. ABI is a document that comprehensively defines the binary system interface between applications and the operating system on which they run. [Learn More](https://en.wikipedia.org/wiki/Application_binary_interface).
18
+
**A**pplication **B**inary **I**nterface. ABI is a document that comprehensively defines the binary system interface between applications and the operating system on which they run. [Learn More at Wikipedia](https://en.wikipedia.org/wiki/Application_binary_interface) or [pypackaging-native](https://pypackaging-native.github.io/background/binary_interface).
@@ -457,36 +457,144 @@ take more serious actions, including archiving feedstocks or removing maintainer
457
457
458
458
conda-forge builds and maintains its own set of compilers for various languages
459
459
and/or systems (e.g., `C`, `FORTRAN`, `C++`, `CUDA`, etc.). These are used
460
-
in all of our CI builds to build both core dependencies (e.g., `Python`) and maintainer-contributed
461
-
packages. While we do not have any formal policies or promises of support for these
460
+
in all of our CI builds to build essentially all artefacts published by conda-forge.
461
+
462
+
This compiler infrastructure has a critical role beyond building everything, which
463
+
is to ensure that packages stay compatible with each other. This is due to how compiled
464
+
packages have a so-called [Application Binary Interface](../glossary.md#abi)
465
+
(ABI), and how changes in the compiler infrastructure may break this ABI, leading
466
+
to crashes, miscalculations, etc. Generally speaking, using a consistent compiler
467
+
version greatly reduces the risk of ABI breaks.
468
+
469
+
Compilers generally strive to maintain ABI-compatibility across versions, meaning that
470
+
combining artefacts for the same target produced by different versions of the same
471
+
compiler will work together without issue. Due to the nature of the ABI (i.e. a vast
472
+
interface between software and hardware, with innumerable corner cases), it still
473
+
happens that unintentional changes for some specific aspect are introduced across
474
+
compiler versions, though in practice this does not lead to wide-spread issues.
475
+
476
+
In contrast, when compilers do intentionally change the ABI (as MSVC did with each
477
+
release before the `vc14` series currently covering VS2015-VS2022), _every_ compiled
478
+
package needs to be rebuilt for that new ABI, and cannot be mixed with builds for the
479
+
old ABI. While less likely nowadays, in principle it's also possible that a major
480
+
infrastructural overhaul in the compiler stack similarly forces a complete rebuild.
481
+
482
+
Such large-scale changes – requiring +/- all of conda-forge to be rebuilt – take a
483
+
lot of effort, though thankfully, in recent years such full rebuilds have not been
484
+
necessary and we managed to do less disruptive compiler upgrades.
485
+
486
+
However, large-scale ABI breaks remain a possibility (e.g. MSVC is planning a vNext
487
+
after `vc14`), and so we keep our policies for such a scenario in place.
488
+
While we do not have any formal promises of support for a generation of ABI-compatible
462
489
compilers, we have historically maintained them according to the following (non-binding)
463
490
principles.
464
491
465
492
- The authoritative source of the current compilers and versions for various languages
466
493
and platforms is the [conda_build_config.yaml](https://github.com/conda-forge/conda-forge-pinning-feedstock/blob/master/recipe/conda_build_config.yaml)
467
494
in the [conda-forge/conda-forge-pinning-feedstock](https://github.com/conda-forge/conda-forge-pinning-feedstock)
468
495
as described in [Globally pinned packages](pinning_deps.md#globally-pinned-packages).
469
-
- We provide no support of any kind in terms of the long-term stability of these pinnings.
496
+
- We provide no support of any kind in terms of the long-term stability/support of a given compiler generation.
470
497
- We upgrade them in an ad-hoc manner on a periodic basis as we have the time and energy to do so.
471
498
Note that because of the way we enforce runtime constraints, these compiler upgrades will not break
472
499
existing packages. However, if you are using the compilers outside of `conda`, then you may find issues.
473
-
- We generally provide notice in the form of an announcement when a compiler is going to be upgraded.
500
+
- We generally provide notice in the form of an announcement when an ABI-incompatible compiler change is going to happen.
474
501
Note that these changes take a bit of time to complete, so you will generally have time
475
502
to prepare should you need to.
476
503
- Some of the criteria we think about when considering a compiler migration include:
477
504
- the degree of disruption to the ecosystem,
478
505
- the amount of work for the `core` team,
479
506
- the amount of time it will cost our (volunteer) feedstock maintainers.
480
507
481
-
We do use some unofficial names for our compiler stack internally. Note however that
482
-
the existence of these names does not imply any level of support or stability for the compilers
508
+
These compiler generations may or may not have some unofficial names for our
509
+
internal use (e.g. `comp7`). We note again that the existence of these names
510
+
does not imply any level of support or stability for the compilers
483
511
that form the given stack.
484
512
485
-
- Our current compiler stack is referred to internally as `comp7`.
486
-
- The previous compiler stack based in part on the various `toolchain_*` packages
487
-
was sometimes referred to as `comp4`. On linux the `toolchain_*` compilers were
488
-
GCC 4.8.2 as packaged in the devtoolset-2 software collection. On osx, we use clang from
489
-
Apple's Xcode in the `toolchain_*` packages.
513
+
For the cases that do not require a complete rebuild of conda-forge (i.e. if the ABI
514
+
of a new compiler remains compatible, up to rare corner cases), we can just increase
515
+
the version in our global pinning, and it will slowly roll out to the ecosystem as
516
+
feedstocks get rerendered.
517
+
518
+
For such ABI-compatible upgrades, similar but looser principles apply:
519
+
520
+
- The pins are similarly defined in the global pinning, see [Globally Pinned Packages](pinning_deps.md#globally-pinned-packages).
521
+
- We provide no support of any kind in terms of the long-term availability of a given compiler version.
522
+
- We generally provide notice in the form of an announcement when a compiler is going to be upgraded.
523
+
- Without promising any timelines, our compilers on Linux and OSX are normally
524
+
very recent; on Windows, we generally use the last supported VS version.
525
+
526
+
Despite the lack of explicit support, we try to keep the compilers in their various versions
527
+
working also outside of conda-forge, and even provide an easy way to install them
528
+
(through the [compilers feedstock](https://github.com/conda-forge/compilers-feedstock)).
529
+
530
+
More specifically, each compiler uses an _activation_ package that makes the difference
531
+
between it being merely present in a build environment, and it being used by default.
532
+
These will be installed when using `{{ compiler('xyz') }}` in `meta.yaml`, where
533
+
`'xyz'`is one of `'c', 'cxx', 'fortran', 'cuda', 'rust', 'go-cgo', 'go-nocgo'`.
534
+
535
+
Our default compiler stack is made up very differently on each platform; each platform
536
+
has its own default compiler, with its own set of feedstocks that provide them. Due to historical
537
+
reasons (the way compilers are integrated with their OS, and the amount of
538
+
software written in them, etc.), the most impactful languages are C & C++ (though
539
+
Fortran is considered part of the default, not least because GCC compiles all three).
0 commit comments