83 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| run() {
 | |
|   printf '%s==>%s %s\n' "$(tput setaf 2)" "$(tput sgr0)" "$*"
 | |
|   "$@"
 | |
| 
 | |
|   if (( $? )); then
 | |
|     exit
 | |
|   fi
 | |
| }
 | |
| 
 | |
| compile-all() {
 | |
|   mkdir -p bin
 | |
| 
 | |
|   for src in src/*.cpp; do
 | |
|     bin=bin/${src#src/} bin=${bin%.cpp}.o
 | |
| 
 | |
|     if [[ ! -v CHECK_COMPILE ]] || "$CHECK_COMPILE" "$src" "$bin"; then
 | |
|       run c++ "${CXXFLAGS[@]}" -c -o "$bin" "$src"
 | |
|     fi
 | |
|   done
 | |
| 
 | |
|   run c++ "${LDFLAGS[@]}" -o bin/chimney bin/*.o
 | |
| }
 | |
| 
 | |
| set-default-flags() {
 | |
|   CXXFLAGS=(-std=c++2a -Wall -Wextra -pedantic -O1 -I include)
 | |
|   LDFLAGS=(-O1)
 | |
| }
 | |
| 
 | |
| is-newer() {
 | |
|   [[ $1 -nt "$2" ]]
 | |
| }
 | |
| 
 | |
| cmd-make() {
 | |
|   local {CXX,LD}FLAGS
 | |
|   set-default-flags
 | |
|   CHECK_COMPILE=is-newer compile-all
 | |
| }
 | |
| 
 | |
| cmd-fresh() {
 | |
|   local {CXX,LD}FLAGS
 | |
|   set-default-flags
 | |
|   compile-all
 | |
| }
 | |
| 
 | |
| cmd-clean() {
 | |
|   run rm -rf bin
 | |
| }
 | |
| 
 | |
| declare -A opts
 | |
| 
 | |
| while (( $# )); do
 | |
|   if [[ $1 = -- ]]; then
 | |
|     shift
 | |
|     break
 | |
|   elif [[ $1 = -no-* ]]; then
 | |
|     opts[${1#-no-}]=no
 | |
|   elif [[ $1 = -*=* ]]; then
 | |
|     key=${1#-} key=${key%%=*}
 | |
|     opts[$key]=${1#*=}
 | |
|   elif [[ $1 = -?* ]]; then
 | |
|     opts[${1#-}]=yes
 | |
|   else
 | |
|     break
 | |
|   fi
 | |
| 
 | |
|   shift
 | |
| done
 | |
| 
 | |
| cmd=make
 | |
| 
 | |
| if (( $# )); then
 | |
|   cmd=$1
 | |
|   shift
 | |
| fi
 | |
| 
 | |
| if ! hash cmd-"$cmd" 2>/dev/null; then
 | |
|   printf 'Unknown command %s%s%s\n' "$(tput setaf 1)" "$cmd" "$(tput sgr0)" >&2
 | |
|   exit
 | |
| fi
 | |
| 
 | |
| cmd-"$cmd" "$@"
 |