From 70df806a875d56a4fea224b40d34d22dcb135660 Mon Sep 17 00:00:00 2001 From: ju6ge Date: Thu, 25 Sep 2025 22:30:41 +0200 Subject: [PATCH] setup cargo run to use containerized build tools that are not rust tools --- Software/MainBoard/rust/.cargo/config.toml | 1 + bin/esp-plant-dev-tools.Containerfile | 4 +- bin/npm | 29 +++++ bin/npx | 29 +++++ rust/build.rs | 124 +++++++++++++++++++++ 5 files changed, 186 insertions(+), 1 deletion(-) create mode 100755 bin/npm create mode 100755 bin/npx create mode 100644 rust/build.rs diff --git a/Software/MainBoard/rust/.cargo/config.toml b/Software/MainBoard/rust/.cargo/config.toml index 2ef7d6e..bd71262 100644 --- a/Software/MainBoard/rust/.cargo/config.toml +++ b/Software/MainBoard/rust/.cargo/config.toml @@ -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 } diff --git a/bin/esp-plant-dev-tools.Containerfile b/bin/esp-plant-dev-tools.Containerfile index 4aaa8ce..53a0507 100644 --- a/bin/esp-plant-dev-tools.Containerfile +++ b/bin/esp-plant-dev-tools.Containerfile @@ -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 diff --git a/bin/npm b/bin/npm new file mode 100755 index 0000000..1b136c8 --- /dev/null +++ b/bin/npm @@ -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 $(&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" "$@" diff --git a/bin/npx b/bin/npx new file mode 100755 index 0000000..70b2ded --- /dev/null +++ b/bin/npx @@ -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 $(&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" "$@" diff --git a/rust/build.rs b/rust/build.rs new file mode 100644 index 0000000..735bf51 --- /dev/null +++ b/rust/build.rs @@ -0,0 +1,124 @@ +use std::{collections::VecDeque, env, process::Command}; + +use vergen::EmitBuilder; + +fn linker_be_nice() { + let args: Vec = 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(); + } + } +}