2009-11-12 16 views
20

Selon le gcc build instructions, vous pouvez construire binutils simultanément avec la construction de gcc (ainsi que gmp, mpc, etc).Recette pour compiler binutils & gcc ensemble?

Voici ce que dit cette page:

If you also intend to build binutils (either to upgrade an existing installation or for use in place of the corresponding tools of your OS), unpack the binutils distribution either in the same directory or a separate one. In the latter case, add symbolic links to any components of the binutils you intend to build alongside the compiler (bfd, binutils, gas, gprof, ld, opcodes, ...) to the directory containing the GCC sources.

Likewise the GMP, MPFR and MPC libraries can be automatically built together with GCC. Unpack the GMP, MPFR and/or MPC source distributions in the directory containing the GCC sources and rename their directories to gmp, mpfr and mpc, respectively (or use symbolic links with the same name).

Cela fonctionne bien pour gmp, mpc, mpfr, mais je ne peux pas sembler l'obtenir pour construire tous binutils. Je ne sais pas non plus comment l'obtenir pour construire le nouveau linker en or de binutils. Les versions en question sont gcc-4.4.2 et binutils-2.20.

Une instruction étape par étape serait formidable (pour moi, et pour d'autres qui rencontrent ce problème aussi).

+0

Vous pouvez également regarder comment [Linux From Scratch] (http://www.linuxfromscratch.org/lfs/view/development/index.html) le fait. Il utilise un bootstrap en 2 étapes pour binutils, GCC et glibc (une autre dépendance majeure de GCC). –

Répondre

0

Je construis toujours tout séparément. Une fois que vous avez construit et installé binutils, gcc devrait construire bien aussi longtemps que vous donnez à chaque script configure les mêmes --target et --prefix Options:

binutils:

$ ./configure --target=XYZ --prefix=/abc/def 
$ make all install 

puis ajouter le chemin (si nécessaire):

$ export PATH="$PATH:/abc/def/bin" 

et construire gcc:

$ ./configure --target=XYZ --prefix=/abc/def 
$ make all-gcc install-gcc 

Puis construisez votre libc et le reste de gcc si nécessaire (peut-être un débogueur, aussi!).

+2

Merci, mais ce n'est pas la question que je pose. Je sais comment les construire séparément. Les docs indiquent que vous pouvez les construire en une seule construction. C'est ce que je cherche. – bdbaddog

+1

Pourquoi s'embêter? Si vous pouvez les faire séparément et qu'ils fonctionnent, pourquoi passer par la douleur d'essayer de les mettre ensemble? –

+2

Il n'a pas demandé sur la fidélité de cette stratégie, juste comment le faire. –

3

Ce que vous voulez faire s'appelle un "arbre combiné" ou une construction "in-tree binutils". Vous pouvez trouver la documentation sur la façon de procéder here et there.

+1

Et: https: // gcc.gnu.org/simtest-howto.html –

21

Cela devrait toujours être pris en charge, car il est couramment utilisé pour la construction de compilateurs croisés.

En fait, je viens de faire cela avec gcc 4.6.0 et binutils 2.21 (avec gmp, mpc et mpfr à des versions appropriées), et les suivants semblait fonctionner correctement:

  • Obtenez toutes les des archives de ce que vous allez construire (gcc-4.6.0.tar.bz2, binutils-2.21.tar.bz2 etc) dans un nouveau répertoire, par exemple src
  • Un goudron de tous dans ce répertoire, si vous vous retrouvez avec gcc-4.6.0/binutils-2.21/gmp-5.0.2/ et plus assis à côté de l'autre

    tar jxvf gcc-4.6.0.tar.bz2 
    ... (unpack others here, watch file lists scroll past) 
    
  • cd gcc-4.6.0 et lien symbolique avec le gmp, mpc et répertoires RPPM sans leurs numéros de version dans les liens, e.g:

    ln -s ../gmp-5.0.2 gmp 
    
  • Maintenant symlink tout de la binutils dir qui n'existe pas dans le répertoire gcc, donc tout ce qui existe déjà est prioritaire, mais les outils binutils regarderont être visibles à l'accumulation:

    for file in ../binutils-2.21/* ; do ln -s "${file}" ; done 
    
  • Modifiez un répertoire et créez un répertoire de construction pour compiler tout cela séparément dans les sources (cela a toujours été la méthode recommandée, et il a tendance à être plus fiable que de construire dans le répertoire source):

    cd .. ; mkdir build 
    
  • À ce stade, vous devriez avoir un ensemble de répertoires et des liens qui ressemble à ceci:

    binutils-2.21/ 
    build/ 
    gcc-4.6.0/ 
        gmp -> ../gmp-5.0.2 
        mpc -> ../mpc-0.9 
        mpfr -> ../mpfr-3.0.1 
        bfd -> ../binutils-2.21/bfd 
        binutils -> ../binutils-2.21/binutils 
        gas -> ../binutils-2.21/gas 
        ... (lots more symlinks for binutils here, plus existing gcc stuff) 
    gmp-5.0.2/ 
    mpc-0.9/ 
    mpfr-3.0.1/ 
    
  • Configurer le tout à partir de ce répertoire, avec les options que vous devez passer pour configurer:

    ../gcc-4.6.0/configure --prefix=/foo/bar --enable-languages=c,c++,ada 
    
  • Construire, attendez, installez (vous voudrez probablement utiliser make -j4 ou si ici pour obtenir des builds en parallèle car il va prendre un certain temps):

    make -j4 ; make install 
    

Ajouter la destination à votre chemin si ce n'est pas déjà (et peut-être la lib dir LD_LIBRARY_PATH si cela est en dehors de celles qui sont spécifiées dans /etc/ld.so.conf, comme mentionné dans les messages sur l'installation des bibliothèques pendant l'étape make install), et tout devrait être opérationnel avec cette nouvelle version.

Il est probablement utile de vérifier que vous utilisez cette version installée une fois que vous avez un nouveau shell ouvert, avec:

`which gcc` 

et

`which as` 
bien

..as comme que la version est comme prévu avec:

`gcc --version` 

et

`as --version` 

..as ainsi que (bien sûr) test de la version installée construit avec quelques fines executables exemples simples avant de vous laisser libre sur votre base de code :)

Edit: Les commentaires ci-dessous contiennent certains ensembles de versions qui sont connus pour fonctionner ensemble. Toutes les combinaisons ne fonctionneront pas, donc vous devrez peut-être passer par quelques essais et erreurs pour différentes combinaisons à celles mentionnées!

+2

Une note pour moi et les autres: Faire cela avec gcc 4.7.1 nécessite une version plus ancienne de mpfr que la plus récente. J'ai utilisé mpfr-2.4.2 avec succès, mais rien> 3.0 ne fonctionnait pas pour moi. (Liste de tous les composants: binutils-2.22, gcc-4.7.1, gmp-5.0.5, mpc-1.0, mpfr-2.4.2) –

+2

Une autre remarque: Faire ceci avec gcc 4.7.2, avec binutils-2.22 et contrib/download_prerequisites pour gmp, mpc, mpfr; recette fonctionne, mais gcc ne parvient pas à construire avec -flto, ce qui entraîne: collect2: erreur fatale: ne peut pas trouver 'ld'. Pour rectifier cela, créez un lien symbolique ld -> ld-new dans votre répertoire ... prefix/bin. –

+0

Si vous souhaitez activer les optimisations 'graphite' (voir http://gcc.gnu.org/wiki/Graphite), vous aurez également besoin des bibliothèques ISL et CLooG, et de les relier de la même manière que le d'autres bibliothèques (mpfr, mpc et ainsi de suite). Je vais mettre à jour les instructions pour l'inclure sous peu. –