Autor: Alberto
Data: 12/06/02
Version: 1.0
Normalmente, no mundo do Software Livre existem compiladores para quase todos as linguagens que queiramos. Em meu caso para todos as linguagens que preciso, exceto para Fortran 90.
O Fortran em general é uma linguagem de uso muito limitado, somente é util para calculo cientifico, mas para isto é uma linguagem excelente: é singelo de usar, muuuy rapido (em minha experiência ao menos como C), e tem muchisimas librerias para calculo numerico, etc...
Para alguns de nós é uma necessidade ter um compilador de Fotran em nossa maquina. No mundo do Software livre temos g77 como compilador de Fortran 77, e para ser sinceros, em meu opinion é bastante mau. Há um projeto chamado g95 para fazer um compilador livre de fortran 90-95, mas mesmo esta em desenvolvimento. Que eu saiba não há ningun compilador de Fortran 90 livre (ainda que me agradaria muchisimo estar equivocado, asi que se alguém sabe de algum decidmelo).
Sem ser nem muito menos livre, temos o compilador gratuito (algo é algo) de Intel para Linux. O objeto deste documento é mostrar como podeis fazer funcionar este compilador com vosso FreeBSD e a emulacion Linux.
Quanto ao compilador em se, tenho certa experiência com o, e posso dizer que é uma maravilha. Tem optimizaciones para todos os pentium, (suporte para SSE, SSE2, etc...), e vos funcionasse em qualquer maquina (com Athlon XP/MP, podeis usar quase todas as optimizaciones, com os anteriores micros de AMD não podreis usar SSE).
Bueno, vamos já ao grão...
Há certas ferramentas que precisaremos para instalar o compilador, e que estan nos ports: rpm2cpio e a emulacion para Linux.
Se poneis rpm2cpio e não encontra o comando, instalai-o dos ports (por exemplo com portinstall rpm2cpio, ou cd /usr/ports/archivers/rpm2cpio && make install). Para assegurar-vos que teneis a emulacion para linux correndo, executai linux como root. Tambien assegurai-vos que existe o diretório /usr/compat/linux/opt/
Quanto à emulacion para linux necesitais o port linux_base-7 (não vos valdra linux_base-6), e o linux_devtools-7. podeis instalá-los como mas vos goste.
Uma vez instalados esses ports, precisámos fazer uma mudança, e é fazer um link simbolico, para que logo não nos de problemas ao executar os proramas que compilámos:
root@pc # ln -s /usr/compat/linux/lib/ld-2.2.2.so /usr/compat/linux/usr/lib/libc.so.1.
E com isto já temos todo preparado para instalar o compilador. Isto ultimo é um pouco chapuza, asi que se admitem outros arreglos.
O primeiro passo que precisardes seguir é conseguir o compilador de Intel. Se não quereis apokinar tendreis que vos baixar a version não comercial e sem suporte do compilador. Debeis rechear um formulário, e é necessário que o e-mail seja correto, já que alli vos mandassem o fichero com a licença imprescindível para que corra bem o compilador.
Seguindo as instruções da web não deberia custar-vos muito ter um .tar.bz2 de uns 50M com o compilador em nosso disco duro.
Agora vos ides a um diretório temporal e descomprimis o .tar.bz2 (OLHO! normalmente FreeBSD tem a particion /tmp pequena ou no mesmo lugar que a / pode ser que não vos caiba todo alli. Se é asi elegei um diretório temporal em outra particion ej: /usr/fortran):
root@pc # mkdir /tmp/fortran root@pc # cd /tmp/fortran root@pc # bunzip2 -c <path ao fichero>/intel-fortran-6.0.tar.bz2 | tar -xvf -
Despues disto deberias dos seguintes ficheros em tmp //fortran :
root@pc # ls /tmp/fortran flicense intel-eldb6-6.0-191.ia64.rpm lgpltext install intel-ifc6-6.0-140.i386.rpm intel-efc6-6.0-140.ia64.rpm intel-ildb6-6.0-191.i386.rpm root@pc #
Destes ficheros a nós só nos interessam os que acabam em i 386.rpm, a não ser que tengais um Itanium por ahi ;). Agora temos que descomprimir os 2 .rpm que precisámos. Eu instalei o compilador em usr //compat/linux/opt/intel. Para isso fazemos:
root@pc # cd /usr/compat/linux/ root@pc # rpm2cpio /tmp/fortran/intel-ifc6-6.0-140.i386.rpm | cpio -i root@pc # rpm2cpio /tmp/fortran/intel-ildb6-6.0-191.i386.rpm | cpio -i
Com estes comandos deberiamos de ter mas ou menos o seguinte arbol de diretórios:
root@pc # ls /usr/compat/linux/opt/intel compiler60 licenses root@pc # ls /usr/compat/linux/opt/intel/compiler60 docs ia32 man root@pc # ls /usr/compat/linux/opt/intel/compiler60/ia32 bin include lib root@pc #
Mas ou menos esta claro. Em usr //compat/linux/opt/intel/compiler60/ia32 temos os binários do compilador, as librerias, etc... e tambien temos os doc, a man page, que podeis copiar a usr //man/man1, etc...
Agora falta cofigurar o compilador.
Bueno, já temos instalado o compilador, mas não vai funcionar-nos sem que lhe façamos uns quantos mudanças. Para começar devemos de saber que o compilador se chama ifc, e em teoria executando /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifc deberia de compilar, mas não é asi porque esse fichero é um script que põe umas quantas variáveis de meio e executa ifcbin que é o verdadeiro compilador.
Desta forma a este fichero devemos editá-lo e mudar em todos os lugares onde ponha <INSTALLDIR> por usr //compat/linux/opt/intel, devemos de apagar a opcion -a "loquesea" ao exec nas ultimas lineas e devemos de tirar-lhe a opcion -n ao export de forma que fique algo como isto (simplesmente copiai este em seu lugar):
#!/bin/sh INTEL_LICENSE_FILE=/usr/compat/linux/opt/intel/licenses; export INTEL_LICENSE_FILE; if %[ -z LD_LIBRARY_PATH ] then LD_LIBRARY_PATH=/usr/compat/linux/opt/intel/compiler60/ia32/lib; else LD_LIBRARY_PATH=/usr/compat/linux/opt/intel/compiler60/ia32/lib:$LD_LIBRARY_PATH fi export LD_LIBRARY_PATH; if %[ -z PATH ] then PATH=/usr/compat/linux/opt/intel/compiler60/ia32/bin; else PATH=/usr/compat/linux/opt/intel/compiler60/ia32/bin:$PATH; fi export PATH; export IA32ROOT; unset IA32ROOT; if %[ $# != 0 ] then exec /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifcbin "$@"; else exec /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifcbin; fi
agora fazemos um link simbolico:
root@pc # ln -s /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifc /usr/local/bin/ifc
Agora quase estamos, só precisámos pôr o fichero de licença que nos mandaram de Intel no diretório /usr/compat/linux/opt/intel/licenses/
root@pc # cp <fichero de licença> /usr/compat/llinux/opt/intel/licenses
Se seguimos bem os passos até aqui, já deberiamos de ser capazes de compilar qualquer programa fortran. Para isso pegamos um programa fortran 90 ou 77 qualquer e executámos:
root@pc # ifc -w90 -c -ou prova.ou <programa.f(90)>
Se todo vai bem deberia de compilá-lo e gerar um fichero prova.ou. Se isto falla repassai bem os passos anteriores, ou mandai-me um mail perguntando.
Se algun impaciente, despues da seccion anterior tentou linkar o programa para produzir um ejecutable, invés de um objeto, se habra dado conta de que lhe saíram 10000 erros ao linkar.
Isto se deve que devemos usar o linkador de linux, e não o de FreeBSD para linkar o programa (Não crio que leia isto nunca, mas graças a Rahul Siddharthan por sua ajuda, sem o jamas habria descoberto isto só). Ademas devemos passar-lhe como parametros as librerias de Fortran 90 que vêm com o compilador de Intel . Para isto fiz um script que o faz todo (baseado num que me envio Rahul Siddharthan, mas que a meu não me funcionava):
#!/bin/sh # # Script que linka fortran 90 usando Linux ld. /compat/linux/usr/bin/ld \ -L/compat/linux/opt/intel/compiler60/ia32//lib/ -lCEPCF90 -lF90 \ -rpath /compat/linux/opt/intel/compiler60//ia32/lib/ \ -lIEPCF90 -lPEPCF90 -lPOSF90 -lcprts -lcxaa -limf -lintrins -lirc \ -e main "$@" # Agora há que procurar o fichero de saída. OPT="-ou" while %[ "$1" != "$OPT" ] do shift done brandelf -t Linux $2.
Ponde este script em usr //local/bin com o nome que querais (eu elegi ifcld). Agora podeis linkar o anterior .ou
root@pc # ifcld prova.ou -ou prova.out root@pc # ./prova.out
E deberia de executar-vos o programa sem problemas. Com isto já teneis o compilador pronto para usá-lo quando querais.
Pelo que a meu respecta, tenho um compilador muito bom em meu FreeBSD da linguagem que por minha profesion mas uso. As comparativas de velocidade são assombrosas, ainda que muito dependentes do codigo, mas em algumas ocasiões (programas que ocupem muita memória 100M ou mas), chega a dividir por 2 ou mas o tempo que demora o f77 que vem com FreeBSD. Ademas tem suporte perfeito para Fortran 90. Comparado com outros compiladores bons, é practicamente igual de rapido que o compilador de Digital (que em meu opinion faz os melhores compiladores de Fortran 90).
FreeBSD é um pouco mas lento executando o codigo que Linux com este compilador, quizas devido à emulacion, mas realmente muito pouco (menos de um 3-5%), com o que não é nada sério.
Penso que o fato de que este compilador funcione em FreeBSD com a emulacion Linux, é importante à hora de pensar um sistema operativo para uma estacion de trabalho ou inclusive um Beowulf. Nestes sistemas um compilador de Fortran 90 é quase imprescindível.
Pois nada mas, despeço-me, dizendo que se a alguém se lhe ocorre alguma forma melhor de fazer algo, ou algun erro, que mo comente, e o incluire em futuras versões deste documento.
Tambien me gustaria saber se estes passos, mas ou menos, podem-se aplicar a outro BSD. Em princípio, se tambien tem emulacion para Linux, e um port com as glibc-2.2 não deberia de ser muito complicado. Se alguém sabe um pouco de isto, que mo diga, para poder incluí-lo no documento.
Em realidade isto esta longe de ser estandar, asi que provavelmente muitos script se possam melhorar, ou inclusive fazer que as coisas fncionen mas facilmente. Se necesitais ajuda para algo, não dudeis em escrever-me
Tambien tenho que pedir perdon pelas faltas de ortografia, etc... Se que não pus nem um acento, deixo-o para as futuras versões.