Instruções para instalar e compilar GHDL na sua casa

# 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.