Regarding the "install-plan", I suggest the following syntax: (SOURCE TARGET [FILTERS]) In the above, FILTERS are optional. - When SOURCE matches a file or directory without trailing slash, install it to TARGET. - If TARGET has a trailing slash, install SOURCE basename beneath TARGET. - Otherwise install SOURCE as TARGET. - When SOURCE is a directory with a trailing slash, or when FILTERS are used, the trailing slash of TARGET is implied. - Without FILTERS, install the full SOURCE _content_ to TARGET. The paths relative to SOURCE are preserved within TARGET. - With FILTERS among `#:include`, `#:include-regexp`, `#:exclude`, `#:exclude-regexp`: - With `#:include`, install only the exact subpaths in the list. - With `#:include-regexp`, install subpaths matching the regexps in the list. - The `#:exclude*` FILTERS work similarly. Without `#:include*` flags, install every subpath but the files matching the `#:exlude*` filters. If both `#:include*` and `#:exclude*` are specified, the exclusion is done on the inclusion list. Examples: - `("foo/bar" "share/my-app/")`: Install bar to "share/my-app/bar". - `("foo/bar" "share/my-app/baz")`: Install bar to "share/my-app/baz". - `("foo/" "share/my-app")`: Install the content of foo inside "share/my-app", e.g. install "foo/sub/file" to "share/my-app/sub/file". - `("foo/" "share/my-app" #:include ("sub/file"))`: Install only "foo/sub/file" to "share/my-app/sub/file". - `("foo/sub" "share/my-app" #:include ("file"))`: Install "foo/sub/file" to "share/my-app/file". Maybe instead of having two #:include and #:include-regexp we could have just one #:include in which the list elements have a "marker" that tells whether they are regexps or not. Clojure uses #"..." to mark regexps. Does Guile have something similar? Any other suggestion? -- Pierre Neidhardt https://ambrevar.xyz/