# Instalação/compilação do GHDL em UBUNTU e MINT (e talvez Debian)
# ATENÇÃO: há diferenças entre as versões; leia as instruções um ou dois
# passos adiante ANTES de efetuar os comandos.
#
# os comentários estão marcadas por "#" (podem ser de mais de uma linha)
#
# ATENÇÃO: os comandos estão "diretos" no texto para que possam
# ser copiados com o mouse:
# i) três clicks com o botão esquerdo copia a linha inteira (fica em vídeo reverso)
# ii) um click com o botão do meio cola no propmt (na tela do terminal)
# eu uso aptitude, use o que você costuma usar: apt-get ou outro
#
# (0) pode facilitar a instalação se você iniciar por
apt-get install aptitude
# (0.5) refresque a base de dados
aptitude update
# (1) instale as ferramentas para compilação; se já estão instalados, continue
# se o aptitude pedir bibliotecas e programas adicionais, aceite e instale
aptitude install wget make flex bison unzip gzip tar sed grep gawk findutils
# (2) instale os compiladores; se já estão instalados, continue
aptitude install libz-dev gnat gcc g++ gtkwave
# (3) SE o seu sistema é UBUNTU então diga (veja (3.2) se é MINT)
aptitude install clang-6.0 llvm-8
# (3.1) SE o aptitude reclamar que existem outras versões mais jovens
# (números maiores) troque-as. No comando abaixo x e y são as
# versões indesejadas, tipicamente a versão 10 no llvm e
# 8 ou 10 no clang. Remova estas versões e instale as
# indicadas
aptitude purge clang-x.0 llvm-y
aptitude install clang-6.0 llvm-8
# (3.2) SE o seu sistema é MINT então instale o clang-8.0 (oito) ao invés
# do clang-6.0.
aptitude install clang-8.0 llvm-8
# (4) veja qual a versão de gcc foi instalada: diga
gcc --version
# (5) e lembre do primeiro número de versão (mais à esquerda).
# No meu caso é a versão 7, então diga
aptitude install libgcc-7-dev
# (6) crie o diretório para instalação
sudo mkdir /opt/ghdl
# (7) mude a posse do novo diretório para o seu usuário mortal,
# porque não é uma boa ideia fazer a compilação como root
sudo chown $USER.$GROUP /opt/ghdl
# (8) vá para o diretório de compilação
cd /opt/ghdl
# (9) baixe o código fonte. DEVE ser a versão v0.37
wget https://github.com/ghdl/ghdl/archive/v0.37.tar.gz
# (10) descompacte com tar e vá para o diretório do ghdl
tar xzvf ./v0.37.tar.gz
cd ghdl-0.37
# (11) crie o diretório para a compilação
mkdir build
cd build
# (12) configure em preparaçãp para compilar (o comando está em 2 linhas)
../configure --with-llvm-config=/usr/bin/llvm-config \
--prefix=/usr/local --disable-synth
# (12.5) SE o configure reclamar do llvm-config, diga, ao invés
../configure --with-llvm-config=/usr/lib/llvm-8/bin/llvm-config \
--prefix=/usr/local --disable-synth
# (13) SE o configure executar, prossiga;
# (13.1) e então é só dizer
make
# (13.2) SE o make reclamar que não encontra clang, porque
# o pacote do clang está (aparentente) quebrado; o conserto
# envolve a criação de dois links:
sudo ln -s /usr/bin/clang++-6.0 /usr/bin/clang++
sudo ln -s /usr/bin/clang-6.0 /usr/bin/clang
# (13.3) se o make quebrar e aparecer a seguinte msgm de erro
# ../src/ortho/llvm4-nodebug/llvm-cbindings.cpp:18:10: fatal error: 'llvm-c/Target.h' file not found
# #include "llvm-c/Target.h"
#
# então é necessário des-instalar o llvm (expurgue a versão que você instalou)
aptitude purge llvm-8
# e instalar a versão de desenvolvimento
aptitude install llvm-dev
# e voltar para o passo (12). Esse caso foi num "Linux Mint 19.3 Tricia"
# (13.9) SE ALGO DER ERRADO, mande as mensagens de erro para o professor
# (14) a compilação demora muitos segundos,
# podem aparecer alguns warnings,
# e depois de aparecer MUITA saída na tela, termina com algo como
#
# ----------------------------------------------------------------------
x86_64-linux-gnu-gnatlink-7 /opt/ghdl/ghdl-master/build/pic/libghdl.ali -shared-libgcc -o libghdl-1_0_dev.so -g -fPIC -g -shared -Wl,-soname,libghdl-1_0_dev.so pic/grt-cstdio.o
sed -e '1,/-- BEGIN/d' -e '/-- END/,$d' -e 's/^ -- //' < b~libghdl.adb > libghdl.bind
rm -f -f libghdl.a
ar rc libghdl.a b~libghdl.o pic/grt-cstdio.o `sed -e /^-/d < libghdl.bind`
grep adalib libghdl.bind | sed -e 's/^-L//' -e 's@adalib/@adalib/libgnat.a@' > libghdl.link
# ------------------------------------------------------------------------
# o que sinaliza o fim da compilação
# (15) e então instale
sudo make install
# (16) aparece mais um monte de saída, que termina com
# -----------------------------------------------------------------------
install -m 644 -p libghdl.link /usr/local/lib/
install -m 644 -p ../src/synth/ghdlsynth.h /usr/local/include/
install -m 644 -p ../src/synth/ghdlsynth_gates.h /usr/local/include/
/usr/local/bin/ghdl --disp-standard --std=87 > /usr/local/lib/ghdl/src/std/v87/standard.vhdl
/usr/local/bin/ghdl --disp-standard --std=93 > /usr/local/lib/ghdl/src/std/v93/standard.vhdl
/usr/local/bin/ghdl --disp-standard --std=08 > /usr/local/lib/ghdl/src/std/v08/standard.vhdl
# -----------------------------------------------------------------------
# (17) para testar o compilador GHDL diga
ghdl --version
# (18) deve aparecer na tela algo como (as versões podem ser diferentes)
# ----------------------------------------------------------------------------
GHDL 0.37-dev (tarball) [Dunoon edition]
Compiled with GNAT Version: 7.5.0
llvm code generator
Written by Tristan Gingold.
Copyright (C) 2003 - 2021 Tristan Gingold.
GHDL is free software, covered by the GNU General Public License. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# ----------------------------------------------------------------------------
# o que completa a instalação
# (19) para fazer uma limpeza, diga
make clean
# (20) se você quiser liberar bastante espaço, diga
rm -rf /opt/ghdl/ghdl-0.37
# (21) se você não quiser mais usar o aptitude, diga
apt-get purge aptitude
# (22) agora vem o teste de fogo: compile e execute o programa de testes
# o programa de testes soma alguns números de 32 bits e mostra os
# operandos e o resultado. O arquivo com o código fonte é tb_teste.vhd.
# Para compilar e executar diga
wget http://www.inf.ufpr.br/roberto/ci210/tb_teste.vhd
ghdl -a tb_teste.vhd && ghdl --elab-run tb_teste
# (23) o executável chama-se tb_teste e pode ser executado diretamente
./tb_teste
# a saída correta é
ghdl --elab-run tb_teste
tb_teste.vhd:201:7:@0ms:(assertion note):
A=00000000 B=00000000 s=00000000
tb_teste.vhd:201:7:@2ns:(assertion note):
A=00000000 B=00000000 s=00000000
tb_teste.vhd:201:7:@4ns:(assertion note):
A=00000001 B=00000001 s=00000002
tb_teste.vhd:201:7:@6ns:(assertion note):
A=00000fff B=00000001 s=00001000
tb_teste.vhd:201:7:@8ns:(assertion note):
A=00001111 B=00001111 s=00002222
tb_teste.vhd:201:7:@10ns:(assertion note):
A=00002222 B=00002222 s=00004444
tb_teste.vhd:201:7:@12ns:(assertion note):
A=00004444 B=00004444 s=00008888
tb_teste.vhd:201:7:@14ns:(assertion note):
A=00000000 B=00000000 s=00000000
tb_teste.vhd:201:7:@16ns:(assertion note):
A=00000000 B=00000000 s=00000000
# (24) para ver a saída "limpa" diga
./tb_teste | egrep -v assertion
A=00000000 B=00000000 s=00000000
A=00000000 B=00000000 s=00000000
A=00000001 B=00000001 s=00000002
A=00000fff B=00000001 s=00001000
A=00001111 B=00001111 s=00002222
A=00002222 B=00002222 s=00004444
A=00004444 B=00004444 s=00008888
A=00000000 B=00000000 s=00000000
A=00000000 B=00000000 s=00000000
Agradeço a Eduardo Gobbo, Eduardo Todt,
Gustavo do Prado Silva, Luís Risch, Pedro Churata
e Rubens Z Laszlo pela ajuda com as
tentativas e correção das instruções.