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


Cómo instalo GCC (the GNU Compiler Collection) pieza por pieza, usando la versión actual,
¿usar las versiones correctas de las dependencias, no usar un gestor de paquetes (como yum, rpm, apt, dpkg) y no usar bibliotecas compartidas?

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

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

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

GCC depende de:

  • GMP: Biblioteca Aritmética de Precisión Múltiple de GNU
  • MPFR: Redondeo de coma flotante de precisión múltiple de GNU biblioteca
  • MPC: Biblioteca C de precisión múltiple de GNU
  • ELF: Biblioteca de Formato ejecutable y enlazable
  • PPL: Biblioteca de poliedros de Parma (opcional, para optimizaciones de memoria)
Author: Cœur, 2012-02-26

6 answers

El Camino Fácil

Si usted es un desarrollador típico, puede instalar de la manera fácil, utilizando las instrucciones en http://gcc.gnu.org/wiki/InstallingGCC o su gestor de paquetes del 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 "de la manera difícil" porque construye todo pieza por pieza, y no usa bibliotecas compartidas.

Infraestructura del CCG

Obtener la infraestructura GCC:

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

Poner descargas en un temp directorio (puedes usar el directorio que quieras).

/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

El indicador disable disable-shared puede valer la pena un vistazo más de cerca dependiendo de sus necesidades. Uso --disable-shared porque solo estoy creando código estático, y quiero asegurarme de que no compilo ningún código compartido. Mi la necesidad es mover el GCC resultante alrededor de mis unidades fácilmente, por lo que quiero todo el código estático, y no quiero ningún código compartido. Si prefiere código compartido, omita el indicador disable disable-shared.

Versiones

Cuando ejecute cualquiera de los comandos de 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 de esta respuesta son para GCC 4.6.2.

Tenga en cuenta que la documentación del CCG dice: "Mientras que cualquier versión suficientemente nueva de las herramientas requeridas generalmente funcionan, los requisitos de la biblioteca son generalmente más estrictos. Las versiones más recientes 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 de redondeo de coma flotante de precisión múltiple de GNU. 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

ELFO

ELF significa Formato ejecutable y Enlazable. Esta biblioteca proporciona tamaño independiente de la arquitectura y soporte endian.

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

CCG

GCC es la Colección del Compilador 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

Construir gcc en un directorio cero en el 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 indicadores deben estar todos en uno línea de comandos (este post los muestra en líneas separadas solo por el ancho de la página web).

Nota: Usamos la ruta completa para configurar y no establecer variables de entorno de ruta de biblioteca. Elegimos deshabilitar bootstrap y deshabilitar bibliotecas compartidas porque no las queremos (los usuarios típicos pueden querer ambas cosas), y usar hilos posix y banderas que son predeterminadas porque las queremos (los usuarios típicos pueden querer usar otros hilos u omitir banderas predeterminadas). YMMV y leer 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 ideal para información de instalación de GCC, cómo construirla, varias banderas y más:

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

Actualizaciones

Las bibliotecas ppl se pueden utilizar para optimizaciones de memoria: ver bugseng.com/products/ppl/Download (Gracias Pablo en comentarios)

Podrías correr ./ contrib / download_prereficies del directorio fuente de gcc. (Gracias a N7P en reddit)

 115
Author: joelparkerhenderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 13:20:05

La respuesta aceptada lo hace mucho más complicado de lo necesario y no es correcto para todas las versiones. Construir GCC con --disable-shared suele ser una muy mala idea. Véase http://gcc.gnu.org/wiki/InstallingGCC para un enfoque más fácil.

El proceso completo no debería ser más difícil que esto (reemplazando 4.6.2 con la versión que desea compilar):

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 por favor lea el enlace de arriba de todos modos, contiene información útil.)

Aparentemente algunos la gente en Ubuntu tiene toneladas de basura en su entorno que interfiere con el proceso de compilación de GCC, y primero deben eliminarlo:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
 106
Author: Jonathan Wakely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 19:47:54

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

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

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

Construí todo en {[12]]}

PREFIX=$HOME/cmp/soft/sft

Y para make utilicé

THREADS=8

A continuación, gcc se construye con

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Se puede obtener la última 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 comandos a continuación debe ser publicado en el dir 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

Ccg

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
 24
Author: Adobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-07 06:52:44

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 "download_prereficies")

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

Por cierto, usando "-con-gmp " y "con-mpfr "con"./ configure" gave me "configure: error: cannot compute suffix of object files: cannot compile". Por lo tanto, descargué los srcs de gmp y mpfr y luego creé el enlace suave a él desde dentro de gcc src top leve dir

 6
Author: vptr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 22:02:48

Después de intentar instalar dependencias GCC incluyendo GMP, MPFR y MPC. Me encontré con requisitos de instalación adicionales, Errores y archivos faltantes; como gmp.archivo de cabecera h requerido por MPFR para instalar. Hay salir de una serie de problemas que se encontrará en el proceso. Sin embargo, hay una manera más fácil de compilar e Instalar GCC-X. 0.0 o una versión posterior con un enlace automático .

OPCIÓN UNO.

Para salvar la molestia de Construyendo con make, make install y Enlazando las bibliotecas dinámicas, Simplemente:

  • Descargue su GCC-X. 0. 0-version (con la última versión de: https://gcc.gnu.org/)
  • Extraer el gcc-X-000.alquitrán.archivos gz a una ubicación / somepath/.
  • Una vez que haya Extraído .alquitrán.archivo gz, ejecutar ./contrib /download_prereblings script que se encuentra en/ somepath / o en el directorio fuente.
  • Este script descargará bibliotecas de soporte incluyendo: GMP, MPFR y MPC y creará un enlaces Simbólicos para usted, que le CONSTRUIR todos gcc dependencias automáticamente como parte de gcc proceso de Instalación.

    No es necesario Construir y Vincular bibliotecas de soporte que se descargaron en /somepath/ emitiendo Make, Make Install o ejecutando ./ configure archivo o añadiendo enlaces como --with-gmp=/gmp_path/.../....., with with-mpfr= / mpfr_path/.../... porque esto se hizo cuando corriste script que creó enlaces simbólicos.

OPCIÓN DOS.

  • Utilice el sistema de gestión de paquetes del sistema operativo para instalar las bibliotecas de soporte en la ubicación estándar del sistema. Para el sistema basado en Debian incluyendo Ubuntu, Instale libgmp-dev, libmpfr-dev y libmpc-dev paquetes. Para el sistema basado en RPM incluyendo Fedora y SUSE, instale gmp-devel, y libmpc-devel(mpc-devel en SUSE) paquetes.
  • Esta opción instalará bibliotecas y archivos de cabecera en un directorio estándar del sistema donde se encontrarán automáticamente al compilar GCC.
  • Esta es la ventaja de la gestión de instalación de paquetes del sistema operativo cuando invoca "sudo apt-get install libgmp-dev" o "sudo apt-get install libmpfr-dev" install y la vinculación se realiza por usted. Además, no tienes que construir las bibliotecas de soporte con Make, Make install o ./configurar. 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 

Cuestión:

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

NB:

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

--disable-multilib; disable multilib basado en su sistema y sistema operativo, se le preguntará acerca de multilib para proceder.

Make tardará mucho tiempo en completarse. Sin embargo, puede emitir la opción-j #no_pro. Esto se ejecutará simultáneamente en paralelo en función del número 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 .

 1
Author: Juniar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 20:46:44

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

Para la posteridad quiero añadir que si obtienes un error como "install error: cannot compute suffix of object files: cannot compile"

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 archivos mpfr/mpc/gmp so requeridos y el enlazador de tiempo de ejecución no puede encontrarlos a menos que los agregue a LD_LIBRARY_PATH. También no olvides exportar LD_LIBRARY_PATH;). Más contexto aquí: https://gcc.gnu.org/wiki/FAQ#configure_suffix

 0
Author: Abhimanu Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-18 20:26:09