#pragma once ///@file #include "file-system.hh" namespace nix { struct ExecutablePath { std::vector directories; constexpr static const OsString::value_type separator = #ifdef WIN32 L';' #else ':' #endif ; /** * Parse `path` into a list of paths. * * On Unix we split on `:`, on Windows we split on `;`. * * For Unix, this is according to the POSIX spec for `PATH`. * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 */ static ExecutablePath parse(const OsString & path); /** * Load the `PATH` environment variable and `parse` it. */ static ExecutablePath load(); /** * Opposite of `parse` */ OsString render() const; /** * Search for an executable. * * For Unix, this is according to the POSIX spec for `PATH`. * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 * * @param exe This must just be a name, and not contain any `/` (or * `\` on Windows). in case it does, per the spec no lookup should * be perfomed, and the path (it is not just a file name) as is. * This is the caller's respsonsibility. * * This is a pure function, except for the default `isExecutable` * argument, which uses the ambient file system to check if a file is * executable (and exists). * * @return path to a resolved executable */ std::optional find( const OsString & exe, std::function isExecutableFile = isExecutableFileAmbient) const; bool operator==(const ExecutablePath &) const = default; }; } // namespace nix