diff options
| author | Melody Horn <melody@boringcactus.com> | 2021-04-05 11:41:17 -0600 | 
|---|---|---|
| committer | Melody Horn <melody@boringcactus.com> | 2021-04-05 11:41:17 -0600 | 
| commit | c50170f000d382fa02090fbf79d0e5d12036f53b (patch) | |
| tree | 99172664a9e670788eaa737510f57a55ca551a1d | |
| parent | 45529cca7626677416c8d6048b5de8f4ff615fb8 (diff) | |
| download | makers-c50170f000d382fa02090fbf79d0e5d12036f53b.tar.gz makers-c50170f000d382fa02090fbf79d0e5d12036f53b.zip | |
implement function `realpath`
| -rw-r--r-- | src/makefile/functions.rs | 18 | 
1 files changed, 18 insertions, 0 deletions
| diff --git a/src/makefile/functions.rs b/src/makefile/functions.rs index 6dacd10..6815ac4 100644 --- a/src/makefile/functions.rs +++ b/src/makefile/functions.rs @@ -53,6 +53,10 @@ pub fn expand_call(              assert_eq!(args.len(), 1);              file_name::wildcard(macros, &args[0])          } +        "realpath" => { +            assert_eq!(args.len(), 1); +            file_name::realpath(macros, &args[0]) +        }          "if" => {              assert!(args.len() == 2 || args.len() == 3); @@ -179,6 +183,7 @@ mod text {  mod file_name {      use std::env;      use std::ffi::OsStr; +    use std::fs;      use std::path::Path;      use eyre::WrapErr; @@ -246,6 +251,19 @@ mod file_name {              .collect::<Vec<_>>();          Ok(results.join(" "))      } + +    pub fn realpath(macros: &MacroSet, targets: &TokenString) -> Result<String> { +        let targets = macros.expand(targets)?; +        let results = targets +            .split_whitespace() +            .map(|x| { +                fs::canonicalize(x) +                    .map(|p| p.to_string_lossy().into_owned()) +                    .unwrap_or_else(|_| x.to_owned()) +            }) +            .collect::<Vec<_>>(); +        Ok(results.join(" ")) +    }  }  // Functions for Conditionals |