dotfiles

git clone https://github.com/notamitgamer/dotfiles.git
· rebuilt hourlyOpen on GitHub
root / bin / build-run

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