diff --git a/Cargo.toml b/Cargo.toml index 98e078d0863..d979f7c4c83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,3 +44,7 @@ serde = { version = "1.0", features = ["derive"] } strum = { version = "0.24", features = ["derive"] } envy = "0.4.2" which = "4.4" + +[patch.crates-io.embuild] +git = "https://github.com/haileys/embuild" +branch = "esp-idf-no-git-repo" diff --git a/build/native/cargo_driver.rs b/build/native/cargo_driver.rs index 74951c5b900..4ca73602adf 100644 --- a/build/native/cargo_driver.rs +++ b/build/native/cargo_driver.rs @@ -10,6 +10,7 @@ use config::{ESP_IDF_REPOSITORY_VAR, ESP_IDF_VERSION_VAR}; use embuild::cargo::IntoWarning; use embuild::cmake::file_api::codemodel::Language; use embuild::cmake::file_api::ObjKind; +use embuild::espidf::SourceTree; use embuild::espidf::{EspIdfOrigin, EspIdfRemote, FromEnvError, DEFAULT_ESP_IDF_REPOSITORY}; use embuild::fs::copy_file_if_different; use embuild::utils::{OsStrExt, PathExt}; @@ -44,7 +45,7 @@ pub fn build() -> Result { if !supported_chips.iter().any(|sc| *sc == chip) { bail!( - "Specified MCU '{chip}' is not amongst the MCUs ([{}]) supported by the build target ('{target}')", + "Specified MCU '{chip}' is not amongst the MCUs ([{}]) supported by the build target ('{target}')", supported_chips.iter().map(|chip| format!("{chip}")).collect::>().join(", ") ); } @@ -68,13 +69,13 @@ pub fn build() -> Result { let cmake_generator = config.native.esp_idf_cmake_generator(); // A closure to specify which tools `idf-tools.py` should install. - let make_tools = move |repo: &git::Repository, + let make_tools = move |tree: &SourceTree, version: &Result| -> Result> { eprintln!( "Using esp-idf {} at '{}'", espidf::EspIdfVersion::format(version), - repo.worktree().display() + tree.path().display() ); let mut tools = vec![]; @@ -122,7 +123,7 @@ pub fn build() -> Result { EspIdfOrigin::Custom(repo) => { eprintln!( "Using custom user-supplied esp-idf repository at '{}' (detected from env variable `{}`)", - repo.worktree().display(), + repo.path().display(), espidf::IDF_PATH_VAR ); if let Some(custom_url) = &config.native.esp_idf_repository { @@ -153,18 +154,24 @@ pub fn build() -> Result { Ok((idf, install_dir.clone())) }; + let esp_idf_dir = config + .native + .idf_path + .as_ref() + .map(|path| path.abspath_relative_to(&workspace_dir)); + // 1. Try to use the activated esp-idf environment if `esp_idf_tools_install_dir` // is `fromenv` or unset. // 2. Use a custom esp-idf repository specified by `$IDF_PATH`/`idf_path` if // available and install the tools using `embuild::espidf::Installer` in // `install_dir`. // 3. Install the esp-idf and its tools in `install_dir`. - match (espidf::EspIdf::try_from_env(), maybe_from_env) { + match (espidf::EspIdf::try_from_env(esp_idf_dir.as_deref()), maybe_from_env) { (Ok(idf), true) => { eprintln!( "Using activated esp-idf {} environment at '{}'", espidf::EspIdfVersion::format(&idf.version), - idf.repository.worktree().display() + idf.esp_idf_dir.path().display() ); (idf, InstallDir::FromEnv) @@ -173,7 +180,7 @@ pub fn build() -> Result { cargo::print_warning(format_args!( "Ignoring activated esp-idf environment: {ESP_IDF_TOOLS_INSTALL_DIR_VAR} != {}", InstallDir::FromEnv )); - install(EspIdfOrigin::Custom(idf.repository))? + install(EspIdfOrigin::Custom(idf.esp_idf_dir))? }, (Err(FromEnvError::NotActivated { source: err, .. }), true) | (Err(FromEnvError::NoRepo(err)), true) if require_from_env => { @@ -181,12 +188,12 @@ pub fn build() -> Result { format!("activated esp-idf environment not found but required by {ESP_IDF_TOOLS_INSTALL_DIR_VAR} == {install_dir}") )) } - (Err(FromEnvError::NotActivated { esp_idf_repo, .. }), _) => { - install(EspIdfOrigin::Custom(esp_idf_repo))? + (Err(FromEnvError::NotActivated { esp_idf_dir, .. }), _) => { + install(EspIdfOrigin::Custom(esp_idf_dir))? }, (Err(FromEnvError::NoRepo(_)), _) => { - let origin = match &config.native.idf_path { - Some(idf_path) => EspIdfOrigin::Custom(git::Repository::open(idf_path)?), + let origin = match &esp_idf_dir { + Some(idf_path) => EspIdfOrigin::Custom(SourceTree::open(idf_path)), None => EspIdfOrigin::Managed(EspIdfRemote { git_ref: config.native.esp_idf_version(), repo_url: config.native.esp_idf_repository.clone() @@ -253,11 +260,15 @@ pub fn build() -> Result { // Apply patches, only if the patches were not previously applied and if the esp-idf repo is managed. if idf.is_managed_espidf { + let SourceTree::Git(repository) = &idf.esp_idf_dir else { + panic!("tree must always be Git variant if is_managed_espidf is true"); + }; + let patch_set = match idf.version.as_ref().map(|v| (v.major, v.minor, v.patch)) { // master branch _ if { - let default_branch = idf.repository.get_default_branch()?; - let curr_branch = idf.repository.get_branch_name()?; + let default_branch = repository.get_default_branch()?; + let curr_branch = repository.get_branch_name()?; default_branch == curr_branch && default_branch.is_some() } => { @@ -283,8 +294,7 @@ pub fn build() -> Result { } }; if !patch_set.is_empty() { - idf.repository - .apply_once(patch_set.iter().map(|p| manifest_dir.join(p)))?; + repository.apply_once(patch_set.iter().map(|p| manifest_dir.join(p)))?; } } @@ -390,7 +400,7 @@ pub fn build() -> Result { )?; let cmake_toolchain_file = path_buf![ - &idf.repository.worktree(), + &idf.esp_idf_dir.path(), "tools", "cmake", chip.cmake_toolchain_file() @@ -406,7 +416,7 @@ pub fn build() -> Result { cmake::cmake(), "-P", extractor_script.as_ref().as_os_str(); - env=("IDF_PATH", &idf.repository.worktree().as_os_str())) + env=("IDF_PATH", &idf.esp_idf_dir.path().as_os_str())) .stdout()?; let mut vars = cmake::process_script_variables_extractor_output(output)?; @@ -469,7 +479,7 @@ pub fn build() -> Result { .cxxflag(cxx_flags) .env("IDF_COMPONENT_MANAGER", idf_comp_manager) .env("EXTRA_COMPONENT_DIRS", extra_component_dirs) - .env("IDF_PATH", idf.repository.worktree()) + .env("IDF_PATH", idf.esp_idf_dir.path()) .env("PATH", &idf.exported_path) .env("SDKCONFIG_DEFAULTS", defaults_files) .env("IDF_TARGET", &chip_name) @@ -520,7 +530,7 @@ pub fn build() -> Result { .context("Could not determine the compiler from cmake")?; let build_info = espidf::EspIdfBuildInfo { - esp_idf_dir: idf.repository.worktree().to_owned(), + esp_idf_dir: idf.esp_idf_dir.path().to_owned(), exported_path_var: idf.exported_path.try_to_str()?.to_owned(), venv_python: idf.venv_python, build_dir: cmake_build_dir.clone(),