22# rbuilder - A minimal alternative to cross-rs/cross
33# Usage: rbuilder [+toolchain] <cargo-subcommand> [options...]
44
5- set -e
6-
75# Constants
86SCRIPT_NAME=" $( basename " $0 " ) "
97readonly SCRIPT_NAME
@@ -60,25 +58,23 @@ log_verbose() {
6058 echo -e " ${BLUE} [VERBOSE]${NC} $* " >&2
6159}
6260
61+ log_verbose_date () {
62+ if [[ " ${RBUILDER_VERBOSE:- 0} " != " 1" ]]; then
63+ return 0
64+ fi
65+ echo -e " ${BLUE} [$( date ' +%Y-%m-%d %H:%M:%S' ) ]${NC} $* " >&2
66+ }
67+
6368# Cleanup function
6469cleanup () {
6570 local exit_code=$?
66-
67- if [[ -n " ${CONTAINER_ID:- } " ]]; then
68- log_verbose " Cleaning up container: ${CONTAINER_ID} "
69- if [[ -n " ${USE_SUDO:- } " ]]; then
70- ${USE_SUDO} ${CONTAINER_ENGINE} rm -f " ${CONTAINER_ID} " & > /dev/null || true
71- else
72- ${CONTAINER_ENGINE} rm -f " ${CONTAINER_ID} " & > /dev/null || true
73- fi
74- fi
75-
71+ bash -c ' pgrep cargo | sudo kill -9 2>/dev/null' 2> /dev/null
72+ bash -c ' sudo pgrep cargo | xargs sudo kill -9 2>/dev/null' 2> /dev/null
7673 # Fix permissions on mounted directories
7774 if [[ -n " ${ARTIFACT_DIR:- } " && -d " ${ARTIFACT_DIR} " ]]; then
7875 log_verbose " Fixing permissions on artifact directory: ${ARTIFACT_DIR} "
7976 sudo chown -R " $( id -u) :$( id -g) " " ${ARTIFACT_DIR} " 2> /dev/null || true
8077 fi
81-
8278 if [[ -n " ${WORKSPACE_DIR:- } " && -d " ${WORKSPACE_DIR} " ]]; then
8379 log_verbose " Fixing permissions on workspace: ${WORKSPACE_DIR} "
8480 sudo chown -R " $( id -u) :$( id -g) " " ${WORKSPACE_DIR} " 2> /dev/null || true
@@ -88,7 +84,7 @@ cleanup() {
8884}
8985
9086# Set up signal handlers
91- trap cleanup EXIT INT TERM
87+ trap cleanup EXIT
9288
9389# Help function
9490show_help () {
@@ -336,11 +332,40 @@ parse_artifact_dir() {
336332 return 1
337333 fi
338334
339- log_verbose " Artifact directory: ${ARTIFACT_DIR} "
335+ log_info " Artifact directory: ${ARTIFACT_DIR} "
340336 fi
341337 return 0
342338}
343339
340+ # Update cargo args with the final target
341+ update_cargo_target_arg () {
342+ local i
343+ local target_updated=0
344+
345+ # Find and update existing --target argument
346+ for (( i= 0 ; i< ${# CARGO_ARGS[@]} ; i++ )) ; do
347+ if [[ " ${CARGO_ARGS[i]} " == " --target" ]]; then
348+ if (( i+ 1 < ${# CARGO_ARGS[@]} )) ; then
349+ CARGO_ARGS[i+1]=" ${RUST_TARGET} "
350+ target_updated=1
351+ break
352+ fi
353+ elif [[ " ${CARGO_ARGS[i]} " =~ ^--target= (.+)$ ]]; then
354+ CARGO_ARGS[i]=" --target=${RUST_TARGET} "
355+ target_updated=1
356+ break
357+ fi
358+ done
359+
360+ # Add --target if not present and not default
361+ if [[ " ${target_updated} " -eq 0 ]]; then
362+ CARGO_ARGS+=(" --target" " ${RUST_TARGET} " )
363+ log_info " Added --target=${RUST_TARGET} to cargo args"
364+ else
365+ log_info " Updated --target=${RUST_TARGET} in cargo args"
366+ fi
367+ }
368+
344369# Generate container setup script
345370# This function creates a script that will run inside the container
346371# All variables must be properly escaped to avoid host environment pollution
@@ -518,8 +543,12 @@ else
518543 rustup target add "\$ {RUST_TARGET}" || { echo "ERROR: Failed to add target \$ {RUST_TARGET}" >&2; exit 1; }
519544fi
520545
546+ # Re:Set RUST_TARGET
521547readonly CONTAINER_RUSTFLAGS=${escaped_rustflags}
522548echo "Final Rust target: \$ {RUST_TARGET}"
549+ if [[ "\$ {RUST_TARGET}" == *"riscv64"* ]]; then
550+ echo "FINAL_RUST_TARGET=\$ {RUST_TARGET}" > "/tmp/rust_target_export"
551+ fi
523552
524553# Handle RUSTFLAGS setup
525554if [[ "\$ {CONTAINER_RBUILD_STATIC}" == "1" ]]; then
@@ -679,6 +708,8 @@ detect_resources() {
679708
680709# Run container
681710run_container () {
711+ local container_name
712+ container_name=" rbuilder-$( date +%s) -$$ "
682713 local setup_script
683714 setup_script=" $( generate_setup_script) "
684715
@@ -707,6 +738,7 @@ run_container() {
707738
708739 container_cmd+=(
709740 " ${CONTAINER_ENGINE} " " run"
741+ " --name=${container_name} "
710742 " --rm"
711743 " --platform=${CONTAINER_PLATFORM} "
712744 " --workdir=${DEFAULT_WORKSPACE} "
@@ -737,6 +769,47 @@ run_container() {
737769
738770 log_verbose " Container command: ${container_cmd[*]} "
739771
772+ # Create a temporary container to extract the final target for riscv64
773+ if [[ " ${RUST_TARGET} " == * " riscv64" * ]]; then
774+ log_verbose " Detecting final RISC-V target..."
775+
776+ local temp_cmd=()
777+ if [[ -n " ${USE_SUDO} " ]]; then
778+ temp_cmd+=(" ${USE_SUDO} " )
779+ fi
780+
781+ temp_cmd+=(
782+ " ${CONTAINER_ENGINE} " " run" " --rm"
783+ " --platform=${CONTAINER_PLATFORM} "
784+ " --workdir=${DEFAULT_WORKSPACE} "
785+ " ${MOUNT_ARGS[@]} "
786+ " ${CONTAINER_IMAGE} "
787+ " bash" " -c" " set -e; ${setup_script} && cat '/tmp/rust_target_export' 2>/dev/null || true"
788+ )
789+
790+ local temp_output
791+ if temp_output=$( " ${temp_cmd[@]} " 2> /dev/null) ; then
792+ if [[ " ${temp_output} " =~ FINAL_RUST_TARGET= (.+) ]]; then
793+ local final_target=" ${BASH_REMATCH[1]} "
794+ if [[ " ${final_target} " != " ${RUST_TARGET} " ]]; then
795+ RUST_TARGET=" ${final_target} "
796+ log_info " Updated RUST_TARGET to: ${RUST_TARGET} "
797+ update_cargo_target_arg
798+
799+ # Rebuild the final command with updated target
800+ final_cmd=" set -e; ${setup_script} "
801+ final_cmd+=" && exec cargo"
802+ for arg in " ${CARGO_ARGS[@]} " ; do
803+ final_cmd+=" $( printf ' %q' " ${arg} " ) "
804+ done
805+ container_cmd[${# container_cmd[@]} -1]=" ${final_cmd} "
806+ fi
807+ fi
808+ fi
809+ fi
810+
811+ log_info " Cargo Args (Final): ${CARGO_ARGS[*]} "
812+
740813 # Execute the container
741814 if ! " ${container_cmd[@]} " ; then
742815 log_error " Container execution failed"
@@ -782,7 +855,7 @@ parse_args() {
782855 return 1
783856 fi
784857
785- log_verbose " Cargo args: ${CARGO_ARGS[*]} "
858+ log_info " Cargo args: ${CARGO_ARGS[*]} "
786859 return 0
787860}
788861
@@ -822,6 +895,11 @@ main() {
822895 if ! parse_artifact_dir; then
823896 exit 1
824897 fi
898+
899+ # Add Update Target
900+ if ! update_cargo_target_arg; then
901+ exit 1
902+ fi
825903
826904 # Pull container image
827905 if ! pull_image; then
0 commit comments