# rattler-build cache We want to be able to "cache" an intermediary build result for multiple reasons. The main use-case is to split a single build into multiple packages (such as headers, shared library, static library), without needing to rerun the build. We propose to add a single "cache" step to rattler-build. ```yaml cache: requirements: build: - ${{ compiler }} - cmake - ninja script: - cmake build ... ``` The cache is built like a normal package, and then the work - directory and any new files from the prefix are zipped up in a cache folder. For each output we extract the files again from that cache. **QUESTIONS** - should the cache step already "install" files into the host prefix? This would make it easy to split the package later but makes caching a bit harder since we need to zip up both new files from host + the work directory. - Does any of this really make sense or would `ccache` / `sccache` integration be superior? - WV: *Actually, the configuration step takes quite some time, e.g. when invoking cmake or autotools* - Antoine P: _about terminology, maybe something in the lines of "pre-build"/"build-common" would be more explicit, especially wrt "does the cache install?". Pre-build could be more explicit in case the "cache" is not installed. I also hope to see caching in-between builds (a la `ccache`, `sccache`) in the future, so "cache" may have multiple meanings in the future._ Use cases: - C++ library + Python library (e.g. mamba) - C++ split package (headers, library, debug symbols) - ...? To make it easy to produce split packages, we would add a file-glob step to rattler-build, e.g. ```yaml outputs: - package: name: libfoo files: - lib/** - include/** - package: name: py-libfoo files: - site-packages/** ``` ## Challenges How do we handle run-dependencies exported from the cache step? Antoine P: _Sometimes even build requirements (compiler, libs) need to be shared because some compilation can be shared, but not all. Alternatively, perhaps the abstraction we are looking for is not a "package"-like cache but a "reusable build step". Listing it a script element would have the both the effect of caching, but also of "merging" all dependencies. In fact, since for caching these needs to be called first, perhaps a new key like "script-reuse" would be needed._ If we have an output-chain, should only the first one get the run exports applied? For example: outputs: - bla - py-bla -> requires bla It would be enough if `bla` get's the run exports from the cache.