1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use std::{io, path, process};
pub (crate) use self::toolchain::toolchain;
mod cargo;
mod env;
mod exec;
mod redoxfs;
mod toolchain;
const SUPPORTED_TARGETS: &'static [&'static str] = &[
"x86_64-unknown-redox",
"aarch64-unknown-redox"
];
#[cfg(target_os = "linux")]
fn installed(program: &str) -> io::Result<bool> {
process::Command::new("which")
.arg(program)
.stdout(process::Stdio::null())
.status()
.map(|x| x.success())
}
fn redoxer_dir() -> path::PathBuf {
dirs::home_dir().unwrap_or(path::PathBuf::from("."))
.join(".redoxer")
}
#[cfg(target_os = "linux")]
fn running(program: &str) -> io::Result<bool> {
process::Command::new("pgrep")
.arg(program)
.stdout(process::Stdio::null())
.status()
.map(|x| x.success())
}
fn status_error(status: process::ExitStatus) -> io::Result<()> {
if status.success() {
Ok(())
} else {
Err(io::Error::new(
io::ErrorKind::Other,
format!("{}", status)
))
}
}
fn syscall_error(err: syscall::Error) -> io::Error {
io::Error::from_raw_os_error(err.errno)
}
fn usage() {
eprintln!("redoxer bench - cargo bench with Redox target in Redox VM");
eprintln!("redoxer build - cargo build with Redox target");
eprintln!("redoxer check - cargo check with Redox target");
eprintln!("redoxer doc - cargo doc with Redox target");
eprintln!("redoxer env - execute a command in cross-compilation environment");
eprintln!("redoxer exec - execute a command in Redox VM");
eprintln!("redoxer install - cargo install with Redox target");
eprintln!("redoxer run - cargo run with Redox target in Redox VM");
eprintln!("redoxer rustc - cargo rustc with Redox target");
eprintln!("redoxer test - cargo test with Redox target in Redox VM");
eprintln!("redoxer toolchain - install toolchain");
process::exit(1);
}
pub fn target() -> &'static str {
let target_from_env = std::env::var("TARGET").unwrap_or("".to_string());
let index = if SUPPORTED_TARGETS.contains(&&*target_from_env) == true {
SUPPORTED_TARGETS.iter().position(|t| **t == target_from_env).unwrap().into()
} else {
0usize
};
SUPPORTED_TARGETS[index]
}
pub fn main(args: &[String]) {
match args.get(1) {
Some(arg) => match arg.as_str() {
"bench" |
"build" |
"check" |
"doc" |
"install" |
"run" |
"rustc" |
"test" => cargo::main(args),
"env" => env::main(args),
"exec" => exec::main(args),
"toolchain" => toolchain::main(args),
_ => usage(),
},
None => usage(),
}
}