Comment installer GCC pièce par pièce avec GMP, MPFR, MPC, ELF, sans bibliothèques partagées?

115

Comment installer GCC (la collection de compilateurs GNU) pièce par pièce, en utilisant la version actuelle, en
utilisant les versions correctes des dépendances, en n'utilisant pas de gestionnaire de paquets (comme yum, rpm, apt, dpkg) et en n'utilisant pas de bibliothèques partagées?

Les développeurs typiques voudront probablement installer GCC de la manière habituelle, utiliser votre gestionnaire de paquets (yum, rpm, apt, dpkg, port, brew, etc.) ou suivre les instructions ici ( http://gcc.gnu.org/wiki/ Installation de GCC ).

Ma question est de savoir comment installer GCC pièce par pièce, sans bibliothèques partagées.

  • Je veux un GCC totalement indépendant qui puisse être déplacé dans mon système sans utiliser de bibliothèques partagées, et sans créer de bibliothèques partagées.
  • C'est ce que GCC appelle "la voie difficile" et ce n'est pas recommandé pour les utilisateurs typiques.

GCC dépend de:

  • GMP: bibliothèque arithmétique de précision multiple GNU
  • MPFR: bibliothèque d'arrondis à virgule flottante à précision multiple GNU
  • MPC: bibliothèque C GNU à précision multiple
  • ELF: bibliothèque de formats exécutables et liés
  • PPL: Parma Polyhedra Library (en option, pour les optimisations de mémoire)
joelparkerhenderson
la source

Réponses:

123

La manière facile

Si vous êtes un développeur classique, vous pouvez installer la méthode simple, en utilisant les instructions sur http://gcc.gnu.org/wiki/InstallingGCC ou votre gestionnaire de packages système tels que:

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

À la dure

GCC dit que la réponse ici est «à la dure» car il construit tout morceau par morceau et n'utilise pas de bibliothèques partagées.

Infrastructure GCC

Obtenez l'infrastructure GCC:

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

Placez les téléchargements dans un répertoire temporaire (vous pouvez utiliser le répertoire de votre choix).

/opt/downloads

Construisez l'infrastructure dans un répertoire temporaire différent du répertoire de téléchargements ou de ses sous-répertoires:

/tmp/gcc

Configurez l'infrastructure à l'aide de bibliothèques statiques comme ceci:

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

L'indicateur --disable-shared peut valoir la peine d'être examiné de plus près en fonction de vos besoins. J'utilise --disable-shared parce que je ne construis que du code statique et je veux m'assurer de ne pas créer de code partagé. Mon besoin est de déplacer facilement le GCC résultant autour de mes lecteurs, donc je veux tout le code statique, et je ne veux pas de code partagé. Si vous préférez le code partagé, omettez l'indicateur --disable-shared.

Versions

Lorsque vous exécutez l'une des commandes de cette réponse, assurez-vous de mettre à jour les commandes pour utiliser le numéro de version actuel de GCC qui correspond à vos besoins. Les commandes de cette réponse concernent GCC 4.6.2.

Notez que la documentation GCC dit: "Bien que toute version suffisamment nouvelle des outils requis fonctionne généralement, les exigences de la bibliothèque sont généralement plus strictes. Les versions plus récentes peuvent fonctionner dans certains cas, mais il est plus sûr d'utiliser les versions exactes documentées."

GMP

GMP est la bibliothèque d'arithmétique à précision multiple 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 est la bibliothèque d'arrondis à virgule flottante à précision multiple GNU. Cela dépend 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 est la bibliothèque GNU C à précision multiple. Cela dépend de GMP et 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

ELFE

ELF signifie Executable and Linkable Format. Cette bibliothèque fournit une taille et une prise en charge endian indépendantes de l'architecture.

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 est la collection de compilateurs GNU. Cela dépend de GMP, MPFR, MPC et 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

Construisez gcc dans un répertoire de travail sur le même point de montage. (Le construire dans / tmp déclencherait des problèmes d'hôte de compilation croisée)

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

La commande configure et ses indicateurs doivent être tous sur une seule ligne de commande (cet article les montre sur des lignes séparées juste à cause de la largeur de la page Web).

Remarque: Nous utilisons le chemin complet pour configurer et ne définissons pas les variables d'environnement du chemin de bibliothèque. Nous choisissons de désactiver le bootstrap et de désactiver les bibliothèques partagées parce que nous ne les voulons pas (les utilisateurs typiques peuvent vouloir les deux), et d'utiliser les threads posix et les indicateurs qui sont par défaut parce que nous les voulons (les utilisateurs typiques peuvent vouloir utiliser d'autres threads ou sauter drapeaux par défaut). YMMV et lisez les drapeaux ici

/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

Cette page est idéale pour les informations d'installation de GCC, comment le construire, divers indicateurs, et plus encore:

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

Mises à jour

Les bibliothèques ppl peuvent être utilisées pour des optimisations de mémoire: voir bugseng.com/products/ppl/Download (Merci Paul dans les commentaires)

Vous pouvez exécuter ./contrib/download_prerequisites à partir du répertoire source gcc. (Merci à N7P sur reddit)

joelparkerhenderson
la source
2
Pour info, assurez-vous de mettre à jour les numéros de version ci-dessus pour le nouveau GCC 4.6.3 (ou ce qui est actuel lorsque vous faites cela)
joelparkerhenderson
12
Vous pouvez exécuter ./contrib/download_prerequisites à partir du répertoire source gcc. Ce commentaire est grâce à N7P sur Reddit.
joelparkerhenderson
3
Non, le bootstrap n'en dépend pas. Il est logique d'utiliser --disable-shared pour construire GMP, MPFR et MPC mais pas pour GCC lui-même (et utiliser le script download_prerequisites signifie que vous n'avez pas besoin de construire manuellement GMP, MPFR et MPC). Construire GCC construit toujours des bibliothèques statiques et des bibliothèques partagées par défaut, --disable-shared signifie simplement que vous n'obtenez aucune bibliothèque partagée, ce qui est le mauvais choix pour la plupart des gens.
Jonathan Wakely
8
--disable-sharedest faux pour la plupart des gens, --disable-bootstrappeut accélérer la construction, mais peut provoquer son échec en fonction de la version de gcc existante, --enable-libgompactivée par défaut de toute façon, --enable-ltoactivée par défaut, --enable-thread-safepas une option valide, --enable-threads=posixactivée par défaut sur certaines plates-formes, non valide sur d'autres , --enable-tlsactivé par défaut, ... en gros, ces instructions sont plutôt médiocres
Jonathan Wakely
1
Vous pouvez utiliser Linuxbrew pour installer gcc (et éventuellement glibc) dans votre répertoire personnel avec brew install gcc. Voir linuxbrew.sh
Shaun Jackman
118

La réponse acceptée la rend beaucoup plus compliquée que nécessaire et n'est pas correcte pour toutes les versions. Construire GCC avec --disable-sharedest généralement une très mauvaise idée. Voir http://gcc.gnu.org/wiki/InstallingGCC pour une approche plus simple.

L' ensemble du processus ne devrait pas être plus difficile que cela (en remplaçant la version 4.6.2 par la version que vous souhaitez créer):

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

(Mais veuillez quand même lire le lien ci-dessus, il contient des informations utiles.)

Apparemment, certaines personnes sur Ubuntu ont des tonnes de conneries dans leur environnement qui interfèrent avec le processus de construction de GCC, et elles doivent d'abord les supprimer:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
la source
2
Non, il n'y a pas d'étape manquante
Jonathan Wakely
2
@ user2023370, GCC sait comment trouver tous ses propres en-têtes et bibliothèques, bien sûr. Vous devez définir LD_LIBRARY_PATH pour indiquer à l'éditeur de liens dynamique comment trouver les bibliothèques (car lorsque vous exécutez un exécutable, GCC n'est plus impliqué), consultez gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, alors votre "quelque chose comme ça" n'était pas le même. Les étapes ci-dessus fonctionnent. Ils travaillent pour moi régulièrement, avec toutes les versions de GCC. Ils travaillent pour des centaines de personnes.
Jonathan Wakely
3
Pour référence future, cela a fonctionné pour moi pour gcc-5.4.0. La seule chose qui n'a pas été mentionnée était que je devais unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHavant tout le reste comme suggéré ici: stackoverflow.com/questions/12255058/…
Cantfindname
4
Cela a fonctionné pour moi avec gcc 6.2.0 et devrait certainement être la réponse acceptée! (Cela fonctionne sur tous les systèmes d'exploitation / versions, etc.)
David Doria
25

Je travaille sur un cluster. Seul le nœud maître est connecté à Internet. Le logiciel sur les nœuds est obsolète et n'est généralement pas maintenu. Je n'ai pas d'accès root. J'ai deux options:

  • construire le logiciel statique dont j'ai besoin (packages de calcul); ou
  • construire des compilateurs statiques.

J'ai choisi le deuxième et construit gcc, g ++ et gfortran.

J'ai tout construit

PREFIX=$HOME/cmp/soft/sft

et pour makej'ai utilisé

THREADS=8

Ci-dessous, gcc est construit avec

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

On peut obtenir le dernier gcc d'ici: ftp://gcc.gnu.org/pub/gcc/releases

Les dépendances se trouvent ici: ftp://gcc.gnu.org/pub/gcc/infrastructure

Dépendances

J'obtiens des dépendances avec le script suivant:

#!/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 fonction bash suivante est utilisée ci-dessous:

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

Chacune des commandes ci-dessous doit être exécutée dans le répertoire de la bibliothèque qui vient d'être téléchargée.

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
la source
1
C'est inutilement compliqué, les étapes de ma réponse construisent également un GCC lié statiquement, sans accès root, et vous n'avez pas besoin de configurer LD_LIBRARY_PATHpour utiliser le GCC résultant.
Jonathan Wakely
Cela fonctionne également dans les situations où il y a des conflits avec tout ce qui est installé dans des chemins "bien définis" (c'est-à-dire, les cas où la procédure standard ne fonctionne pas du tout). Dernières versions au 19/06/2017: 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

J'ai utilisé ce que Jonathan a mentionné ci-dessus, sauf que j'ai dû télécharger gmp et mpfr manuellement et créer un lien logiciel (la distribution gcc 4.4.2 n'a probablement pas de "download_prerequisites")

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

Btw, l'utilisation de "-with-gmp" et "with-mpfr" avec "./configure" m'a donné "configure: erreur: impossible de calculer le suffixe des fichiers objets: impossible de compiler". Par conséquent, j'ai téléchargé les srcs de gmp et mpfr, puis j'ai créé le lien logiciel vers celui-ci à partir de gcc src top leve dir

vptr
la source
2

Après avoir essayé d'installer les dépendances GCC, y compris GMP, MPFR et MPC. J'ai rencontré des exigences d'installation supplémentaires, des erreurs et des fichiers manquants; comme le fichier d'en-tête gmp.h requis par MPFR pour l'installation. Il y a un certain nombre de problèmes que vous rencontrerez au cours du processus. Cependant, il existe un moyen plus simple de créer et d'installer GCC-X.0.0 ou une version ultérieure avec une liaison automatique .

OPTION UN.

Pour éviter les problèmes de construction avec make, installez et liez les bibliothèques dynamiques, simplement:

  • Téléchargez votre version GCC-X.0.0 (avec la dernière version sur: https://gcc.gnu.org/ )

  • Extrayez les fichiers gcc-X-000.tar.gz vers un emplacement / somepath /.

  • Une fois que vous avez extrait le fichier .tar.gz, exécutez le script ./contrib/download_prerequisites qui se trouve sur / somepath / ou le répertoire source.

  • Ce script téléchargera les bibliothèques de support, notamment: GMP, MPFR et MPC et créera un Symlinks pour vous, qui CONSTRUIRE toutes les dépendances gcc automatiquement dans le cadre du processus d'installation de gcc.

    Pas besoin de construire et de lier les bibliothèques de support qui ont été téléchargées vers / somepath / en émettant Make, Make Install ou en exécutant le fichier ./configure ou en ajoutant des liens tels que --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... car cela a été fait lorsque vous avez exécuté le script qui a créé des liens symboliques .

OPTION DEUX.

  • Utilisez votre système de gestion de packages de système d'exploitation pour installer les bibliothèques de support dans l'emplacement système standard. Pour les systèmes basés sur Debian, y compris Ubuntu, installez les packages libgmp-dev, libmpfr-dev et libmpc-dev . Pour les systèmes basés sur RPM, y compris Fedora et SUSE, installez les packages gmp-devel et libmpc-devel ( mpc-devel sur SUSE).
  • Cette option installera les bibliothèques et les fichiers d'en-tête dans un répertoire système standard où ils seront trouvés automatiquement lors de la construction de GCC.
  • C'est l'avantage de la gestion de l'installation des packages du système d'exploitation lorsque vous appelez "sudo apt-get install libgmp-dev" ou "sudo apt-get install libmpfr-dev" et la liaison est faite pour vous. De plus, vous n'avez pas à créer les bibliothèques de support avec Make, Make install ou ./configure.De plus, le processus prend quelques minutes pour terminer tout le processus.
  • Vous pouvez maintenant poursuivre l'installation de GCC.

CONFIGURATION:

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

Problème:

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-languages tels que c ++ ou c.

--disable-multilib ; désactivez multilib en fonction de votre système et de votre système d'exploitation, vous serez invité à indiquer multilib pour continuer.

La réalisation prendra beaucoup de temps. Cependant, vous pouvez émettre l'option -j #no_pro. Cela exécutera Make simultanément en parallèle en fonction du nombre de processeurs sur votre PC ou Mac.

Pour des informations détaillées sur la façon d'exécuter ce processus, vous pouvez visiter: https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
la source
1

J'ai suivi la réponse la plus acceptée de joelparkerhenderson. C'est la meilleure réponse que j'ai pu trouver pour l'installation sur un système * NIX via Internet.

Pour la postérité, je veux ajouter que si vous obtenez une erreur du type "erreur d'installation: impossible de calculer le suffixe des fichiers objet: impossible de compiler"

puis mettez à jour votre LD_LIBRBARY_PATH avec / tmp / gcc / lib (voir la réponse complète de joelparkerhenderson pour le contexte)

/ tmp / gcc / lib contient tous les fichiers mpfr / mpc / gmp requis et l'éditeur de liens d'exécution ne peut pas les trouver à moins que vous ne les ajoutiez à LD_LIBRARY_PATH. N'oubliez pas non plus d'exporter LD_LIBRARY_PATH;). Plus de contexte ici: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
la source
Devoir mettre à jour votre LD_LIBRARY_PATH juste pour utiliser le compilateur est stupide. Si vous utilisez plutôt stackoverflow.com/a/10662297/981959, cela n'est pas nécessaire.
Jonathan Wakely