Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ebcfa8e
Write CEP about virtual packages
jaimergp Dec 17, 2024
cda0a8c
Add some Windows methods
jaimergp Dec 17, 2024
6f2d60f
some more
jaimergp Dec 17, 2024
9a793b9
add details of glibc, linux and osx
jaimergp Dec 17, 2024
9b4b7a7
pre-commit
jaimergp Dec 17, 2024
59462ed
add discussion, implementation
jaimergp Dec 17, 2024
cedde6a
add general paragraph about CONDA_OVERRIDE_*
jaimergp Dec 17, 2024
df9d61d
Apply suggestions from code review
jaimergp Dec 17, 2024
72022f4
more details about archspec
jaimergp Dec 17, 2024
7c3b595
Merge branch 'virtual-packages' of github.com:jaimergp/ceps into virt…
jaimergp Dec 17, 2024
e6fcda5
link to existing issue
jaimergp Dec 18, 2024
40b4442
Apply suggestions from code review
jaimergp Dec 19, 2024
bc6d6a6
Move motivation further up
jaimergp Dec 19, 2024
5bf10f1
Rework `__glibc` specification
jaimergp Dec 19, 2024
7a2c7e5
Forbid `CONDA_OVERRIDE_UNIX`
jaimergp Dec 19, 2024
cd06910
format table
jaimergp Dec 19, 2024
e520336
Reword general considerations
jaimergp Dec 19, 2024
1b01182
Be stricter with override values and more lenient with fallback values
jaimergp Dec 19, 2024
2148654
reword __archspec
jaimergp Dec 19, 2024
eaeb222
discard generic CPU rules
jaimergp Dec 19, 2024
9a95c6b
clarify env var syntax
jaimergp Dec 21, 2024
6a9f82e
Apply Cheng's suggestions
jaimergp Feb 12, 2025
d4b32f9
Add riscv32 and sort table
jaimergp Feb 12, 2025
edeb09c
Merge branch 'main' of github.com:conda/ceps into virtual-packages
jaimergp Sep 26, 2025
30a6030
Rename
jaimergp Sep 26, 2025
6b6714e
pre-commit
jaimergp Sep 26, 2025
83ea61e
more pre-commit
jaimergp Sep 26, 2025
be15de8
Update references to existing CEPs or drafts
jaimergp Oct 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
179 changes: 179 additions & 0 deletions cep-XXXX.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# CEP XXXX - Virtual packages

<table>
<tr><td> Title </td><td> CEP XXXX - Virtual packages </td>
<tr><td> Status </td><td> Draft </td></tr>
<tr><td> Author(s) </td><td> Jaime Rodríguez-Guerra &lt;[email protected]&gt;</td></tr>
<tr><td> Created </td><td> Dec 17, 2024</td></tr>
<tr><td> Updated </td><td> Dec 17, 2024</td></tr>
<tr><td> Discussion </td><td> https://github.com/conda/ceps/pull/103 </td></tr>
<tr><td> Implementation </td><td> https://github.com/conda/conda/tree/24.11.1/conda/plugins/virtual_packages, https://github.com/mamba-org/mamba/blob/libmamba-2.0.5/libmamba/src/core/virtual_packages.cpp, https://github.com/conda/rattler/tree/rattler-v0.28.8/crates/rattler_virtual_packages/src </td></tr>
<tr><td> Requires </td><td> https://github.com/conda/ceps/pull/132 </td></tr>

</table>

> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT",
"RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as
described in [RFC2119][RFC2119] when, and only when, they appear in all capitals, as shown here.

## Abstract

This CEP standardizes which virtual packages MUST be offered by conda install tools.

## Motivation

Virtual packages are used to expose details of the system configuration to a conda client. They are commonly used as dependencies in regular packages to constrain on which systems they can be installed. Some examples include:

* On Linux, the minimum GNU `libc` version that must be available in the system via the `__glibc` virtual package.
* The oldest macOS version compatible with the package via the `__osx` virtual package.
* Whether a `noarch` package should be constrained to a single operating system via the `__linux`, `__osx` or `__win` virtual packages (often with no version constraint).
* The minimum CPU microarchitecture level that the binaries require via the `__archspec` virtual package.
* The lowest CUDA version the GPU driver is compatible with via `__cuda`.

## Specification

A virtual package is defined as a package record with three fields: name, version and build string.
These fields MUST comply with [CEP 26](./cep-0026.md). More specifically, the version field MUST follow the version string specifications as discussed in [CEP PR #132](https://github.com/conda/ceps/pull/132), regardless its origin (computed from a system property, overridden by the user or configuration, or provided by default by the tool).

Some general considerations:

* The version or build string of a virtual package MAY be overridden by the value of `CONDA_OVERRIDE_{NAME}` environment variable, with `{NAME}` being the uppercased name of the virtual package (excluding the leading underscores). Many exceptions apply so please observe the details in the section below.
* The build string MAY be zero (`0`). Some exceptions apply. See below.
* When the tool used a fallback default value instead of a computed one, it SHOULD also inform the user of that choice and its possible override options (e.g. `CONDA_OVERRIDE_{NAME}` variables, CLI flags, configuration file, etc).

### List of virtual packages

In alphabetical order, every conda client MUST support the following virtual packages:

* `__archspec`
* `__cuda`
* `__glibc`
Comment on lines +49 to +50

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* `__cuda`
* `__glibc`
* `__cuda`
* `__cuda_arch`
* `__glibc`

As discussed in the last conda-forge community meeting, I am working to add the __cuda_arch virtual package, which detects the oldest CUDA device architecture on the system.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Xref conda-forge/conda-forge.github.io#2623 & #139

FWIW, I think __cuda_arch should be a separate CEP; this CEP is just describing the status quo, and bringing it to a point where all the various bits and pieces are specified. A CEP for __cuda_arch can build on top of that.

* `__linux`
* `__osx`
* `__unix`
* `__win`

#### `__archspec`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The microarch-level packages in conda-forge depend on __archspec to provide microarchitecture-level (e.g. x86-64-v2) meta-packages.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we aware of any existing packages that actually depend on __archspec?

If not, I would rather we not make this virtual package mandatory at this time, mostly because "what microarchitecture is this CPU?" is a question that can get complicated quickly; see, e.g., ARM big.LITTLE, Intel P/E cores, Intel Xeon 6, etc. To me, this virtual package is still (pseudo-)experimental, in the sense that we still need to work out how package maintainers should/want to use this package. IMO, __archspec should be its own CEP or set of CEPs (cf. #59).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


This virtual package MUST be always present, with the version set to `1`.

The build string MUST reflect one of:

* If the target platform matches the native platform, the best fitting CPU microarchitecture in the [`archspec/archspec-json` database](https://github.com/archspec/archspec-json/blob/v0.2.5/cpu/microarchitectures.json). The reference CPU detection implementation is [`archspec.cpu.detect.host()`](https://github.com/archspec/archspec/blob/v0.2.5/archspec/cpu/detect.py#L338).

* The target platform architecture (second component of the platform string), mapped as:

| Target platform | Reported `archspec` build string |
| --------------- | -------------------------------- |
| `*-32` | `x86` |
| `*-64` | `x86_64` |
| `*-aarch64` | `aarch64` |
| `*-arm64` | `arm64` |
| `*-armv6l` | `armv6l` |
| `*-armv7l` | `armv7l` |
| `*-ppc64` | `ppc64` |
| `*-ppc64le` | `ppc64le` |
| `*-riscv32` | `riscv32` |
| `*-riscv64` | `riscv64` |
| `*-s390x` | `s390x` |
| `zos-z` | `0` |
| Any other value | `0` |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should riscv32 also be added?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we also add wasm32?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the platform/archspec tuple for wasm32?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


The build string MUST be overridable with the `CONDA_OVERRIDE_ARCHSPEC` environment variable, if set to a non-empty value.

#### `__cuda`

This virtual package MUST be present when the system exhibits GPU drivers compatible with the CUDA runtimes. When available, the version value MUST be set to the oldest CUDA version supported by the detected drivers (i.e. the formatted value of `libcuda.cuDriverGetVersion()`), constrained to the first two components (major and minor) and formatted as `{major}.{minor}`. The build string MUST be `0`.

The version MUST be overridable with the `CONDA_OVERRIDE_CUDA` environment variable, if set to a non-empty value that can be parsed as a version string.

#### `__glibc`

This virtual package MUST NOT be present if the target platform is not `linux-*`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"...if the target platform's C standard library is not the GNU C Library". Not sure if we codify the assumption of all Linux systems inherently provide GNU libc or that only Linux uses GNU libc.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current conda implementation assumes the latter "only Linux uses GNU libc". See https://github.com/conda/conda/blob/e74a2b9d8a74837afc3bcbef609fe4bd29572e16/conda/plugins/virtual_packages/linux.py#L14-L16.

If that's incorrect, (1) we need to fix that in conda/conda, and (2) I will update this paragraph.


This virtual package MUST be present when the native and target platforms are both the same type of `linux-*` and GNU `libc` is installed in the system. The version value MUST be set to the system GNU `libc` version, constrained to the first two components (major and minor) formatted as `{major}.{minor}`. If the version cannot be estimated, the tool MUST set the version to a default value (e.g. `2.17`).

If the native platform does not match the target platform, the tool MAY export `__glibc` with its `version` field set to a default value (e.g. `2.17`) of its choice.

If the `CONDA_OVERRIDE_GLIBC` environment variable if set to a non-empty value that complies to the version string specification, the tool MUST export `__glibc` with its version value set to the value of the environment variable.

The build string MUST always be `0`.

> The GNU `libc` version can be computed via:
>
> * Python's `os.confstr("CS_GNU_LIBC_VERSION")`
> * `getconf GNU_LIBC_VERSION`
> * `ldd --version`. Please verify that it references GNU `libc` or GLIBC. For non-standard installs, using a GLIBC compatibility layer, this may require locating the implementation and directly querying.
#### `__linux`

This virtual package MUST be present when the target platform is `linux-*`. Its version value MUST be set to the upstream (mainline) Linux kernel version, but it MUST exclude any and all [distribution-specific components](https://www.kernel.org/releases.html#distribution-kernels) of the kernel version. If the version cannot be estimated (e.g. because the native platform is not Linux), the tool MUST set `version` to a fallback value of its choice. The build string MUST be `0`.

The version MUST be overridable with the `CONDA_OVERRIDE_LINUX` environment variable, if set to a non-empty value that matches the regex `"\d+\.\d+(\.\d+)?(\.\d+)?"`. The environment variable MUST be ignored when the target platform is not `linux-*`.

> The Linux kernel version can be obtained via:
>
> * Python's `platform.release()`
> * `uname -r`
> * `cat /proc/version`
#### `__osx`

This virtual package MUST be present when the target platform is `osx-*`. Its version value MUST be set to the first two numeric components of macOS version formatted as `{major}.{minor}`. If applicable, the `SYSTEM_VERSION_COMPAT` environment variable workaround MUST NOT be enabled; e.g. the version reported for Big Sur should be 11.x and not 10.16.

If the version cannot be estimated (e.g. because the native platform is not macOS), the fallback value MUST be set to `0`. The build string MUST be `0`.

The version MUST be overridable with the `CONDA_OVERRIDE_OSX` environment variable if set to a non-empty value that can be parsed as a version string. The environment variable MUST be ignored when the target platform is not `osx-*`.

> The macOS version can be obtained via:
>
> * Python's `platform.mac_ver()[0]`
> * `SYSTEM_VERSION_COMPAT=0 sw_vers -productVersion`
#### `__unix`

This virtual package MUST be present when the target platform is `linux-*`, `osx-*` or `freebsd-*`. The version and build string fields MUST be set to `0`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than list the specific target platforms now and having to adjust this CEP if/when new platforms are adopted, I would suggest language like "when the target platform is sufficiently POSIX-y" and list the attributes necessary for that to be true (e.g., uses / for path delimiters, supports fork(3), etc.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with the sentiment, but I'm going to need some help or references to compile that list 😬


The `CONDA_OVERRIDE_UNIX` environment variable MUST NOT have any effect.

#### `__win`

This virtual package MUST be present when the target platform is `win-*`. The version MUST be set to the first three numeric components of the Windows build version, formatted as `{major}.{minor}.{build}`. If the version cannot be estimated (e.g. because the target platform does not match the native platform), the tool MUST set the version to a default value of its choice.

The version MUST be overridable with the `CONDA_OVERRIDE_WIN` environment variable if set to a non-empty value that can be parsed as a version string. The environment variable MUST be ignored when the target platform is not `win-*`.

The build string MUST be `0`.

> The version string `{major}.{minor}.{build}` can be obtained from:
>
> * Python's `platform.win32_ver()`
> * CMD's `ver`
>
* Powershell's `[System.Environment]::OSVersion.Version`, `(Get-CimInstance Win32_OperatingSystem).version`
>
> * The command `wmic os get version`
## Potential future work

This CEP focuses on the standardization of existing virtual package implementations.

The following items are not considered here. Though would be open for discussion in future CEP work:

* Additional OSes, like `__freebsd` or `__netbsd`.
* Coarse grain architecture information, like `__x86_64` or `__arm64`, or, more generally, [`__arch`](https://github.com/conda/conda/issues/13420).
* More `libc` implementations, like `__musl`.

## References

* [Virtual packages implementation in `conda/conda` 24.11.1](https://github.com/conda/conda/tree/24.11.1/conda/plugins/virtual_packages)
* [Virtual packages implementation in `libmamba` 2.0.5](https://github.com/mamba-org/mamba/blob/libmamba-2.0.5/libmamba/src/core/virtual_packages.cpp)
* [Virtual packages implementation in `rattler` 0.28.8](https://github.com/conda/rattler/tree/rattler-v0.28.8/crates/rattler_virtual_packages/src)
* [ENH: make `__win` version usable for package metadata (conda/conda#14443)](https://github.com/conda/conda/issues/14443)
* [Drop `CONDA_OVERRIDE_WIN` environment variable (mamba-org/mamba#2815)](https://github.com/mamba-org/mamba/pull/2815)
* [`__arch` feature request](https://github.com/conda/conda/issues/13420)

## Copyright

All CEPs are explicitly [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/).

[RFC2119]: https://datatracker.ietf.org/doc/html/rfc2119