¿Cómo instalar GCC pieza por pieza con GMP, MPFR, MPC, ELF, sin bibliotecas compartidas?
(6)
¿Cómo instalo GCC (la colección de compiladores GNU) pieza por pieza, usando la versión actual,
utilizando 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 deseen instalar GCC de la manera típica, use su administrador 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 instalar GCC pieza por pieza, sin bibliotecas compartidas.
- Quiero un GCC totalmente independiente que pueda moverse por mi sistema sin utilizar ninguna biblioteca compartida, y sin crear ninguna biblioteca compartida.
- Esto es lo que GCC llama "la manera difícil" y no se recomienda para usuarios típicos.
GCC depende de:
- GMP: Biblioteca aritmética de precisión múltiple de GNU
- MPFR: GNU Biblioteca de redondeo de coma flotante de precisión múltiple
- 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)
La manera fácil
Si eres un desarrollador típico, puedes instalarlo de la manera más sencilla, usando las instrucciones en http://gcc.gnu.org/wiki/InstallingGCC o el administrador de paquetes de tu sistema, como por ejemplo:
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 "por las malas" 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
Cree 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
La bandera --disable-shared puede merecer una mirada más cercana según tus necesidades. Utilizo --disable-shared porque estoy construyendo código estático solamente, y quiero asegurarme de que no construyo ningún código compartido. Mi necesidad es mover el GCC resultante alrededor de mis discos 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 el indicador --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 necesarias suele funcionar, 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 utilizar las versiones exactas documentadas".
GMP
GMP es la Biblioteca de 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 punto 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
DUENDE
ELF significa Formato Ejecutable y Vinculable. Esta biblioteca proporciona compatibilidad con tamaño independiente de arquitectura y 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
GCC
GCC es la colección de compiladores de 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
Construya gcc en un directorio reutilizable en el mismo punto de montaje. (Crearlo 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 de configuración 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 configuramos las variables de entorno de la ruta de la biblioteca. Elegimos desactivar bootstrap y deshabilitar las bibliotecas compartidas porque no las queremos (los usuarios típicos pueden querer ambas), y usar los subprocesos de posix y los indicadores que son predeterminados porque los queremos (los usuarios típicos pueden querer usar otros hilos u omitir banderas predeterminadas). YMMV y lee sobre las banderas here
/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 la 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 optimizar la memoria: consulte bugseng.com/products/ppl/Download (gracias a Paul en los comentarios)
Puede ejecutar ./contrib/download_prerequisites desde el directorio de origen de gcc. (Gracias a N7P en reddit)
Después de intentar instalar dependencias de GCC, incluidas GMP, MPFR y MPC. Me encontré con requisitos de instalación adicionales, errores y archivos perdidos; como archivo de cabecera gmp.h requerido por MPFR para instalar. Se eliminan una serie de problemas que se encontrarán en el proceso. Sin embargo, existe una manera más fácil de compilar e instalar GCC-X.0.0 o una versión posterior con un enlace automático .
OPCION UNO.
Para ahorrar el problema de construir con make, make install y Linking the dynamic libraries, simplemente:
- Descargue su GCC-X.0.0 -version (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 la secuencia de comandos ./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á un enlace simbólico 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 las bibliotecas de soporte que se descargaron a / 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ó un script que creó enlaces simbólicos .
OPCIÓN DOS.
- Use su sistema de administración de paquetes OS para instalar las bibliotecas de soporte en la ubicación estándar del sistema. Para el sistema basado en Debian, incluidos Ubuntu, instale los paquetes libgmp-dev, libmpfr-dev y libmpc-dev . Para el sistema basado 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 de sistema estándar donde se encontrarán automáticamente al compilar GCC.
- Esta es la ventaja de OS Package Installation Management cuando se invoca "sudo apt-get install libgmp-dev" o "sudo apt-get install libmpfr-dev" y se realiza el enlace. Además, no tiene que compilar las bibliotecas de soporte con Make, Make install o ./configure. Además, el proceso lleva unos minutos para 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:
- idiomas aptos tales 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 tiempo en completarse. Sin embargo, puede emitir la opción -j #no_pro. Esto ejecutará simultáneamente en paralelo en función de 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 .
La respuesta aceptada lo hace mucho más complicado de lo necesario y no es correcto para todas las versiones. Crear GCC con --disable-shared
es generalmente una muy mala idea. Vea http://gcc.gnu.org/wiki/InstallingGCC para un acercamiento 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 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 montones de basura en su entorno que interfieren con el proceso de compilación de GCC, y necesitan eliminar eso primero:
unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
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 recibe un error como "error de instalación: no se puede calcular el sufijo de los archivos de objeto: no se puede compilar"
luego actualiza tu LD_LIBRBARY_PATH con / tmp / gcc / lib (Consulta la respuesta completa de joelparkerhenderson para el contexto)
/ tmp / gcc / lib contiene todos los archivos mpfr / mpc / gmp necesarios y el enlazador de tiempo de ejecución no los puede encontrar a menos que los agregue a LD_LIBRARY_PATH. Tampoco te olvides de exportar LD_LIBRARY_PATH;). Más contexto aquí: https://gcc.gnu.org/wiki/FAQ#configure_suffix
Usé lo que Jonathan mencionó anteriormente, excepto que tuve que descargar gmp y mpfr manualmente y crear un enlace suave (la distribución de gcc 4.4.2 probablemente no tiene "requisitos_preliminares")
cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1 gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr
Por cierto, el uso de "-with-gmp" y "con-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 leve dir
Yo trabajo en un clúster Solo el nodo maestro está conectado a Internet. El software en los nodos está desactualizado y, en general, no se mantiene. No tengo acceso de root. Tengo dos opciones:
- construir el software estático que necesito (paquetes computacionales); o
- compilar compiladores estáticos.
Elegí el segundo y construí gcc, g ++ y gfortran.
Construí todo en
PREFIX=$HOME/cmp/soft/sft
y para make
utilicé
THREADS=8
A continuación, gcc está construido con
- GMP
- MPFR
- MPC
- ISL
- CLOOG
Uno puede obtener el último 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 usa 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