diff --git a/script/build b/script/build new file mode 100755 index 0000000..7de161c --- /dev/null +++ b/script/build @@ -0,0 +1,78 @@ +#!/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 +