¿Cómo instalar GCC pieza a pieza con GMP, MPFR, MPC, ELF, sin bibliotecas compartidas?

115

¿Cómo instalo GCC (la colección de compiladores GNU) pieza por pieza, usando la versión actual,
usando las versiones correctas de las dependencias, sin usar un administrador de paquetes (como yum, rpm, apt, dpkg) y sin usar bibliotecas compartidas?

Los desarrolladores típicos probablemente querrán instalar GCC de la manera típica, usar su administrador de paquetes (yum, rpm, apt, dpkg, port, brew, etc.) o seguir las instrucciones aquí ( http://gcc.gnu.org/wiki/ InstalandoGCC ).

Mi pregunta es cómo instalar GCC pieza por pieza, sin bibliotecas compartidas.

  • Quiero un GCC totalmente independiente que se pueda mover por mi sistema sin usar bibliotecas compartidas y sin crear bibliotecas compartidas.
  • Esto es lo que GCC llama "el camino difícil" y no se recomienda para usuarios típicos.

GCC depende de:

  • GMP: Biblioteca aritmética de precisión múltiple GNU
  • MPFR: biblioteca de redondeo de punto flotante de precisión múltiple GNU
  • MPC: biblioteca C de precisión múltiple GNU
  • ELF: biblioteca de formato ejecutable y enlazable
  • PPL: Biblioteca de poliedros de Parma (opcional, para optimizaciones de memoria)
joelparkerhenderson
fuente

Respuestas:

123

La manera fácil

Si eres un desarrollador típico, puedes instalarlo de la manera más sencilla, siguiendo las instrucciones en http://gcc.gnu.org/wiki/InstallingGCC o el administrador de paquetes de tu sistema, como:

apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

El camino difícil

GCC dice que la respuesta aquí es "el camino difícil" porque construye todo pieza por pieza y no usa bibliotecas compartidas.

Infraestructura de GCC

Obtenga la infraestructura de GCC:

ftp://gcc.gnu.org/pub/gcc/infrastructure/

Coloque las descargas en un directorio temporal (puede usar el directorio que desee).

/opt/downloads

Construya la infraestructura en un directorio temporal que sea diferente al directorio de descargas o sus subdirectorios:

/tmp/gcc

Configure la infraestructura usando bibliotecas estáticas como esta:

./configure --disable-shared --enable-static --prefix=/tmp/gcc

Es posible que valga la pena examinar el indicador --disable-shared según sus necesidades. Utilizo --disable-shared porque solo estoy compilando código estático y quiero asegurarme de no compilar ningún código compartido. Mi necesidad es mover el GCC resultante alrededor de mis unidades fácilmente, así que quiero todo el código estático y no quiero ningún código compartido. Si prefiere el código compartido, omita la marca --disable-shared.

Versiones

Cuando ejecute cualquiera de los comandos en esta respuesta, asegúrese de actualizar los comandos para usar el número de versión actual de GCC que coincida con sus necesidades. Los comandos en esta respuesta son para GCC 4.6.2.

Tenga en cuenta que la documentación de GCC dice: "Si bien cualquier versión suficientemente nueva de las herramientas requeridas generalmente funciona, los requisitos de la biblioteca son generalmente más estrictos. Las versiones más nuevas pueden funcionar en algunos casos, pero es más seguro usar las versiones exactas documentadas".

GMP

GMP es la biblioteca aritmética de precisión múltiple de GNU.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
bunzip2 gmp-4.3.2.tar.bz2
tar xvf gmp-4.3.2.tar
cd gmp-4.3.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

MPFR

MPFR es la biblioteca GNU de redondeo de punto flotante de precisión múltiple. Depende de GMP.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
bunzip2 mpfr-2.4.2.tar.bz2
tar xvf mpfr-2.4.2.tar
cd mpfr-2.4.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
make && make check && make install

MPC

MPC es la biblioteca C de precisión múltiple de GNU. Depende de GMP y MPFR.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar zxvf mpc-0.8.1.tar.gz
cd mpc-0.8.1
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
make && make check && make install

DUENDE

ELF son las siglas de Executable and Linkable Format. Esta biblioteca proporciona compatibilidad con endian y tamaño independiente de la arquitectura.

wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
tar zxvf libelf-0.8.13.tar.gz
cd libelf-0.8.13
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

GCC

GCC es la colección de compiladores GNU. Depende de GMP, MPFR, MPC y ELF.

wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz
tar zxvf gcc-4.6.2.tar.gz

Compile gcc en un directorio temporal en el mismo punto de montaje. (Construirlo dentro de / tmp desencadenaría problemas de host de compilación cruzada)

mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch

El comando configure y sus banderas deben estar todos en una línea de comando (esta publicación los muestra en líneas separadas solo por el ancho de la página web).

Nota: Usamos la ruta completa para configurar y no establecemos variables de entorno de ruta de biblioteca. Elegimos deshabilitar el bootstrap y deshabilitar las bibliotecas compartidas porque no las queremos (los usuarios típicos pueden querer ambos), y usar subprocesos posix y marcadores que son predeterminados porque los queremos (los usuarios típicos pueden querer usar otros subprocesos u omitir banderas predeterminadas). YMMV y lea sobre las banderas aquí

/opt/downloads/gcc-4.6.2/configure
  --disable-shared
  --disable-bootstrap
  --disable-libstdcxx-pch
  --enable-languages=all
  --enable-libgomp
  --enable-lto
  --enable-threads=posix
  --enable-tls
  --with-gmp=/tmp/gcc
  --with-mpfr=/tmp/gcc
  --with-mpc=/tmp/gcc
  --with-libelf=/tmp/gcc
  --with-fpmath=sse
make && make install

Esta página es excelente para obtener información sobre la instalación de GCC, cómo construirlo, varios indicadores y más:

http://www.acsu.buffalo.edu/~charngda/cc_build.html

Actualizaciones

Las bibliotecas de ppl se pueden utilizar para optimizaciones de memoria: consulte bugseng.com/products/ppl/Download (gracias Paul en los comentarios)

Puede ejecutar ./contrib/download_prerequisites desde el directorio de origen de gcc. (Gracias a N7P en reddit)

joelparkerhenderson
fuente
2
Para su información, asegúrese de actualizar los números de versión anteriores para el nuevo GCC 4.6.3 (o lo que sea actual cuando esté haciendo esto)
joelparkerhenderson
12
Puede ejecutar ./contrib/download_prerequisites desde el directorio de origen de gcc. Este comentario es gracias a N7P en Reddit.
joelparkerhenderson
3
No, el bootstrapping no depende de ello. Tiene sentido usar --disable-shared para construir GMP, MPFR y MPC, pero no para GCC en sí (y usar el script download_prerequisites significa que no necesita construir GMP, MPFR y MPC manualmente de todos modos). La construcción de GCC siempre crea bibliotecas estáticas y bibliotecas compartidas de forma predeterminada, --disable-shared solo significa que no obtiene bibliotecas compartidas, que es la elección incorrecta para la mayoría de las personas.
Jonathan Wakely
8
--disable-sharedes incorrecto para la mayoría de las personas, --disable-bootstrappuede acelerar la compilación, pero puede hacer que falle dependiendo de la versión de gcc existente, --enable-libgomphabilitado de manera predeterminada de todos modos, --enable-ltohabilitado de manera predeterminada, --enable-thread-safeno es una opción válida, --enable-threads=posixhabilitado de manera predeterminada en algunas plataformas, no válido en otras , --enable-tlshabilitado por defecto, ... básicamente estas instrucciones son bastante pobres
Jonathan Wakely
1
Puede usar Linuxbrew para instalar gcc (y opcionalmente glibc) en su directorio personal con brew install gcc. Ver linuxbrew.sh
Shaun Jackman
118

La respuesta aceptada lo hace mucho más complicado de lo necesario y no es correcto para todas las versiones. Construir GCC con --disable-sharedsuele ser una muy mala idea. Consulte http://gcc.gnu.org/wiki/InstallingGCC para obtener un enfoque más sencillo.

La totalidad de proceso debe ser más difícil que esto (la sustitución de 4.6.2 con la versión que desea construir):

tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 
make
make install

(Pero lea el enlace de arriba de todos modos, contiene información útil).

Aparentemente, algunas personas en Ubuntu tienen toneladas de basura en su entorno que interfieren con el proceso de compilación de GCC, y deben eliminar eso primero:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
fuente
2
No, no hay ningún paso que falte
Jonathan Wakely
2
@ user2023370, GCC sabe cómo encontrar todos sus propios encabezados y bibliotecas, por supuesto. Debe configurar LD_LIBRARY_PATH para decirle al vinculador dinámico cómo encontrar las bibliotecas (porque cuando ejecuta un ejecutable GCC ya no está involucrado), consulte gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, entonces tu "algo como esto" no era lo mismo. Los pasos anteriores funcionan. Trabajan para mí con regularidad, con todas las versiones de GCC. Funcionan para cientos de personas.
Jonathan Wakely
3
Para referencia futura, esto funcionó para mí para gcc-5.4.0. Lo único que no se mencionó fue que tenía que hacerlo unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHantes de todo lo demás, como se sugiere aquí: stackoverflow.com/questions/12255058/…
Cantfindname
4
¡Esto funcionó para mí con gcc 6.2.0 y definitivamente debería ser la respuesta aceptada! (Funciona en todos los sistemas operativos / versiones, etc.)
David Doria
25

Trabajo en un clúster. Solo el nodo maestro está conectado a Internet. El software de los nodos está desactualizado y generalmente no se mantiene. No tengo acceso de root. Tengo dos opciones:

  • construir el software estático que necesito (paquetes computacionales); o
  • construir compiladores estáticos.

Elegí el segundo y construí gcc, g ++ y gfortran.

Construí todo en

PREFIX=$HOME/cmp/soft/sft

y para makeyo usé

THREADS=8

A continuación, gcc está construido con

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Se puede obtener la última versión de gcc desde aquí: ftp://gcc.gnu.org/pub/gcc/releases

Las dependencias se encuentran aquí: ftp://gcc.gnu.org/pub/gcc/infrastructure

Dependencias

Obtengo dependencias con el siguiente script:

#!/bin/sh

# ===========
## variables:

GMP=gmp-4.3.2.tar.bz2
MPFR=mpfr-2.4.2.tar.bz2
MPC=mpc-0.8.1.tar.gz
ISL=isl-0.12.2.tar.bz2
CLOOG=cloog-0.18.1.tar.gz

MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure


# ===========
## functions:

extract() {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)   tar xvjf $1    ;;
            *.tar.gz)    tar xvzf $1    ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar x $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xvf $1     ;;
            *.tbz2)      tar xvjf $1    ;;
            *.tgz)       tar xvzf $1    ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)           echo "I don't know how to extract '$1'..." ;;
        esac
    else
        echo "'$1' is not a valid file!"
    fi
}

# ======================
## download and extract:

wget $MIRROR/$GMP
extract $GMP

wget $MIRROR/$MPFR
extract $MPFR

wget $MIRROR/$MPC
extract $MPC

wget $MIRROR/$ISL
extract $ISL

wget $MIRROR/$CLOOG
extract $CLOOG

La siguiente función bash se utiliza a continuación:

mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

Cada uno de los siguientes comandos se emitirá en el directorio de la lib recién descargada.

GMP

mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install

MPFR

mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install

MPC

mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install

ISL

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
make -j $THREADS && make install

CLOOG

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog
make -j $THREADS && make install

gcc

mkdircd build
export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib
export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran
make -j $THREADS bootstrap && make install
Adobe
fuente
1
Esto es innecesariamente complicado, los pasos de mi respuesta también crean un GCC vinculado estáticamente, sin acceso de root, y no es necesario configurarlo LD_LIBRARY_PATHpara usar el GCC resultante.
Jonathan Wakely
Esto también funciona en situaciones en las que hay conflictos con lo que esté instalado en rutas "bien definidas" (es decir, casos en los que el procedimiento estándar no funciona). Últimas versiones de 2017-06-19: gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn
7

Usé lo que Jonathan mencionó anteriormente, excepto que tuve que descargar gmp y mpfr manualmente y crear un enlace suave (la distribución gcc 4.4.2 probablemente no tenga "requisitos previos de descarga")

cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1  gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr

Por cierto, usar "-with-gmp" y "with-mpfr" con "./configure" me dio "configure: error: no se puede calcular el sufijo de los archivos de objeto: no se puede compilar". Por lo tanto, descargué los srcs de gmp y mpfr y luego creé el enlace suave desde dentro de gcc src top level dir

vptr
fuente
2

Después de intentar instalar dependencias de GCC, incluidas GMP, MPFR y MPC. Me encontré con requisitos de instalación adicionales, errores y archivos faltantes; como el archivo de encabezado gmp.h requerido por MPFR para instalar. Hay una serie de problemas con los que se encontrará en el proceso. Sin embargo, existe una forma más sencilla de compilar e instalar GCC-X.0.0 o una versión posterior con un enlace automático .

OPCION UNO.

Para evitar la molestia de construir con make, make install y vincular las bibliotecas dinámicas, simplemente:

  • Descargue su versión GCC-X.0.0 (con la última versión de: https://gcc.gnu.org/ )

  • Extraiga los archivos gcc-X-000.tar.gz a una ubicación / somepath /.

  • Una vez que haya extraído el archivo .tar.gz, ejecute el script ./contrib/download_prerequisites que se encuentra en / somepath / o en el directorio de origen.

  • Este script descargará bibliotecas de soporte que incluyen: GMP, MPFR y MPC y creará enlaces simbólicos para usted, que CONSTRUIRÁ todas las dependencias de gcc automáticamente como parte del proceso de instalación de gcc.

    No es necesario compilar y vincular bibliotecas de soporte que se descargaron en / somepath / emitiendo Make, Make Install o ejecutando el archivo ./configure o agregando enlaces como --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... porque esto se hizo cuando ejecutó el script que creó enlaces simbólicos .

OPCIÓN DOS.

  • Utilice su sistema de administración de paquetes de SO para instalar las bibliotecas de soporte en la ubicación estándar del sistema. Para sistemas basados ​​en Debian, incluido Ubuntu, instale los paquetes libgmp-dev, libmpfr-dev y libmpc-dev . Para sistemas basados ​​en RPM, incluidos Fedora y SUSE, instale los paquetes gmp-devel y libmpc-devel ( mpc-devel en SUSE).
  • Esta opción instalará bibliotecas y archivos de encabezado en un directorio del sistema estándar donde se encontrarán automáticamente al construir GCC.
  • Esta es la ventaja de la administración de la instalación del paquete del sistema operativo cuando invoca "sudo apt-get install libgmp-dev" o "sudo apt-get install libmpfr-dev" install y la vinculación ya está hecha por usted. Además, no es necesario crear las bibliotecas de soporte con Make, Make install o ./configure. Además, el proceso tarda unos minutos en completar todo el proceso.
  • Ahora puede continuar con la instalación de GCC.

CONFIGURACIÓN:

This is the GCC config Process, with gcc-X-000.tar.gz 

Problema:

tar -xvf gcc-X-000.tar.gz 
cd gcc-X-000
./contrib/download_prerequisites
cd ..
mkdir objdir
/../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 2
make install

NÓTESE BIEN:

--enable-lenguajes como c ++ o c.

--disable-multilib ; deshabilite multilib según su sistema y sistema operativo, se le preguntará acerca de multilib para continuar.

Hacer tardará mucho en completarse. Sin embargo, puede emitir la opción -j #no_pro. Esto ejecutará Make simultáneamente en paralelo según la cantidad de procesadores en su PC o Mac.

Para obtener información detallada sobre cómo ejecutar este proceso, puede visitar: https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
fuente
1

Seguí la respuesta más aceptada por joelparkerhenderson. Esta es la mejor respuesta que pude encontrar para instalar en un sistema * NIX a través de Internet.

Para la posteridad, quiero agregar que si obtiene un error como "error de instalación: no se puede calcular el sufijo de los archivos de objeto: no se puede compilar"

luego actualice su LD_LIBRBARY_PATH con / tmp / gcc / lib (vea la respuesta completa de joelparkerhenderson para el contexto)

/ tmp / gcc / lib contiene todos los mpfr / mpc / gmp necesarios para que los archivos y el enlazador de tiempo de ejecución no puedan encontrarlos a menos que los agregue a LD_LIBRARY_PATH. Además, no olvide exportar LD_LIBRARY_PATH;). Más contexto aquí: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
fuente
Tener que actualizar LD_LIBRARY_PATH solo para usar el compilador es una tontería. Si usa stackoverflow.com/a/10662297/981959 en su lugar, no es necesario.
Jonathan Wakely