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.
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++.
: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.
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].
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.
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`.
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 :
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 :
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).
[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.
: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.
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.
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).