#!/bin/bash # Options... build_options='-g -f elf64' link_options='' clear_obj=1 # Usage... usage='Uso: build ' # Error strings... error[1]='Número incorreto de argumentos!' error[2]='Nome de arquivo inválido!' error[3]='Arquivo-fonte não encontrado!' error[4]='Erro de montagem!' error[5]='Erro de ligação!' # Functions... die() { printf '\n\e[31m%s\e[0m\n%s\n\n' "${error[$1]}" "$usage" >&2 exit $1 } cprint() { printf '\e[32;1m%s\e[0m\n' "$*" } iprint() { printf '\e[2;3m%b\e[0m' "$*" } draw_line() { local line printf -v line '%40s' echo ${line// /-} } # Check for file name... [[ $1 ]] || die 1 # Check for .asm extension... [[ $1 != *.* || $1 == *.asm ]] || die 2 # Main... # Trim .asm extension... name=${1%.asm} if [[ -f $name.asm ]]; then # Remove old executable... rm $name 2> /dev/null draw_line printf '%s\e[35;1m%s\e[0m%s\n' 'Compilando ' $name.asm ':' draw_line # Build object file... iprint '• Montando objeto binário... ' nasm $build_options $name.asm && cprint ok || die 4 # Link executable file... iprint '• Ligando binário executável... ' ld $link_options $name.o -o $name && cprint ok || die 5 # Remove object file... ((clear_obj)) && { iprint '• Removendo arquivo objeto... '; rm $name.o && cprint ok; } echo -n '• ' iprint 'Sucesso!\n' draw_line ls -lh ${name}* | awk '{printf "\033[36;1m%-'$((${#name}+4))'s\033[0m%8s%4s %02d%6s\n", $9, $5, $6, $7, $8 }' draw_line else die 3 fi