Skip to main content

CEP 40 - A new recipe format (part 4): Rendered recipe YAML and serialization

Title A new recipe format (part 4): Rendered recipe YAML and serialization
Status Accepted
Author(s) Wolf Vollprecht <wolf@prefix.dev>
Created Apr 13, 2024
Updated Apr 17, 2026
Discussion https://github.com/conda/ceps/pull/74
Implementation https://github.com/prefix-dev/rattler-build

Abstract

Part of the effort to strictly define a new recipe format. The previous CEPs are:

This CEP defines the structure and contents of the rendered_recipe.yaml file which captures the complete recipe, build configuration, dependencies and sources used to create a conda package.

Motivation

As part of the metadata, a package might include the "raw" and "rendered" recipe. A rendered recipe is a recipe.yaml file that has all Jinja and if/else logic resolved to the final values.

The goal is to have a single file that contains all the information needed to reproduce the exact build of a package. This will enable better reproducibility, provenance tracking, and debugging of conda packages.

Specification

A package builder should have a defined way on how to serialize the recipe to the final output in the artifact / package.

This "rendered recipe" should contain the following information:

  • The fully rendered recipe with all Jinja2 expressions evaluated and if/else logic resolved to the final used values. There should be no more logic in the rendered recipe.
  • The fully resolved environments for the build environments (build and host). This SHOULD at least include the exact versions, a checksum and the full URL for every package that was used as a dependency. The resolved environments should also include the channel URLs that were used for resolution in the correct order.

Additionally, a file MUST be placed in the info folder, named info/used_build_tool.json. This file MUST record the name and version of the tool that produced the rendered recipe. This JSON file SHOULD AT LEAST have the following keys:

{
"name": "rattler-build", // string
"version": "0.14.0" // string
}

This information can be used to reproduce the build with the same version of the tool. This tool version should also be able to read the rendered recipe.

Implementation details for rattler-build

What follows is a thorough description of what is implemented in rattler-build. This is not directly relevant to the CEP, but should serve as an illustration for a project that follows these guidelines.

Storage

The rendered recipe YAML file is stored in the info/recipe folder of the final package. Alongside the rendered recipe, we copy the entire "recipe folder". If the original recipe was not named recipe.yaml, then we rename it inside the package.

For example:

├── recipe
├── patches
│ └── patch1.diff
├── build.sh
├── build.bat
└── my_recipe.yaml

Will be copied into the following folder structure in the final package:

├── ...
├── index.json
├── used_build_tool.json // new file!
└── recipe
├── build.bat
├── build.sh
├── recipe.yaml
├── patches
│ └── patch1.diff
├── rendered_recipe.yaml
└── variant_config.yaml

Implementation details

The rendered recipe YAML file contains the following top-level sections:

  1. rendered_recipe_version: integer - The version of the rendered recipe format.
  2. recipe: The fully rendered recipe with all Jinja2 expressions evaluated and if/else logic resolved to the final used values.
  3. build_configuration: Captures all the build-time configuration such as the target platform, build/host prefixes, variant used, package version and build string, channels, etc.
  4. finalized_dependencies: Records the exact versions and builds of all dependencies (build, host and run) that were used at build time, like a "lockfile".
  5. finalized_sources: Contains the final references to the sources used, e.g. git commit hashes, tarball URLs + sha256, etc.
  6. system_tools: Records the tools that were used from the host system in order to warn if reproducing the build on a different host system might lead to different results (patchelf, git, etc).

The version of the rendered recipe format as described here is 1.

Recipe section

This section is the fully rendered recipe in valid YAML format, with all Jinja2 expressions evaluated and if/else logic resolved to the final values used during the build.

Some key things to note:

  • Compiler expressions like ${{ compiler('c') }} are rendered to their final form immediately:

    - ${{ compiler('c') }}
    # becomes (with target_platform linux-64, as an example)
    - gcc_linux-64
  • Pin expressions like ${{ pin_subpackage('libtool', upper_bound='x.x') }} are rendered to:

    - ${{ pin_subpackage('libtool', exact=true) }}
    # becomes
    - pin_subpackage:
    name: libtool
    exact: true
  • For the following:

    - ${{ pin_subpackage('some-pkg-a', lower_bound="x.x.x") }}
    - ${{ pin_compatible('python', upper_bound="x.x.x") }}
    - ${{ pin_compatible('numpy', upper_bound="3.2.1", lower_bound="1.2.3") }}

    the rendered result is as follows:

    - pin_subpackage:
    name: some-pkg-a # string
    lower_bound: x.x.x # this is a string or null
    - pin_compatible:
    name: python
    upper_bound: x.x.x # this is a string or null
    - pin_compatible:
    name: numpy
    lower_bound: 1.2.3
    upper_bound: 3.2.1

The pin functions take 4 arguments: name, lower_bound, upper_bound and exact. lower_bound and upper_bound can be either a "pin expression" (x.x.x...), a version string or None. If None, the field CAN be omitted in the rendered output. The default values for lower_bound is x.x.x.x.x.x, for upper_bound it's x. For exact the default value is false. If exact is false, the field CAN be omitted from the rendered output.

The definitions for these entries are:

pin_subpackage:
name: string
lower_bound: string or null
upper_bound: string or null
exact: bool
pin_subpackage:
name: string
lower_bound: string or null
upper_bound: string or null
exact: bool

Build configuration section

This records all information that was used at build time, incl. variables given on the CLI or by environment yaml. Everything necessary to reproduce the build should be recorded here.

Here's the documentation for the fields in the provided YAML:

build_configuration

The build_configuration section contains information related to the build process.

target_platform
  • Type: string
  • Description: The target platform for which the package is being built (e.g., osx-arm64).
host_platform
  • Type: string

  • Description: The host platform used for building the package. The host-platform is equivalent to target_platform except when the target_platform is noarch. If the target_platform is noarch, the host_platform is the platform where the build is being executed.

    If the package is cross-compiled this might not be the current platform, therefore it is recorded in the rendered recipe. If you have a noarch package and compile with --target-platform=linux-64 on a windows machine the following will be set:

    • target_platform: noarch (from recipe)
    • host_platform: linux-64 (from CLI)
    • build_platform: win-64 (the current platform)
build_platform
  • Type: string
  • Description: The platform used for building the package (e.g., osx-arm64).
variant
  • Type: object
  • Description: Dictionary with the variant configuration used for the build.

This dictionary contains only the keys of the variant configuration file that were applied during the build (e.g. used in a jinja expression or as a dependency).

hash
  • Type: object
  • Description: Contains information related to hashing.
    • hash: The hash value (e.g., 60d57d3).
    • prefix: Prefix for the hash, which can include values like py311 based on the variant configuration.
directories
  • Type: object
  • Description: Contains directory paths used during the build process.
    • host_prefix: The host prefix directory with placeholders for the host environment.
    • build_prefix: The build prefix directory for the build environment.
    • work_dir: The working directory with extracted sources.
    • build_dir: The build directory that contains host_prefix, build_prefix, and work_dir as subdirectories.
channels
  • Type: array of URLs

  • Description: The URLs to the conda channels that were used to resolve dependencies (e.g., https://conda.anaconda.org/conda-forge).

    The order is significant.

channel_priority
  • Type: string

  • Description: Optionally the channel priority used to solve the dependencies.

    • strict (default): Only the repodata in the first channel that contains repodata for a package will be considered.
    • disabled: Any repodata from any channel for a package can be considered.
solve_strategy
  • Type: string

  • Description: Optionally the solve strategy used to solve the dependencies.

    • highest (default): Resolve the highest version of each package.

    • lowest-version: Resolve the lowest compatible version for each package.

      All candidates with the same version are still ordered the same as with highest. This ensures that the candidate with the highest build number is used and down-prioritization still works.

    • lowest-version-direct: Resolve the lowest compatible version for direct dependencies but the highest for transitive dependencies. This is similar to lowest-version but only for direct dependencies.

timestamp
  • Type: string / timestamp in ISO 8601 format
  • Description: The timestamp of the build configuration (e.g., 2024-04-13T14:35:30.774863Z).
subpackages
  • Type: list of objects
  • Description: Contains information about subpackages that are used in pin_subpackage expressions.
    • curl: An example subpackage.
      • name: The name of the subpackage (e.g., curl).
      • version: The version of the subpackage (e.g., 8.0.1).
      • build_string: The build string for the subpackage (e.g., h60d57d3_0).
packaging_settings
  • Type: object
  • Description: Contains settings related to the final package output.
    • archive_type: The type of archive used for packaging (either tar_bz2 or conda).
    • compression_level: The numerical compression level used for packaging (e.g., 15).

Example

build_configuration:
target_platform: osx-arm64
host_platform: osx-arm64
build_platform: osx-arm64
variant:
target_platform: osx-arm64
hash:
hash: 60d57d3
prefix: "" # would contain `py311` and similar prefixes based on variant config
directories:
host_prefix: # host prefix with placeholders for the host environment
build_prefix: # build prefix for the build environment
work_dir: # work dir with extracted sources
build_dir: # build dir that contains host_prefix, build_prefix and work_dir as subdirectories
channels:
- conda-forge
channel_priority: strict
solve_strategy: highest
timestamp: 2024-04-13T14:35:30.774863Z
subpackages:
curl:
name: curl
version: 8.0.1
build_string: h60d57d3_0
packaging_settings:
archive_type: conda
compression_level: 15

Finalized dependencies

The finalized dependencies section contains a "lockfile" of all the dependencies exactly as they were used at build-time, for the two environments build and host. It also includes the final run and constraints specs that are computed based on the build and host dependencies (resolved all run_exports).

The finalized_dependencies section contains the following keys:

finalized_dependencies:
build:
specs: [list of spec objects]
resolved: [list of resolved dependency objects]
run_exports: { package_name: run_export } # all run_exports.json that were found among the packages in this environment
host:
specs: [list of spec objects]
resolved: [list of resolved dependency objects]
run_exports: { package_name: run_export } # all run_exports.json that were found among the packages in this environment
run:
depends: [list of dependencies with dependency source information]
constraints: [list of constraints with dependency source information]
run_exports: optional run_export dictionary

Spec objects

A dependency spec contains the MatchSpec and additional information about the source of the dependency. There are 6 possible DependencyInfo versions:

  • pin_subpackage: The dependency comes from a pin_subpackage expression.
  • pin_compatible: The dependency comes from a pin_compatible expression.
  • source: The dependency comes from the recipe.
  • run_export: The dependency comes from a run export.
  • variant: The dependency comes from a variant.

Example:

# language specified in ${{ compiler(`c`) }}
- source: clang_osx-arm64
- source: make >=1.3
- pin_compatible: quarto
lower_bound: x.x # not present if set to None
upper_bound: x.x.x # not present if set to None
exact: true # not present if false
spec: quarto >=1.4.550,<1.5
- pin_subpackage: some-pkg-a
lower_bound: x.x # not present if set to None
upper_bound: x.x.x # not present if set to None
exact: true # not present if false
spec: some-pkg-a >=1.0.0,<2
- run_export: zlib
spec: libzlib >=1.3.1,<1.4.0a0
from: host # environment that exported this dependency
- variant: setuptools # key from variant coming configuration
spec: setuptools 69.*

The list of resolved dependencies contains a dictionary with the following fields (equivalent to RepoDataRecord):

build: hb7217d7_0
build_number: 0
depends: []
license: GPL-2.0-or-later
license_family: GPL
md5: fe8efc3385f58f0055e8100b07225055
name: libtool
sha256: efe50471d2baea151f2a93f1f99c05553f8c88e3f0065cdc267e1aa2e8c42449
size: 408403
subdir: osx-arm64
timestamp: 1672362003513 # when available
version: 2.4.7
fn: libtool-2.4.7-hb7217d7_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda
channel: https://conda.anaconda.org/conda-forge/

Run exports

The build and host section contain a run_exports dictionary that contains collected run_exports from all direct dependencies. The dictionary contains name: run_export pairs. A run_export entry contains the keys:

weak: [list of weak run exports]
strong: [list of strong run exports]
weak_constrains: [list of weak constrains]
strong_constrains: [list of strong constrains]
noarch: [list of noarch run exports]

The run section also contains a single run_exports entry that is used to generate the run_exports metadata for the package that we are currently building. Different from the other run_exports, these are "outgoing" run_exports.

Finalized sources

This section contains the finalized sources that were used at build-time. For git sources, this contains a reference to the commit hash that was used. For url and path sources, this contains the URL and the SHA256 hash of the downloaded file.

finalized_sources:
- path: ../
- git: https://github.com/ros2-gbp/rosidl_typesupport_fastrtps-release.git
rev: 7af149d83d7e4a2d4c9ce4ae9682bff4a8ebc28e # here we are storing the commit hash
target_directory: ros-humble-fastrtps-cmake-module/src/work
- url: https://github.com/watchexec/watchexec/archive/refs/tags/v1.25.1.tar.gz
sha256: 9609163c14cd49ec651562838f38b88ed2d370e354af312ddc78c2be76c08d37

The following fields are available for each source:

Path source

The sha256 field is added if it is not already present in the source description. We should compute the SHA hashes of the patches as well and store it in the source description.

path: # path to the source
sha256: # computed sha256 hash of the source (this is only added if not in the source entry in the original recipe)
patches: # list of patches that should be applied to the source
target_directory: # optional target directory where the source should be extracted
file_name: # optional file name
use_gitignore: # optional bool whether to use the .gitignore file when copying a directory

Git source

git: # git URL
rev: # resolved commit hash at build time
depth: # optional depth to clone the repository
patches: # list of patches that should be applied to the source
target_directory: # optional target directory where the source should be extracted
lfs: # optional bool to request the lfs pull in git source

URL source

url: # URL to the source code
sha256: # sha256 hash of the downloaded file
md5: # md5 hash of the downloaded file
file_name: # optional file name to rename the downloaded file
patches: # list of patches that should be applied to the source
target_directory: # optional target directory where the source should be extracted

System tools

This section records all system tools that were used during build execution and their versions (if available). This is useful for tracking the tools that were used from the host system in order to warn if reproducing the build on a different host system might lead to different results. It also records the version of the build tool (conda-build, rattler-build, etc) itself, so a future build could be reproduced with the same version of these tools.

system_tools:
rattler-build: "0.14.0"
patchelf: "0.12"
git: "2.33.0"

Full Example

rendered_recipe_version: 1
recipe:
schema_version: 1
package:
name: curl
version: 8.0.1
source:
- url: http://curl.haxx.se/download/curl-8.0.1.tar.bz2
sha256: 9b6b1e96b748d04b968786b6bdf407aa5c75ab53a3d37c1c8c81cdb736555ccf
build:
number: 0
string: h60d57d3_0
requirements:
build:
- compiler: c
- make
- perl
- pkg-config
- libtool
host:
- zlib
tests:
- script:
- curl --version
about:
homepage: http://curl.haxx.se/
repository: https://github.com/curl/curl
documentation: https://curl.haxx.se/docs/
license: curl
license_file:
- COPYING
summary: tool and library for transferring data with URL syntax
description: |-
Curl is an open source command line tool and library for transferring data
with URL syntax. It is used in command lines or scripts to transfer data.
build_configuration:
target_platform: osx-arm64
host_platform: osx-arm64
build_platform: osx-arm64
variant:
target_platform: osx-arm64
hash:
hash: 60d57d3
directories:
host_prefix: /Users/wolfv/Programs/rattler-build/output/bld/rattler-build_curl_1713018930/host_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold
build_prefix: /Users/wolfv/Programs/rattler-build/output/bld/rattler-build_curl_1713018930/build_env
work_dir: /Users/wolfv/Programs/rattler-build/output/bld/rattler-build_curl_1713018930/work
build_dir: /Users/wolfv/Programs/rattler-build/output/bld/rattler-build_curl_1713018930
channels:
- conda-forge
channel_priority: strict
solve_strategy: highest
timestamp: 2024-04-13T14:35:30.774863Z
subpackages:
curl:
name: curl
version: 8.0.1
build_string: h60d57d3_0
packaging_settings:
archive_type: conda
compression_level: 15
finalized_dependencies:
build:
specs:
# specs record the source, can be one of `raw`, `compiler`, `pin_subpackage`, `pin_compatible`, `variant`, `run_export`
- compiler: c
spec: clang_osx-arm64
- source: make
- source: perl
- source: pkg-config
- source: libtool
resolved:
- build: he57ea6c_1
build_number: 1
depends: []
license: GPL-3.0-or-later
license_family: GPL
md5: 1939d04ef89e38fde652ee8c669e092f
name: make
sha256: a011e3e1c4caec821eb4213d0a0154d39e5f81a44d2e8bafe6f84e7840c3909e
size: 253227
subdir: osx-arm64
timestamp: 1602706492919
version: "4.3"
fn: make-4.3-he57ea6c_1.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/make-4.3-he57ea6c_1.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: hab62308_1008
build_number: 1008
depends:
- libglib >=2.70.2,<3.0a0
- libiconv >=1.16,<2.0.0a0
license: GPL-2.0-or-later
license_family: GPL
md5: 8d173d52214679033079d1b0582075aa
name: pkg-config
sha256: e59e69111709d097f9938e72ba19811ec1ef36aababdbed77bd7c767f15639e0
size: 46049
subdir: osx-arm64
timestamp: 1650239029040
version: 0.29.2
fn: pkg-config-0.29.2-hab62308_1008.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hab62308_1008.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: h0d3ecfb_2
build_number: 2
depends: []
license: LGPL-2.1-only
md5: 69bda57310071cf6d2b86caf11573d2d
name: libiconv
sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304
size: 676469
subdir: osx-arm64
timestamp: 1702682458114
version: "1.17"
fn: libiconv-1.17-h0d3ecfb_2.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda
channel: https://conda.anaconda.org/conda-forge/
- build: hb7217d7_0
build_number: 0
depends: []
license: GPL-2.0-or-later
license_family: GPL
md5: fe8efc3385f58f0055e8100b07225055
name: libtool
sha256: efe50471d2baea151f2a93f1f99c05553f8c88e3f0065cdc267e1aa2e8c42449
size: 408403
subdir: osx-arm64
timestamp: 1672362003513
version: 2.4.7
fn: libtool-2.4.7-hb7217d7_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: 7_h4614cfb_perl5
build_number: 7
depends: []
license: GPL-1.0-or-later OR Artistic-1.0-Perl
md5: ba3cbe93f99e896765422cc5f7c3a79e
name: perl
sha256: b0c55040d2994fd6bf2f83786561d92f72306d982d6ea12889acad24a9bf43b8
size: 14439531
subdir: osx-arm64
timestamp: 1703311335652
version: 5.32.1
fn: perl-5.32.1-7_h4614cfb_perl5.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda
channel: https://conda.anaconda.org/conda-forge/
run_exports:
weak:
- perl >=5.32.1,<5.33.0a0 *_perl5
noarch:
- perl >=5.32.1,<6.0a0 *_perl5
- build: hfc324ee_4
build_number: 4
constrains:
- glib 2.80.0 *_4
depends:
- libffi >=3.4,<4.0a0
- libiconv >=1.17,<2.0a0
- libintl >=0.22.5,<1.0a0
- libzlib >=1.2.13,<1.3.0a0
- pcre2 >=10.43,<10.44.0a0
license: LGPL-2.1-or-later
md5: c0de76b2c1f1bee86ca8660684ab6ec4
name: libglib
sha256: 48f371fcb374020c140b26dbfc9a6ef3fbc834334e8cca984120be7bffa6d1bf
size: 2638588
subdir: osx-arm64
timestamp: 1712590361453
version: 2.80.0
fn: libglib-2.80.0-hfc324ee_4.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_4.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h26f9a81_0
build_number: 0
depends:
- bzip2 >=1.0.8,<2.0a0
- libzlib >=1.2.13,<1.3.0a0
license: BSD-3-Clause
license_family: BSD
md5: 1ddc87f00014612830f3235b5ad6d821
name: pcre2
sha256: 4bf7b5fa091f5e7ab0b78778458be1e81c1ffa182b63795734861934945a63a7
size: 615219
subdir: osx-arm64
timestamp: 1708118184900
version: "10.43"
fn: pcre2-10.43-h26f9a81_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h8fbad5d_2
build_number: 2
depends:
- libiconv >=1.17,<2.0a0
license: LGPL-2.1-or-later
md5: 3d216d0add050129007de3342be7b8c5
name: libintl
sha256: 21bc79bdf34ffd20cb84d2a8bd82d7d0e2a1b94b9e72773f0fb207e5b4f1ff63
size: 81206
subdir: osx-arm64
timestamp: 1712512755390
version: 0.22.5
fn: libintl-0.22.5-h8fbad5d_2.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h53f4e23_5
build_number: 5
constrains:
- zlib 1.2.13 *_5
depends: []
license: Zlib
license_family: Other
md5: 1a47f5236db2e06a320ffa0392f81bd8
name: libzlib
sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a
size: 48102
subdir: osx-arm64
timestamp: 1686575426584
version: 1.2.13
fn: libzlib-1.2.13-h53f4e23_5.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h93a5062_5
build_number: 5
depends: []
license: bzip2-1.0.6
license_family: BSD
md5: 1bbc659ca658bfd49a481b5ef7a0f40f
name: bzip2
sha256: bfa84296a638bea78a8bb29abc493ee95f2a0218775642474a840411b950fe5f
size: 122325
subdir: osx-arm64
timestamp: 1699280294368
version: 1.0.8
fn: bzip2-1.0.8-h93a5062_5.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h3422bc3_5
build_number: 5
depends: []
license: MIT
license_family: MIT
md5: 086914b672be056eb70fd4285b6783b6
name: libffi
sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca
size: 39020
subdir: osx-arm64
timestamp: 1636488587153
version: 3.4.2
fn: libffi-3.4.2-h3422bc3_5.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: h54d7cd3_11
build_number: 11
depends:
- clang_impl_osx-arm64 18.1.3 hda94301_11
license: BSD-3-Clause
license_family: BSD
md5: 7bdafeb8d61d59551df2417995bc3d46
name: clang_osx-arm64
sha256: 595cbec0f835ba16ad551315079193d16fc7f3a4e136aa1045ab9104cac79bf7
size: 20490
subdir: osx-arm64
timestamp: 1712621394350
version: 18.1.3
fn: clang_osx-arm64-18.1.3-h54d7cd3_11.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-18.1.3-h54d7cd3_11.conda
channel: https://conda.anaconda.org/conda-forge/
- build: hda94301_11
build_number: 11
depends:
- cctools_osx-arm64
- clang 18.1.3.*
- compiler-rt 18.1.3.*
- ld64_osx-arm64
- llvm-tools 18.1.3.*
license: BSD-3-Clause
license_family: BSD
md5: 90e54a957e833f7cd2412b6d2e1d84fa
name: clang_impl_osx-arm64
sha256: f00e3930fa341ad5fa87a90f297b385a949bf2ee100a3a2cc2a135629fde6d7e
size: 17571
subdir: osx-arm64
timestamp: 1712621386541
version: 18.1.3
fn: clang_impl_osx-arm64-18.1.3-hda94301_11.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-18.1.3-hda94301_11.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h30cc82d_0
build_number: 0
constrains:
- llvm 18.1.3
- clang-tools 18.1.3
- clang 18.1.3
- llvmdev 18.1.3
depends:
- libllvm18 18.1.3 h30cc82d_0
- libxml2 >=2.12.6,<3.0a0
- libzlib >=1.2.13,<1.3.0a0
- zstd >=1.5.5,<1.6.0a0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: 505aef673d805f9efe0c61954a6a99d0
name: llvm-tools
sha256: 48eb7b17ca6de1b43dfddc3b4a629a8a9764c9da3f3012980e1b917c71f06a4f
size: 23023681
subdir: osx-arm64
timestamp: 1712517958538
version: 18.1.3
fn: llvm-tools-18.1.3-h30cc82d_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.3-h30cc82d_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h3808999_0
build_number: 0
depends:
- clang 18.1.3.*
- clangxx 18.1.3.*
- compiler-rt_osx-arm64 18.1.3.*
license: Apache-2.0 WITH LLVM-exception
license_family: APACHE
md5: 09f614cf0dc4ea2b249c2e522b337730
name: compiler-rt
sha256: dfada604649fb2cfa6fb3dbd657fccf81cd01e00a7f6f29da24fc40e36cd51fa
size: 96152
subdir: osx-arm64
timestamp: 1712580507858
version: 18.1.3
fn: compiler-rt-18.1.3-h3808999_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-18.1.3-h3808999_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: default_h4cf2255_0
build_number: 0
constrains:
- clang-tools 18.1.3.*
- llvm 18.1.3.*
- llvm-tools 18.1.3.*
- llvmdev 18.1.3.*
depends:
- clang-18 18.1.3 default_he012953_0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: efbaa3d968b1dcacba9eb980d1ab66f4
name: clang
sha256: 613f4c4773f1dd274d2682a9170d52cb466f437a47ebcad2c2634c3b37aeb73f
size: 22913
subdir: osx-arm64
timestamp: 1712569692457
version: 18.1.3
fn: clang-18.1.3-default_h4cf2255_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18.1.3-default_h4cf2255_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h4f39d0f_0
build_number: 0
depends:
- libzlib >=1.2.13,<1.3.0a0
license: BSD-3-Clause
license_family: BSD
md5: 5b212cfb7f9d71d603ad891879dc7933
name: zstd
sha256: 7e1fe6057628bbb56849a6741455bbb88705bae6d6646257e57904ac5ee5a481
size: 400508
subdir: osx-arm64
timestamp: 1693151393180
version: 1.5.5
fn: zstd-1.5.5-h4f39d0f_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h30cc82d_0
build_number: 0
depends:
- libcxx >=16
- libxml2 >=2.12.6,<3.0a0
- libzlib >=1.2.13,<1.3.0a0
- zstd >=1.5.5,<1.6.0a0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: fad73e8421bcd0de381d172c2224d3a5
name: libllvm18
sha256: 5a8781ab13b163fd028916d050bb209718b14de85493bb7a4b93ea798998b9fe
size: 25782519
subdir: osx-arm64
timestamp: 1712517407600
version: 18.1.3
fn: libllvm18-18.1.3-h30cc82d_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.3-h30cc82d_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h3808999_0
build_number: 0
constrains:
- compiler-rt 18.1.3
depends:
- clang 18.1.3.*
- clangxx 18.1.3.*
license: Apache-2.0 WITH LLVM-exception
license_family: APACHE
md5: 78c11131b59e53aedcf7854956a9347c
name: compiler-rt_osx-arm64
noarch: generic
sha256: 4bbe97d77ae12edd5c0206d014e0473ae8c4fcacbc1e1b21e8e92fd694608301
size: 10165573
subdir: noarch
timestamp: 1712580450851
version: 18.1.3
fn: compiler-rt_osx-arm64-18.1.3-h3808999_0.conda
url: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-18.1.3-h3808999_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: default_h4cf2255_0
build_number: 0
depends:
- clang 18.1.3 default_h4cf2255_0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: fd98656c5b62774633c84c41f42bdd6d
name: clangxx
sha256: 1f9c1605d4f74b1d5df7d44676a5a6c53d542fc8c44d94fcc1d4d1977cede661
size: 22939
subdir: osx-arm64
timestamp: 1712569715149
version: 18.1.3
fn: clangxx-18.1.3-default_h4cf2255_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-18.1.3-default_h4cf2255_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: default_he012953_0
build_number: 0
constrains:
- clang-tools 18.1.3
- clangxx 18.1.3
- llvm-tools 18.1.3
- clangdev 18.1.3
depends:
- libclang-cpp18.1 18.1.3 default_he012953_0
- libcxx >=16.0.6
- libllvm18 >=18.1.3,<18.2.0a0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: 931dd6124b399ae12172f235f5ace407
name: clang-18
sha256: edb5c1e2ffc7704b0e0bce0f5315eb1aba8fd9710e61bcbdeb40e340720123c6
size: 754206
subdir: osx-arm64
timestamp: 1712569562918
version: 18.1.3
fn: clang-18-18.1.3-default_he012953_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18-18.1.3-default_he012953_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h4653b0c_0
build_number: 0
depends: []
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: 9d7d724faf0413bf1dbc5a85935700c8
name: libcxx
sha256: 11d3fb51c14832d9e4f6d84080a375dec21ea8a3a381a1910e67ff9cedc20355
size: 1160232
subdir: osx-arm64
timestamp: 1686896993785
version: 16.0.6
fn: libcxx-16.0.6-h4653b0c_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: default_he012953_0
build_number: 0
depends:
- libcxx >=16.0.6
- libllvm18 >=18.1.3,<18.2.0a0
license: Apache-2.0 WITH LLVM-exception
license_family: Apache
md5: d8e0decc03dadc234e0885bb2a857c68
name: libclang-cpp18.1
sha256: a528f933aa430c86591ed94e7eb5e4c16947232f149920250ba78e104d91e0b3
size: 12809223
subdir: osx-arm64
timestamp: 1712569190982
version: 18.1.3
fn: libclang-cpp18.1-18.1.3-default_he012953_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp18.1-18.1.3-default_he012953_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h5e7191b_0
build_number: 0
constrains:
- ld 711.*
- cctools 986.*
- cctools_osx-arm64 986.*
- clang >=18.1.1,<19.0a0
depends:
- libcxx
- libllvm18 >=18.1.1,<18.2.0a0
- sigtool
- tapi >=1100.0.11,<1101.0a0
license: APSL-2.0
license_family: Other
md5: c751b76ae8112e3d516831063da179cc
name: ld64_osx-arm64
sha256: 82f964dcff2052b327762ca44651407451ad396a1540c664928841c72b7cf3c0
size: 1064448
subdir: osx-arm64
timestamp: 1710484550965
version: "711"
fn: ld64_osx-arm64-711-h5e7191b_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-711-h5e7191b_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: hd11630f_0
build_number: 0
constrains:
- cctools 986.*
- clang 18.1.*
- ld64 711.*
depends:
- ld64_osx-arm64 >=711,<712.0a0
- libcxx
- libllvm18 >=18.1.1,<18.2.0a0
- libzlib >=1.2.13,<1.3.0a0
- sigtool
license: APSL-2.0
license_family: Other
md5: cce200c91b2d291c85e66098fe0d31c2
name: cctools_osx-arm64
sha256: 4152323bbb78e2730fea9004333c9c51fb82a9ddd935f005280bf621849ec53d
size: 1123368
subdir: osx-arm64
timestamp: 1710484635601
version: "986"
fn: cctools_osx-arm64-986-hd11630f_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-986-hd11630f_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: he4954df_0
build_number: 0
depends:
- libcxx >=11.0.0.a0
license: NCSA
license_family: MIT
md5: d83362e7d0513f35f454bc50b0ca591d
name: tapi
sha256: 1709265fbee693a9e8b4126b0a3e68a6c4718b05821c659279c1af051f2d40f3
size: 191416
subdir: osx-arm64
timestamp: 1602687595316
version: 1100.0.11
fn: tapi-1100.0.11-he4954df_0.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: h0d0cfa8_1
build_number: 1
depends:
- icu >=73.2,<74.0a0
- libiconv >=1.17,<2.0a0
- libzlib >=1.2.13,<1.3.0a0
- xz >=5.2.6,<6.0a0
license: MIT
license_family: MIT
md5: c08526c957192192e1e7b4f622761144
name: libxml2
sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3
size: 588539
subdir: osx-arm64
timestamp: 1711318256840
version: 2.12.6
fn: libxml2-2.12.6-h0d0cfa8_1.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h57fd34a_0
build_number: 0
depends: []
license: LGPL-2.1 and GPL-2.0
md5: 39c6b54e94014701dd157f4f576ed211
name: xz
sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec
size: 235693
subdir: osx-arm64
timestamp: 1660346961024
version: 5.2.6
fn: xz-5.2.6-h57fd34a_0.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: hc8870d7_0
build_number: 0
depends: []
license: MIT
license_family: MIT
md5: 8521bd47c0e11c5902535bb1a17c565f
name: icu
sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1
size: 11997841
subdir: osx-arm64
timestamp: 1692902104771
version: "73.2"
fn: icu-73.2-hc8870d7_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda
channel: https://conda.anaconda.org/conda-forge/
- build: h44b9a77_0
build_number: 0
depends:
- openssl >=3.0.0,<4.0a0
license: MIT
license_family: MIT
md5: 4a2cac04f86a4540b8c9b8d8f597848f
name: sigtool
sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff
size: 210264
subdir: osx-arm64
timestamp: 1643442231687
version: 0.1.3
fn: sigtool-0.1.3-h44b9a77_0.tar.bz2
url: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2
channel: https://conda.anaconda.org/conda-forge/
- build: h0d3ecfb_1
build_number: 1
constrains:
- pyopenssl >=22.1
depends:
- ca-certificates
license: Apache-2.0
license_family: Apache
md5: eb580fb888d93d5d550c557323ac5cee
name: openssl
sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b
size: 2855250
subdir: osx-arm64
timestamp: 1710793435903
version: 3.2.1
fn: openssl-3.2.1-h0d3ecfb_1.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda
channel: https://conda.anaconda.org/conda-forge/
- build: hf0a4a13_0
build_number: 0
depends: []
license: ISC
md5: fb416a1795f18dcc5a038bc2dc54edf9
name: ca-certificates
sha256: 49bc3439816ac72d0c0e0f144b8cc870fdcc4adec2e861407ec818d8116b2204
size: 155725
subdir: osx-arm64
timestamp: 1706844034242
version: 2024.2.2
fn: ca-certificates-2024.2.2-hf0a4a13_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda
channel: https://conda.anaconda.org/conda-forge/
host:
specs:
- source: zlib
resolved:
- build: h0d3ecfb_0
build_number: 0
depends:
- libzlib 1.3.1 h0d3ecfb_0
license: Zlib
license_family: Other
md5: 7ae2a86abebc82333e585a40b60fb1ab
name: zlib
sha256: c6c947aa8bf6f471f58c37aa7a20bc121adfd1b3a92e3f73e7962b2cfb288990
size: 85372
subdir: osx-arm64
timestamp: 1709241186776
version: 1.3.1
fn: zlib-1.3.1-h0d3ecfb_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h0d3ecfb_0.conda
channel: https://conda.anaconda.org/conda-forge/
run_exports:
weak:
- libzlib >=1.3.1,<1.4.0a0
- build: h0d3ecfb_0
build_number: 0
constrains:
- zlib 1.3.1 *_0
depends: []
license: Zlib
license_family: Other
md5: 2a2463424cc5e961a6d04bbbfb5838cf
name: libzlib
sha256: 9c59bd3f3e3e1900620e3a85c04d3a3699cb93c714333d06cb8afdd7addaae9d
size: 47040
subdir: osx-arm64
timestamp: 1709241137619
version: 1.3.1
fn: libzlib-1.3.1-h0d3ecfb_0.conda
url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h0d3ecfb_0.conda
channel: https://conda.anaconda.org/conda-forge/
run:
depends:
- source: run_export
spec: libzlib >=1.3.1,<1.4.0a0
from: host
source_package: zlib
constraints: []
finalized_sources:
- url: http://curl.haxx.se/download/curl-8.0.1.tar.bz2
sha256: 9b6b1e96b748d04b968786b6bdf407aa5c75ab53a3d37c1c8c81cdb736555ccf
system_tools:
codesign: ""
rattler-build: 0.14.2

Changelog

  • 2026-04-17: Minted as CEP 40. Added missing header table, abstract section, and adjusted formatting slightly.
  • 2024-07-22: Accepted.
  • 2024-04-13: Submitted to https://github.com/conda/ceps/pull/74.

All CEPs are explicitly CC0 1.0 Universal.