Hasta hace poco utilizaba el compilador fpc (Free Pascal Compiler) para compilar código de pascal pero ahora tengo que escribir según la norma ISO 10206 que no es ni más ni menos que el pascal estándar extendido. Con fpc no se puede compilar pascal estándar por lo que hay que usar otro compilador. Uno de los más usados en linux es gpc (GNU Pascal Compiler) que se apoya en gcc para compilar en pascal.

El compilador gpc se encuentra en los repositorios de Ubuntu, si no se encuentra en los repositorios o tenemos una distribución diferente tenemos que ir a la página de descargas de gnu pascal compiler y descargar los paquetes con gpc ya compilado (o sin compilar para hacerlo nosotros mismos).

A la hora de descargar nos encontramos dos archivos diferentes, uno que viene con una versión de gcc y otro sin gcc. La razón de poder descargar uno u otro está en que necesitamos la versión concreta con la que trabaja gpc. Si no tenemos esa misma versión tendremos que instalar la versión adecuada o descargar el paquete nombrado con "with-gcc".

Yo descargué el archivo binario para fedora. Después de descargar el archivo hay que descomprimirlo. Esto se puede hacer en dos sitios, si tenemos permisos de root y queremos que todos los usuarios tengan gpc lo descomprimimos en la raíz, sino en una carpeta donde nuestro usuario tenga permisos (por ejemplo /home/usuario/PASCAL/gpc).

Instalar para todos los usuarios

Si vais a descomprimir el archivo en la raíz yo recomiendo descomprimir primero el archivo en una carpeta en el escritorio y mover las carpetas o los archivos que realmente hacen falta.

Estos pasos son para descomprimir directamente en la raíz.

[root@host ~]# cd /
[root@host ~]# wget http://www.gnu-pascal.de/binary/gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2
[root@host ~]# tar xjf gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2
[root@host ~]# rm -rf gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2

Para no meter tanta basura al sistema yo moví solo los binarios y las librerías a sus respectivos directorios y el resto lo eliminé porque no es necesario para que funcione gpc y son archivos que no voy a necesitar. Si queréis hacer lo mismo estos son los pasos:

[root@host ~]# cd /root
[root@host ~]# wget http://www.gnu-pascal.de/binary/gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2
[root@host ~]# tar xjf gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2
[root@host ~]# mv /root/usr/local/bin/* /bin
[root@host ~]# mv /root/usr/local/lib/* /lib
[root@host ~]# rm -rf /root/usr
[root@host ~]# rm -rf gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2

Con esto ya tenemos gpc instalado para todos los usuarios, si el sistema es de 32 bits ya podemos utilizar gpc pero si es de 64 bits hay que hacer algunas cosas más como indico en la sección de abajo.

Instalar para un solo usuario

Descomprimimos el archivo en la carpeta donde queremos que quede instalado el compilador. La carpeta debe ser una en la que tengamos permisos con nuestro usuario.

Desde el terminal creo una carpeta en home llamada PASCAL, descargo el binario que necesito y lo descomprimo:

[usuario@host ~]$ mkdir PASCAL
[usuario@host ~]$ cd PASCAL
[usuario@host ~]$ wget http://www.gnu-pascal.de/binary/gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2
[usuario@host ~]$ tar xjf gpc-20041218-with-gcc.i686-fedora-linux-gnu.tar.bz2

El siguiente paso es dejar algo mas claro el directorio donde se encuentra gpc, por ese motivo muevo todo el contenido de usr/local a gpc.

[usuario@host ~]$ mv usr/local gpc

Ahora hay que añadir al PATH la ruta de los ejecutables que acabamos de instalar y asignar la variable GPC_EXEC_PREFIX. Si no sabes como hacerlo hay un script en la página de gpc que te dice como debes hacer. Después de descargar el script debes ejecutarlo desde el directorio principal donde esta descomprimido GPC, en mi caso la carpeta /home/usuario/PASCAL/gpc.

[usuario@host ~]$ cd /home/usuario/PASCAL/gpc
[usuario@host ~]$ wget http://www.gnu-pascal.de/binary/install-gpc-binary
[usuario@host ~]$ chmod +x install-gpc-binary
[usuario@host ~]$ ./install-gpc-binary
This script is to help you install a GPC binary in an arbitrary
directory. Run this script AFTER unpacking the GPC binary archive. You will need this script if you want to install a GPC BINARY
distribution in a directory OTHER THAN that for which it was
compiled.You DON'T need this script if you compile GPC yourself, or if you
install a GPC binary in the directory for which it was compiled,
which is the directory given in the file names contained in the
archive. In other words, if you unpack the archive from the root
directory (/), you don't need this script, but if you unpack it from
another directory (e.g., your home directory), you do need it.GPC found!Please add the directory /home/usuario/PASCAL/gpc/bin
to your PATH (if it isn't there already),
and set the environment variable GPC_EXEC_PREFIX to
/home/usuario/PASCAL/gpc/lib/gcc-lib/i686-pc-linux-gnu/3.3.3/ (note the trailing `/'!). This is done as follows:If you use sh or bash as your shell, add the following to ~/.profile or ~/.bashrc:
PATH="$PATH":/home/usuario/PASCAL/gpc/bin
GPC_EXEC_PREFIX=/home/usuario/PASCAL/gpc/lib/gcc-lib/i686-pc-linux-gnu/3.3.3/
export GPC_EXEC_PREFIX
If you use csh or tcsh, add the following to ~/.cshrc or ~/.tcshrc:setenv PATH "$PATH":/home/usuario/PASCAL/gpc/bin
setenv GPC_EXEC_PREFIX /home/usuario/PASCAL/gpc/lib/gcc-lib/i686-pc-linux-gnu/3.3.3/

En rojo están resaltadas las lineas que tenemos que copiar y pegar en nuestro archivo .bashrc del directorio home.

Si nuestro sistema operativo es de 32 bits ya tenemos listo el compilador y podemos empezar a compilar en pascal. Si el sistema es de 64 bits entonces hay que instalar y realizar algunas cosas más.

Hacer que funcione con sistemas de 64 bits

Si el archivo que instalaste era un binario te habrás encontrado con el siguiente problema al intentar compilar un código en pascal:

[usuario@host ~]$ gpc codigo.pas -o programa
/tmp/cc9ofYkx.s: Assembler messages:
/tmp/cc9ofYkx.s:21: Error: invalid instruction suffix for `push'
/tmp/cc9ofYkx.s:155: Error: invalid instruction suffix for `push'
/tmp/cc9ofYkx.s:170: Error: invalid instruction suffix for `push'

Este problema se debe a que gpc "traduce" el código en 32 bits y el ensamblador intenta ensamblar en 64 bits. Para solucionar este error hay que pasar el argumento -Wa,--32.

[usuario@host ~]$ gpc -Wa,--32 codigo.pas -o programa

Es posible que el siguiente error que nos dé (de los muchos que puede haber...) es que no encuentra una serie de librerías válidas:

[usuario@host ~]$ gpc -Wa,--32 codigo.pas -o programa
/usr/bin/ld: skipping incompatible /usr/lib64/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib64/libc.so when searching for -lc

Esto nos lo dice el linker y para solucionarlo tenemos que instalar las librerías de 32 bits que faltan e indicarle al linker donde se encuentran. En mi caso se solucionó instalando el paquete glibc.i686 y las librerías glibc-devel.i686

[usuario@host ~]$ su -c 'yum -y install glibc-devel.i686 glibc.i686'

Para decirle al linker donde se encuentran las librerías que debe usar se hace con -Wl,-L/usr/lib/

[usuario@host ~]$ gpc -Wa,--32 -Wl,-L/usr/lib/ codigo.pas -o programa

Y ya por último, si queremos compilar conforme a la ISO 10206 añadimos la opción --extended-pascal

[usuario@host ~]$ gpc -Wa,--32 -Wl,-L/usr/lib/ --extended-pasal codigo.pas -o programa