build-run (3028B)
1 #!/bin/bash 2 3 file="$1" 4 if [ -z "$file" ]; then 5 echo "Usage: build-run <filename.cpp or filename.c>" 6 exit 1 7 fi 8 9 fileBasename=$(basename "$file") 10 fileDirname=$(dirname "$(realpath "$file")") 11 fileBasenameNoExtension="${fileBasename%.*}" 12 fileExtname=".${fileBasename##*.}" 13 14 if [ "$fileExtname" = ".cpp" ]; then c="g++"; else c="gcc"; fi 15 exe="${fileDirname}/${fileBasenameNoExtension}" 16 logDir="$HOME/Documents/bsc/buildLog" 17 mkdir -p "$logDir" 18 ts=$(date +"%Y-%m-%d_%H-%m-%M_%S") 19 logFile="$logDir/buildLog_$ts.txt" 20 B="━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" 21 22 # Automatically delete the generated binary on exit/interrupt 23 trap 'rm -f "$exe"' EXIT 24 25 # Logging helper functions: Output ONLY to log file 26 fnH() { 27 title="$1"; show_l="${3:-true}"; nl="${4:-true}" 28 if [ "$show_l" = "true" ]; then 29 if [ "$nl" = "true" ]; then echo "" >> "$logFile"; fi 30 echo "$B" >> "$logFile" 31 echo " $title" >> "$logFile" 32 echo "$B" >> "$logFile" 33 echo "" >> "$logFile" 34 fi 35 } 36 37 fnR() { 38 pad=$(printf "%-16s" "$1") 39 echo "${pad}$2" >> "$logFile" 40 } 41 42 fnL() { 43 clean=$(echo "$1" | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,3})*)?[mGK]//g") 44 echo "$clean" >> "$logFile" 45 } 46 47 fnT() { 48 if [ $1 -ge 1000 ]; then echo "$(($1 / 1000)) sec ($1 ms)"; else echo "$1 ms"; fi 49 } 50 51 ver=$($c --version | head -n 1) 52 53 # Start logging 54 fnH "BUILD" true true false 55 fnL "Compiling ${fileBasename}..." 56 fnL "$ver" 57 fnL "" 58 59 shift 1 60 61 # Measure build time 62 t0_build=$(date +%s%3N) 63 $c "$file" -o "$exe" "$@" 2>&1 | tee -a >(sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,3})*)?[mGK]//g" >> "$logFile") 64 build_status=${PIPESTATUS[0]} 65 t1_build=$(date +%s%3N) 66 build_time=$((t1_build - t0_build)) 67 68 loc=$(wc -l < "$file" 2>/dev/null || echo "0") 69 70 # Log Build Report (Log file only) 71 fnH "BUILD REPORT" 72 fnR "Source" "$fileBasename" 73 fnR "Lines of Code" "$loc" 74 fnR "Timestamp" "$(date +'%Y-%m-%d %H:%M:%S')" 75 fnR "Compiler" "$c" 76 fnR "Target" "x64" 77 if [ $build_status -eq 0 ]; then 78 fnR "Build" "✓ Success" 79 else 80 fnR "Build" "✗ Failed" 81 fi 82 fnR "Build Time" "$(fnT $build_time)" 83 fnR "Log File" "$logFile" 84 85 if [ $build_status -ne 0 ]; then 86 echo "" 87 echo "------------------------------------------------------------" 88 echo "buildlog saved at file://$logFile" 89 exit $build_status 90 fi 91 92 # Run executable 93 fnH "RUN" 94 t0_run=$(date +%s%3N) 95 96 # Program execution goes directly to terminal & logs to file 97 "$exe" 2>&1 | tee -a >(sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,3})*)?[mGK]//g" >> "$logFile") 98 run_status=${PIPESTATUS[0]} 99 100 t1_run=$(date +%s%3N) 101 run_time=$((t1_run - t0_run)) 102 103 # Log Execution Report (Log file only) 104 fnH "EXECUTION REPORT" 105 fnR "Exit Code" "$run_status" 106 fnR "Runtime" "$(fnT $run_time)" 107 fnR "Executable" "Removed" 108 109 # Print footer in terminal 110 echo "" 111 echo "------------------------------------------------------------" 112 echo "buildlog saved at file://$logFile" 113 114 exit $run_status