setup cargo run to use containerized build tools that are not rust tools
This commit is contained in:
		| @@ -23,6 +23,7 @@ target = "riscv32imac-unknown-none-elf" | ||||
| CHRONO_TZ_TIMEZONE_FILTER = "UTC|America/New_York|America/Chicago|America/Los_Angeles|Europe/London|Europe/Berlin|Europe/Paris|Asia/Tokyo|Asia/Shanghai|Asia/Kolkata|Australia/Sydney|America/Sao_Paulo|Africa/Johannesburg|Asia/Dubai|Pacific/Auckland" | ||||
| CARGO_WORKSPACE_DIR = { value = "", relative = true } | ||||
| ESP_LOG = "info" | ||||
| PATH = { value = "../bin:/usr/bin:/usr/local/bin", force = true, relative = true } | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| FROM debian:latest | ||||
|  | ||||
| RUN apt update -y && apt upgrade -y && apt install unzip curl xz-utils nodejs npm -y | ||||
| RUN apt update -y && apt upgrade -y && apt install unzip curl xz-utils nodejs -y | ||||
|  | ||||
| RUN cd /root && \ | ||||
|     curl -L -o xpack-riscv-toolchain.tar.gz "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-3/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64.tar.gz" && \ | ||||
| @@ -12,3 +12,5 @@ RUN cd /root && \ | ||||
|     mv xpack-toolchain/libexec /usr/local && \ | ||||
|     mv xpack-toolchain/riscv-none-elf /usr/local && \ | ||||
|     rm -rf xpack-toolchain xpack-riscv-toolchain.tar.gz | ||||
|  | ||||
| RUN apt install npm -y | ||||
|   | ||||
							
								
								
									
										29
									
								
								bin/npm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								bin/npm
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -euo pipefail | ||||
|  | ||||
| CONTAINER_IMAGE="localhost/esp-plant-dev-tools:latest" | ||||
| CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")" | ||||
| PLANTCTL_PROJECT_DIR="$(readlink -f "$CONTAINER_TOOLS_BASEDIR/..")" | ||||
|  | ||||
| function _fatal { | ||||
| 	echo -e "\e[31mERROR\e[0m   $(</dev/stdin)$*" 1>&2 | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| declare -a PODMAN_ARGS=( | ||||
| 	"--rm" "-i" "--log-driver=none" | ||||
| 	"-v" "$PLANTCTL_PROJECT_DIR:$PLANTCTL_PROJECT_DIR:rw" | ||||
| 	"-v" "$PWD:$PWD:rw" | ||||
| 	"-w" "$PWD" | ||||
| ) | ||||
|  | ||||
| [[ -t 1 ]] && PODMAN_ARGS+=("-t") | ||||
|  | ||||
| if ! podman image exists "$CONTAINER_IMAGE"; then | ||||
|     #attempt to build container | ||||
|     "$CONTAINER_TOOLS_BASEDIR/build-esp-plant-dev-tools.sh" 1>&2 || | ||||
|         _fatal "faild to build local image, cannot continue! … please ensure you have an internet connection" | ||||
| fi | ||||
|  | ||||
| podman run "${PODMAN_ARGS[@]}" --entrypoint npm "$CONTAINER_IMAGE" "$@" | ||||
							
								
								
									
										29
									
								
								bin/npx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								bin/npx
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -euo pipefail | ||||
|  | ||||
| CONTAINER_IMAGE="localhost/esp-plant-dev-tools:latest" | ||||
| CONTAINER_TOOLS_BASEDIR="$(dirname "$(readlink -f "$0")")" | ||||
| PLANTCTL_PROJECT_DIR="$(readlink -f "$CONTAINER_TOOLS_BASEDIR/..")" | ||||
|  | ||||
| function _fatal { | ||||
| 	echo -e "\e[31mERROR\e[0m   $(</dev/stdin)$*" 1>&2 | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| declare -a PODMAN_ARGS=( | ||||
| 	"--rm" "-i" "--log-driver=none" | ||||
| 	"-v" "$PLANTCTL_PROJECT_DIR:$PLANTCTL_PROJECT_DIR:rw" | ||||
| 	"-v" "$PWD:$PWD:rw" | ||||
| 	"-w" "$PWD" | ||||
| ) | ||||
|  | ||||
| [[ -t 1 ]] && PODMAN_ARGS+=("-t") | ||||
|  | ||||
| if ! podman image exists "$CONTAINER_IMAGE"; then | ||||
|     #attempt to build container | ||||
|     "$CONTAINER_TOOLS_BASEDIR/build-esp-plant-dev-tools.sh" 1>&2 || | ||||
|         _fatal "faild to build local image, cannot continue! … please ensure you have an internet connection" | ||||
| fi | ||||
|  | ||||
| podman run "${PODMAN_ARGS[@]}" --entrypoint npx "$CONTAINER_IMAGE" "$@" | ||||
							
								
								
									
										124
									
								
								rust/build.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								rust/build.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| use std::{collections::VecDeque, env, process::Command}; | ||||
|  | ||||
| use vergen::EmitBuilder; | ||||
|  | ||||
| fn linker_be_nice() { | ||||
|     let args: Vec<String> = std::env::args().collect(); | ||||
|     if args.len() > 1 { | ||||
|         let kind = &args[1]; | ||||
|         let what = &args[2]; | ||||
|  | ||||
|         match kind.as_str() { | ||||
|             "undefined-symbol" => match what.as_str() { | ||||
|                 "_defmt_timestamp" => { | ||||
|                     eprintln!(); | ||||
|                     eprintln!("💡 `defmt` not found - make sure `defmt.x` is added as a linker script and you have included `use defmt_rtt as _;`"); | ||||
|                     eprintln!(); | ||||
|                 } | ||||
|                 "_stack_start" => { | ||||
|                     eprintln!(); | ||||
|                     eprintln!("💡 Is the linker script `linkall.x` missing?"); | ||||
|                     eprintln!(); | ||||
|                 } | ||||
|                 "esp_wifi_preempt_enable" | ||||
|                 | "esp_wifi_preempt_yield_task" | ||||
|                 | "esp_wifi_preempt_task_create" => { | ||||
|                     eprintln!(); | ||||
|                     eprintln!("💡 `esp-wifi` has no scheduler enabled. Make sure you have the `builtin-scheduler` feature enabled, or that you provide an external scheduler."); | ||||
|                     eprintln!(); | ||||
|                 } | ||||
|                 "embedded_test_linker_file_not_added_to_rustflags" => { | ||||
|                     eprintln!(); | ||||
|                     eprintln!("💡 `embedded-test` not found - make sure `embedded-test.x` is added as a linker script for tests"); | ||||
|                     eprintln!(); | ||||
|                 } | ||||
|                 _ => (), | ||||
|             }, | ||||
|             // we don't have anything helpful for "missing-lib" yet | ||||
|             _ => { | ||||
|                 std::process::exit(1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         std::process::exit(0); | ||||
|     } | ||||
|  | ||||
|     println!( | ||||
|         "cargo:rustc-link-arg=--error-handling-script={}", | ||||
|         std::env::current_exe().unwrap().display() | ||||
|     ); | ||||
| } | ||||
|  | ||||
| fn main() { | ||||
|     if Command::new("podman").arg("--version").output().is_err() { | ||||
|         println!("Could not find `podman` installation, assuming the developer has setup all required tool for build manually! … ") | ||||
|     } | ||||
|     webpack(); | ||||
|     linker_be_nice(); | ||||
|     let _ = EmitBuilder::builder().all_git().all_build().emit(); | ||||
| } | ||||
|  | ||||
| fn webpack() { | ||||
|     //println!("cargo:rerun-if-changed=./src/src_webpack"); | ||||
|     Command::new("rm") | ||||
|         .arg("./src/webserver/bundle.js.gz") | ||||
|         .output() | ||||
|         .unwrap(); | ||||
|  | ||||
|     match Command::new("cmd").spawn() { | ||||
|         Ok(_) => { | ||||
|             println!("Assuming build on windows"); | ||||
|             let output = Command::new("cmd") | ||||
|                 .arg("/K") | ||||
|                 .arg("npx") | ||||
|                 .arg("webpack") | ||||
|                 .current_dir("./src_webpack") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|             println!("status: {}", output.status); | ||||
|             println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||||
|             println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||||
|             assert!(output.status.success()); | ||||
|  | ||||
|             // move webpack results to rust webserver src | ||||
|             let _ = Command::new("cmd") | ||||
|                 .arg("/K") | ||||
|                 .arg("move") | ||||
|                 .arg("./src_webpack/bundle.js.gz") | ||||
|                 .arg("./src/webserver") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|             let _ = Command::new("cmd") | ||||
|                 .arg("/K") | ||||
|                 .arg("move") | ||||
|                 .arg("./src_webpack/index.html.gz") | ||||
|                 .arg("./src/webserver") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|         } | ||||
|         Err(_) => { | ||||
|             println!("Assuming build on linux"); | ||||
|             let output = Command::new("npx") | ||||
|                 .arg("webpack") | ||||
|                 .current_dir("./src_webpack") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|             println!("status: {}", output.status); | ||||
|             println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||||
|             println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||||
|             assert!(output.status.success()); | ||||
|  | ||||
|             // move webpack results to rust webserver src | ||||
|             let _ = Command::new("mv") | ||||
|                 .arg("./src_webpack/bundle.js.gz") | ||||
|                 .arg("./src/webserver") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|             let _ = Command::new("mv") | ||||
|                 .arg("./src_webpack/index.html.gz") | ||||
|                 .arg("./src/webserver") | ||||
|                 .output() | ||||
|                 .unwrap(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user