rust-lang / const-eval

home for proposals in and around compile-time function evaluation
Apache License 2.0
105 stars 17 forks source link

Listing directories or matching globs in const evaluation #45

Open joshtriplett opened 4 years ago

joshtriplett commented 4 years ago

(Filing this at @oli-obk's request, based on discussions on Zulip. Related to https://github.com/rust-lang/const-eval/issues/44 .)

We should be able to get lists of files on the filesystem, within const eval. This would work similarly to getting file contents via include_bytes!. We'd get a full directory listing (or a full list of files matching a glob), sort it for reproducibility, and use similar machinery for "rebuild if this changes".

(Note that unlike a file, where we might be able to use timestamps, for a directory and especially for a glob, we may have to just generate the file list unconditionally and compare secure hashes of it to decide if we need to rebuild. That has performance implications for no-op builds.)

@oli-obk suggested that this could work by tagging specific portions of low-level directory I/O as something akin to lang items, and then implementing that low-level directory I/O specially in CTFE.

(As a first pass, before supporting the full standard API at compile time, we could have macros like include_dir_list! or include_file_glob_list! that just return something like &[Path].)

Frostie314159 commented 1 year ago

What you are describing is a proc macro. Const eval should be deterministic, which file access is not.