mirror of
https://github.com/esp-rs/espup.git
synced 2025-09-28 21:30:47 +00:00
Add gcc file download
This commit is contained in:
parent
273e098e81
commit
09e352407e
113
src/main.rs
113
src/main.rs
@ -2,6 +2,7 @@ extern crate clap;
|
|||||||
extern crate json;
|
extern crate json;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use clap_nested::Commander;
|
use clap_nested::Commander;
|
||||||
|
use dirs::home_dir;
|
||||||
// use std::error::Error;
|
// use std::error::Error;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
|
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
|
||||||
@ -18,6 +19,7 @@ mod config;
|
|||||||
mod idf;
|
mod idf;
|
||||||
mod package;
|
mod package;
|
||||||
mod shell;
|
mod shell;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
// General TODOs:
|
// General TODOs:
|
||||||
// - Prettify prints (add emojis)
|
// - Prettify prints (add emojis)
|
||||||
@ -110,7 +112,7 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
println!("{:?}", args);
|
println!("{:?}", args);
|
||||||
let arch = guess_host_triple::guess_host_triple().unwrap();
|
let arch = guess_host_triple::guess_host_triple().unwrap();
|
||||||
println!("{}", arch);
|
println!("{}", arch);
|
||||||
let targets: Vec<Chip> = parse_targets(args.build_target)?;
|
let targets: Vec<Chip> = parse_targets(&args.build_target)?;
|
||||||
println!("targets: {:?}", targets);
|
println!("targets: {:?}", targets);
|
||||||
let llvm_version = parse_llvm_version(&args.llvm_version).unwrap();
|
let llvm_version = parse_llvm_version(&args.llvm_version).unwrap();
|
||||||
println!("llvm_version: {:?}", llvm_version);
|
println!("llvm_version: {:?}", llvm_version);
|
||||||
@ -121,7 +123,7 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
let llvm_file = format!(
|
let llvm_file = format!(
|
||||||
"xtensa-esp32-elf-llvm{}-{}-{}.{}",
|
"xtensa-esp32-elf-llvm{}-{}-{}.{}",
|
||||||
get_llvm_version_with_underscores(&llvm_version),
|
get_llvm_version_with_underscores(&llvm_version),
|
||||||
&llvm_release,
|
&llvm_version,
|
||||||
llvm_arch,
|
llvm_arch,
|
||||||
artifact_file_extension
|
artifact_file_extension
|
||||||
);
|
);
|
||||||
@ -139,45 +141,25 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
);
|
);
|
||||||
let llvm_url = format!(
|
let llvm_url = format!(
|
||||||
"https://github.com/espressif/llvm-project/releases/download/{}/{}",
|
"https://github.com/espressif/llvm-project/releases/download/{}/{}",
|
||||||
&llvm_release, llvm_file
|
&llvm_version, llvm_file
|
||||||
);
|
);
|
||||||
let idf_tool_xtensa_elf_clang = format!(
|
let idf_tool_xtensa_elf_clang = format!(
|
||||||
"{}/{}-{}",
|
"{}/{}-{}",
|
||||||
get_tool_path("xtensa-esp32-elf-clang".to_string()),
|
get_tool_path("xtensa-esp32-elf-clang".to_string()),
|
||||||
&llvm_release,
|
&llvm_version,
|
||||||
arch
|
arch
|
||||||
);
|
);
|
||||||
|
|
||||||
|
check_rust_installation(&args.nightly_version);
|
||||||
return Ok(());
|
|
||||||
|
|
||||||
// TODO: Move to a function
|
// TODO: Move to a function
|
||||||
match std::process::Command::new("rustup")
|
|
||||||
.args(["toolchain", "list"])
|
|
||||||
.stdout(Stdio::piped())
|
|
||||||
.output()
|
|
||||||
{
|
|
||||||
Ok(child_output) => {
|
|
||||||
println!("rustup found.");
|
|
||||||
let result = String::from_utf8_lossy(&child_output.stdout);
|
|
||||||
if !result.contains(&args.nightly_version) {
|
|
||||||
println!("nightly toolchain not found");
|
|
||||||
install_rust_nightly(&args.nightly_version);
|
|
||||||
} else {
|
|
||||||
println!("nightly toolchain found.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
println!("Error: {}", e);
|
|
||||||
install_rustup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if args.toolchain_destination.exists() {
|
if args.toolchain_destination.exists() {
|
||||||
println!(
|
println!(
|
||||||
"Previous installation of Rust Toolchain exist in: {}",
|
"Previous installation of Rust Toolchain exist in: {}",
|
||||||
args.toolchain_destination.display().to_string()
|
args.toolchain_destination.display().to_string()
|
||||||
);
|
);
|
||||||
println!("Please, remove the directory before new installation.");
|
println!("Please, remove the directory before new installation.");
|
||||||
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
// install_rust_xtensa_toolchain
|
// install_rust_xtensa_toolchain
|
||||||
// Some platfroms like Windows are available in single bundle rust + src, because install
|
// Some platfroms like Windows are available in single bundle rust + src, because install
|
||||||
@ -276,7 +258,7 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
match prepare_package_strip_prefix(
|
match prepare_package_strip_prefix(
|
||||||
&llvm_url,
|
&llvm_url,
|
||||||
get_tool_path(
|
get_tool_path(
|
||||||
format!("xtensa-esp32-elf-clang-{}-{}", &llvm_release, llvm_arch).to_string(),
|
format!("xtensa-esp32-elf-clang-{}-{}", &llvm_version, llvm_arch).to_string(),
|
||||||
),
|
),
|
||||||
"",
|
"",
|
||||||
) {
|
) {
|
||||||
@ -293,9 +275,9 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
|
|
||||||
if args.espidf_version.is_some() {
|
if args.espidf_version.is_some() {
|
||||||
idf::install_espidf(args.build_target, args.espidf_version.unwrap())?;
|
idf::install_espidf(args.build_target, args.espidf_version.unwrap())?;
|
||||||
// TODO: Install esp-idf
|
|
||||||
} else {
|
} else {
|
||||||
install_gcc(args.build_target)?;
|
println!("No esp-idf version provided. Installing gcc for targets");
|
||||||
|
install_gcc_targets(targets)?;
|
||||||
// TODO: Install gcc for targets
|
// TODO: Install gcc for targets
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,12 +438,50 @@ fn get_gcc_arch(arch: &str) -> &str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn install_gcc(targets: String) -> Result<()> {
|
fn install_gcc_targets(targets: Vec<Chip>) -> Result<()> {
|
||||||
|
for target in targets {
|
||||||
|
match target {
|
||||||
|
Chip::Esp32 => install_gcc("xtensa-esp32-elf"),
|
||||||
|
Chip::Esp32s2 => install_gcc("xtensa-esp32s2-elf"),
|
||||||
|
Chip::Esp32s3 => install_gcc("xtensa-esp32s3-elf"),
|
||||||
|
Chip::Esp32c3 => install_gcc("riscv32-esp-elf"),
|
||||||
|
_ => {
|
||||||
|
println!("Unknown target")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn install_gcc(gcc_target: &str) {
|
||||||
|
let gcc_path = get_tool_path(gcc_target.to_string());
|
||||||
|
println!("gcc path: {}", gcc_path);
|
||||||
|
if Path::new(&gcc_path).exists() {
|
||||||
|
println!("Previous installation of GCC for target: {}", gcc_path);
|
||||||
|
// return Ok(());
|
||||||
|
} else {
|
||||||
|
fs::create_dir_all(&gcc_path).unwrap();
|
||||||
|
let gcc_file = format!(
|
||||||
|
"{}-gcc8_4_0-esp-2021r2-patch3-{}.tar.xz",
|
||||||
|
gcc_target,get_gcc_arch(guess_host_triple::guess_host_triple().unwrap())
|
||||||
|
);
|
||||||
|
println!("Downloading GCC for target: {}", gcc_file);
|
||||||
|
let gcc_dist_url = format!(
|
||||||
|
"https://github.com/espressif/crosstool-NG/releases/download/esp-2021r2-patch3/{}",
|
||||||
|
gcc_file
|
||||||
|
);
|
||||||
|
match prepare_package_strip_prefix(&gcc_dist_url, gcc_path, "") {
|
||||||
|
Ok(_) => {
|
||||||
|
println!("Package {} ready", gcc_file);
|
||||||
|
}
|
||||||
|
Err(_e) => {
|
||||||
|
println!("Unable to prepare {}", gcc_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// TODO: Create test for this function
|
// TODO: Create test for this function
|
||||||
fn parse_targets(build_target: String) -> Result<Vec<Chip>> {
|
fn parse_targets(build_target: &str) -> Result<Vec<Chip>> {
|
||||||
println!("Parsing targets: {}", build_target);
|
println!("Parsing targets: {}", build_target);
|
||||||
let mut chips: Vec<Chip> = Vec::new();
|
let mut chips: Vec<Chip> = Vec::new();
|
||||||
if build_target.contains("all") {
|
if build_target.contains("all") {
|
||||||
@ -475,7 +495,7 @@ fn parse_targets(build_target: String) -> Result<Vec<Chip>> {
|
|||||||
if build_target.contains(' ') || build_target.contains(',') {
|
if build_target.contains(' ') || build_target.contains(',') {
|
||||||
targets = build_target.split([',', ' ']).collect();
|
targets = build_target.split([',', ' ']).collect();
|
||||||
} else {
|
} else {
|
||||||
targets = vec![&build_target];
|
targets = vec![build_target];
|
||||||
}
|
}
|
||||||
for target in targets {
|
for target in targets {
|
||||||
match target {
|
match target {
|
||||||
@ -492,7 +512,7 @@ fn parse_targets(build_target: String) -> Result<Vec<Chip>> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok((chips))
|
Ok(chips)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_llvm_version(llvm_version: &str) -> Result<String> {
|
fn parse_llvm_version(llvm_version: &str) -> Result<String> {
|
||||||
@ -508,5 +528,28 @@ fn parse_llvm_version(llvm_version: &str) -> Result<String> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok((parsed_version.to_string()))
|
Ok(parsed_version.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_rust_installation(nightly_version: &str) {
|
||||||
|
match std::process::Command::new("rustup")
|
||||||
|
.args(["toolchain", "list"])
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.output()
|
||||||
|
{
|
||||||
|
Ok(child_output) => {
|
||||||
|
println!("rustup found.");
|
||||||
|
let result = String::from_utf8_lossy(&child_output.stdout);
|
||||||
|
if !result.contains(nightly_version) {
|
||||||
|
println!("nightly toolchain not found");
|
||||||
|
install_rust_nightly(nightly_version);
|
||||||
|
} else {
|
||||||
|
println!("nightly toolchain found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("Error: {}", e);
|
||||||
|
install_rustup();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user