pbn/script/build
2025-06-08 10:40:02 -03:00

78 lines
1.5 KiB
Bash
Executable file

#!/bin/bash
# Options...
build_options='-g -f elf64'
link_options=''
clear_obj=1
# Usage...
usage='Uso: build <arquivo|arquivo.asm>'
# 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