(args: &[String], cwd: &Path)
| 20 | |
| 21 | pub(crate) fn mem_profile_command(args: &[String], cwd: &Path) -> Result<(), String> { |
| 22 | let release = args.iter().any(|a| a == "--release"); |
| 23 | let csv_name = parse_optional_flag_value(args, "--csv") |
| 24 | .map(|raw| PathBuf::from(raw.unwrap_or_else(|| "memory_profile.csv".to_string()))); |
| 25 | let project_dir = parse_flag_value(args, "--path") |
| 26 | .map(|p| resolve_local_path(&p, cwd)) |
| 27 | .unwrap_or_else(|| cwd.to_path_buf()); |
| 28 | let project_dir = project_dir.canonicalize().unwrap_or(project_dir); |
| 29 | let project_cfg = load_project_toml(&project_dir) |
| 30 | .map_err(|err| format!("failed to load project.toml: {err}"))?; |
| 31 | let profiling_dir = ensure_profiling_output_dir(&project_dir)?; |
| 32 | let csv_path = profiling_dir.join( |
| 33 | csv_name |
| 34 | .as_ref() |
| 35 | .and_then(|name| name.file_name()) |
| 36 | .unwrap_or_else(|| std::ffi::OsStr::new("memory_profile.csv")), |
| 37 | ); |
| 38 | fs::OpenOptions::new() |
| 39 | .create(true) |
| 40 | .append(true) |
| 41 | .open(&csv_path) |
| 42 | .map_err(|err| { |
| 43 | format!( |
| 44 | "failed to initialize memory profile csv {}: {err}", |
| 45 | csv_path.display() |
| 46 | ) |
| 47 | })?; |
| 48 | update_workspace_vscode_linked_projects(&workspace_root(), &project_dir)?; |
| 49 | update_project_vscode_linked_projects(&project_dir)?; |
| 50 | ensure_source_overrides(&project_dir) |
| 51 | .map_err(|err| format!("failed to refresh source overrides: {err}"))?; |
| 52 | |
| 53 | log_step("Building Scripts"); |
| 54 | compile_scripts_with_profile(&project_dir, ScriptsBuildProfile::Debug).map_err(|err| { |
| 55 | format!( |
| 56 | "scripts pipeline failed for {}: {err}", |
| 57 | project_dir.display() |
| 58 | ) |
| 59 | })?; |
| 60 | log_done("Scripts Built"); |
| 61 | |
| 62 | let dev_runner_dir = project_dir.join(".perro").join("dev_runner"); |
| 63 | let target_dir = project_dir.join("target"); |
| 64 | log_step("Building Dev Runner"); |
| 65 | |
| 66 | let mut build_cmd = Command::new("cargo"); |
| 67 | build_cmd.arg("build").env("CARGO_TARGET_DIR", &target_dir); |
| 68 | if release { |
| 69 | build_cmd.arg("--release"); |
| 70 | } |
| 71 | build_cmd.current_dir(&dev_runner_dir); |
| 72 | let mut features = vec!["mem_profile"]; |
| 73 | if project_cfg.steam.enabled { |
| 74 | features.push("steamworks"); |
| 75 | } |
| 76 | build_cmd.arg("--features").arg(features.join(",")); |
| 77 | let build_status = build_cmd.status().map_err(|err| { |
| 78 | format!( |
| 79 | "failed to build project dev runner from {}: {err}", |
no test coverage detected