# [Tutoriel] Installation manuelle de GCC (et du fxSDK)

Parmi les compilateurs C/C++ modernes de premier plan (LLVM, GCC, MSVC...), GCC est le seul à avoir un backend SuperH, ie. capable de générer des add-ins pour les calculatrices CASIO. Dans ce tutoriel, on va voir comment compiler GCC à la main. J'y mentionne également par le symbole :arrow: les étapes supplémentaires nécessaires pour installer le fxSDK tout entier à la main.

Ce tutoriel était initialement utilisé pour toutes les installation de GCC pour la calculatrice, mais il y a maintenant des méthodes automatiques via le dépôt [url=https://gitea.planet-casio.com/Lephenixnoir/sh-elf-gcc]sh-elf-gcc[/url], via [url=https://www.planet-casio.com/Fr/forums/topic16790-1-middlearch-un-depot-communautaire.html]MiddleArch[/url] ou même l'installation complète du fxSDK avec [url=https://www.planet-casio.com/Fr/forums/topic16614-last-giteapc-installer-et-mettre-a-jour-automatiquement-des-projets-gitea.html]GiteaPC[/url]. Le texte ci-dessous est donc destiné à des personnes relativement expérimentées avec le terminal et les processus classiques de compilation, et spécifiquement à ceux qui voudraient tester des configurations inhabituelles. [i]Pour relire l'ancien tutoriel, voir [url=https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/src/commit/8dced6746ce4c4a23ec66b8001da6a0dc9c27e41/Compiler%20sous%20Linux%20avec%20un%20cross-compilateur%20GCC/article.txt]sur la forge Gitea[/url].[/i]

Ce tutoriel est écrit pour Linux mais vous pouvez le suivre sous Windows 10 en utilisant [url=https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux]WSL[/url] qui vous donnera accès à Ubuntu.

[brown][b][u]1. Présentation du processus[/u][/b][/brown]

Dans ce tutoriel, on va compiler plusieurs logiciels. Côté compilateur, d'abord [b]binutils[/b], une suite de programmes qui gère l'assembleur, les fichiers objets, les bibliothèques, et l'édition des liens ; puis [b]GCC[/b], le compilateur C/C++ en lui-même.

Ensuite on va faire un détour par le fxSDK pour installer la bibliothèque mathématique et la bibliothèque standard C qui sont nécessaires pour avoir accès à la totalité du langage C.

On reviendra alors vers GCC, puisqu'une fois la lib standard C installée on peut compiler la bibliothèque standard C++, qui est là aussi nécessaire pour avoir accès à la totalité du langage C++.

Enfin on pourra finir l'installation du fxSDK avec gint et d'autres bibliothèques.

 :arrow: [fxSDK] Commencez par installer le dépôt [url=https://gitea.planet-casio.com/Lephenixnoir/fxsdk]fxsdk[/url], qui fournit la sysroot dans laquelle on va installer le compilateur. C'est un `cmake`/`make` classique.

[brown][b][u]2. Installation des dépendances[u][/b][/brown]

Nos calculatrices utilisent des processeurs de la famille SuperH, on ne peut donc pas utiliser le même compilateur C que quand on programme pour l'ordinateur. On va utiliser un [i]cross-compilateur[/i] qui ne s'appelera pas `gcc` mais `sh-elf-gcc`, attention à ne pas confondre !

Téléchargez la dernière version de binutils ([url=https://ftp.gnu.org/gnu/binutils/]téléchargement ici[/url]) ainsi que la dernière version de GCC ([url=https://ftp.gnu.org/gnu/gcc/]téléchargement ici[/url]). En cas d'erreur insondable, vous pourrez toujours tenter d'autres versions plus tard.

[b]Attention :[/b] Si votre GCC système est en version 12.1 ou 12.2 (tapez `gcc -v` pour le déterminer), vous devez prendre GCC 11.1 pour la calculatrice à cause de [url=https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106609]ce bug de GCC pour x86_64[/url].

Bien sûr GCC est un logiciel complexe avec pas mal de dépendances. Voici de quoi les installer :

[code]# Pour Debian, Ubuntu, Mint, WSL pour Windows, et autres dérivés de Debian :
% sudo apt install libmpfr-dev libmpc-dev libgmp-dev libpng-dev libppl-dev flex g++ git texinfo
# Pour Arch Linux, Manjaro, et autres dérivés de Arch :
% sudo pacman -S mpfr libmpc gmp libpng ppl flex gcc git texinfo[/code]
[list=arrow]
  [li]MPFR : calcul flottant à précision arbitraire[/li]
  [li]MPC : calcul complexe à précision arbitraire[/li]
  [li]GMP : arithmétique entière multi-précision[/li]
  [li]libPNG : manipulations d'images PNG[/li]
  [li]PPL : optimisation polyhédrique (optimisation magique)[/li]
  [li]flex : générateur d'analyseurs lexicaux[/li]
  [li]g++ : compilateur C++ pour votre système[/li]
  [li]git : gestionnaire de versions[/li]
  [li]texinfo : générateur de documentation formatée[/li]
[/list]
[brown][b][u]3. Préparation de l'environnement de compilation[/u][/b][/brown]

Le compilateur et toutes les bibliothèques pour la calculatrice vont être installées dans un même dossier. Si vous utilisez le fxSDK, ce dossier est pré-choisi et la commande `fxsdk path sysroot` vous l'affiche. Sinon vous pouvez aller où vous voulez, mais restez dans votre dossier personnel.

[code]% export PREFIX="$(fxsdk path sysroot)"
# Exemple de dossier hors fxSDK :
# export PREFIX="$HOME/opt/sh-elf-2.39-11.1.0"

% mkdir -p $PREFIX[/code]
Assurez-vous que `$PREFIX/bin` est dans votre PATH. Extrayez le contenu des archives que vous avez téléchargées dans un dossier temporaire, et créez deux répertoires `build-binutils` et `build-gcc`.

[code]% tar -xJf binutils-2.39.tar.xz
% tar -xJf gcc-11.1.0.tar.xz
% mkdir build-binutils build-gcc[/code]
On va ensuite appliquer quelques patchs. On va d'abord toucher un fichier de binutils pour éviter la régénération d'un parser avec bison qui ne marche plus depuis longtemps :

[code]% touch binutils-2.39/intl/plural.c[/code]
Si vous utilisez GCC 11.1 (et sans doute quelques versions d'avant), téléchargez de plus [url=https://gitea.planet-casio.com/Lephenixnoir/sh-elf-gcc/src/branch/master/patches/gcc-11.1.0-libstdc++-v3-skip-dlopen.patch]ce patch[/url] qui désactive des tests de configuration inutilement aggressifs dans la lib C++ et appliquez-le :

[code]% patch -u -N -p0 < gcc-11.1.0-libstdc++-v3-skip-dlopen.patch[/code]
[brown][b][u]4. Compilation de binutils[/u][/b][/brown]

La compilation de binutils est un configure/make classique. Les options qu'on utilise sont :

[list=arrow]
  [li]`--prefix` pour indiquer le dossier d'installation final.[/li]
  [li]`--target="sh3eb-elf"` pour spécifier qu'on veut un cross-compilateur pour SuperH.[/li]
  [li]`--with-multilib-list="m3,m4-nofpu"` indique plus précisément qu'on veut une variante pour SH3 et une pour SH4 sans FPU.[/li]
  [li]`--program-prefix="sh-elf-"` renomme le compilateur de `sh3eb-elf-gcc` à `sh-elf-gcc` vu qu'on a aussi le SH3.[/li]
[/list]
Il n'y a pas beaucoup d'autres options intéressantes, mais vous pouvez les voir toutes avec `configure --help`.

[code]% cd build-binutils
% ../binutils-2.39/configure --prefix="$PREFIX" --target="sh3eb-elf" --with-multilib-list="m3,m4-nofpu" --program-prefix="sh-elf-"[/code]
Une fois que tout est configuré, il n'y a plus qu'à compiler et à installer. Normalement ça va assez vite, comptez quelques minutes.

[code]% make -j4
% make install-strip[/code]
Les exécutables de `binutils` ont dû apparaître dans `$PREFIX/bin` Essayez `sh-elf-ld --version` qui doit vous renvoyer la version de binutils (ici 2.39).

[brown][b][u]5. Compilation de gcc et de libgcc[/u][/b][/brown]

Ensuite c'est pareil mais pour GCC. En plus des options précédentes, on indique :

[list=arrow]
    [li]`--enable-languages="c,c++"` qui spécifie les compilateurs qu'on veut. Si vous voulez expérimenter avec d'autres langages notamment Ada, D, Go ou Fortran, c'est là qu'il faut commencer ![/li]
    [li]`--without-headers` qui indique essentiellement qu'on veut un cross-compilateur.[/li]
    [li]`--enable-clocale="generic"` qui simplifie le module `<locale>` de la lib C++.[/li]
    [li]`--enable-libstdcxx-allocator` qui fait de même avec les allocateurs mémoire.[/li]
    [li]`--disable-threads` qui désactive le threading (qu'on n'a pas).[/li]
    [li]`--disable-libstdcxx-verbose` qui élimine des logs dans la lib C++.[/li]
    [li]`--enable-cxx-flags="-fno-exceptions"` qui désactive les exceptions durant la compilation de la lib C++.[/li]
[/list]
Voyez [url=https://gcc.gnu.org/install/configure.html]le guide de configuration[/url] pour toutes les options utiles.

[code]% cd "$PREFIX/build-gcc"
% ../gcc-11.1.0/configure --prefix="$PREFIX" --target="sh3eb-elf" --with-multilib-list="m3,m4-nofpu" --enable-languages="c,c++" --without-headers --program-prefix="sh-elf-" --enable-clocale="generic" --enable-libstdcxx-allocator --disable-threads --disable-libstdcxx-verbose --enable-cxx-flags="-fno-exceptions[/code]
Cette fois la compilation occupera entre 10 et 30 minutes... ou 5/6 heures sur un vieux Raspberry Pi. :E

[code]% make -j4 all-gcc all-target-libgcc
% make install-strip-gcc install-strip-target-libgcc[/code]
Avec ça vous devez pouvoir taper `sh-elf-gcc -v` et la version et les options de compilation. ^^

 :arrow: [fxSDK] C'est le moment d'installer [url=https://gitea.planet-casio.com/Lephenixnoir/OpenLibm]OpenLibm[/url], avec `make`.
 :arrow: [fxSDK] Installez aussi la lib C, [url=https://gitea.planet-casio.com/Vhex-Kernel-Core/fxlibc/]fxlibc[/url], un autre `cmake`/`make` classique.

[brown][b][u]6. Compilation de libstdc++[/u][/b][/brown]

On peut maintenant revenir dans le dossier de compilation de GCC et compiler des libs plus évoluées, comme la lib C++. Si vous testez d'autres langages (par exemple D) c'est le moment de compiler les libs qui vont avec (libphobos), ou même de compiler libssl, libiberty, etc. selon vos goûts.

[code]% make -j4 all-target-libstdc++-v3
% make install-strip-target-libstdc++-v3[/code]
Et voilà, la toolchain est complète. Si vous manquez d'espace disque vous pouvez supprimez les archives, dossiers de sources, et dossiers de build de binutils et GCC.

 :arrow: [fxSDK] Installez maintenant [url=https://gitea.planet-casio.com/Lephenixnoir/gint]gint[/url], et les autres libs qui vous plaisent (eg. libprof, zlib, etc).

Et voilà, vous avez un compilateur C/C++ complet voire un SDK complet pour programmer des add-ins. ^^
