1

Comme je suis arrivé à un résultat qui marche, je vais déjà détailler cette partie... Pour les librairie SDL et autres, on verra plus tard.

Toolchain "Almost From Scratch" pour la GP2X Wiz


advisory-explicit-compilation.png


Pourquoi repartir de zéro

Les outils de compilation existent déjà prêts à l'emploi, et sont téléchargeables à cet endroit

Cependant ce package ne me convient pas pour les raisons suivantes :
— Je veux installer ces outils ailleurs que dans "/opt/openwiz"
— Je veux utiliser les dernières version du compilateur gcc/g++
— J'ai envie de le faire


Les informations de départ

Le toolchain est produit à l'aide de crosstool-ng
http://ymorin.is-a-geek.org/projects/crosstool

"Orkie" a créé un fichier de config pour crosstool-ng et le script automatisant le téléchargement/patchage/compilation des librairies
http://www.gp32x.com/board/index.php?/topic/45760-openwiz-toolchain/

L'archive est là :
http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.2.4.tar.bz2


————————Préparation de l'environnement————————


Outils de compilation

Comme on compile tous nos outils, il va falloir tous les utilitaires nécessaire pour le développement : gcc, binutils, make, byson, flex, awk, cvs, curl, librairie et entêtes ncurse, etc...
Utiliser le gestionnaire de package de votre système si un de ces outils manque.


Variables d'environnement

On disposera de variable d'environnements pour désigner les répertoires d'installation des différents package :
$CTNG_HOME pour le répertoire d'installation de crosstool-ng
$WIZ_HOME pour le répertoire d'installation des outils de développement pour la wiz

Afin que ces variables soient définies et à notre disposition, voici un exemple de script bash à sourcer dans le bashrc. Dans cet exemple, je souhaite installer mes logiciels personnels dans /home/__data__dsporn/software, chaque logiciel disposant de son propre répertoire.

#!/bin/bash
#
# Définition des chemins pour le sdk wiz
#
# temp path base to save typing
SOFT_HOME=/home/__data__dsporn/software
#
CTNG_HOME=${SOFT_HOME}/crosstool_ng ; export CTNG_HOME
WIZ_HOME=${SOFT_HOME}/wiz_sdk ; export WIZ_HOME
#
# Update PATH
export PATH="${CTNG_HOME}/bin:${PATH}"
#
# Create dirs
#
if [[ ! -d $CTNG_HOME ]] ; then
    if mkdir -p $CTNG_HOME ;
        then echo "DONE    Creation of crosstool-ng dir at $CTNG_HOME"
        else echo "FAIL    Creation of crosstool-ng dir at $CTNG_HOME"
    fi
fi
if [[ ! -d $WIZ_HOME ]] ; then
    if mkdir -p $WIZ_HOME ;
        then echo "DONE    Creation of wiz-sdk dir at $WIZ_HOME"
        else echo "FAIL    Creation of wiz-sdk dir at $WIZ_HOME"
    fi
fi



Compilation de crosstool-ng

—Télécharger la dernière version (pour moi, c'était la 1.5)
—Télécharger le kit d'Orkie, et repérer le fichier de configuration destiné à crosstool-ng (crosstool-ng-1.2.4-config-openwiz). À la fin du tutoriel, je met aussi le contenu de mon fichier de config, pour référence.
—Maintenant on lance la configuration/compilation/installation de crosstool-ng à l'aide des commandes qui suivent. Prévoir d'invoquer plusieurs fois le script de configuration, pour peu qu'il manque les outils nécessaires. On suppose que répertoire en cours est celui des sources de crosstool-ng.

./configure --prefix=$CTNG_HOME
make
make install



————————Création des outils de développement à l'aide de crosstool-ng————————



Configuration de crosstool-ng

Afin de pouvoir générer plusieurs version de toolchain, on sauvera la configuration dans un fichier à part, et on créera un lien symbolique vers ce fichier pour fournir cette configuration à crosstool-ng.

—Créer un répertoire de travail pour crosstool-ng. Ce répertoire n'a rien à voir avec le répertoire d'installation de crosstool-ng, ni avec la toolchain à construire.

mkdir -p $HOME/trash/ct-ng
cd $HOME/trash/ct-ng


—Ouvrir les fichiers de configuration d'Orkie ou celui que je donne, pour référence
—Invoquer la configuration de crosstool. À la fin, utiliser l'option "Save an alternate configuration file". Personnellement j'utilise le nom "wiz.config"

ct-ng menuconfig

Quelques points important sur la configuration
- Désactiver l'option qui rend le répertoire d'installation et la toolchain non modifiable
- Concernant le nom du fabriquant ("Tuple vendor string"), j'ai choisi "gp2xwiz", choisissez le votre.
- On utilise la variable d'environnement $WIZ_HOME d'installation prefix=${WIZ_HOME}/ pour le répertoire
- Ma wiz indique utiliser le noyau 2.6.24, mais crosstool ne remonte pas aussi loin dans la liste des noyaux supportés en standard, et je n'ai pas réussi à construire la toolchain en spécifiant une archive contenant les entêtes de cette version du noyau. J'ai donc finalement choisi le dernier noyau disponible, et ça a l'air de fonctionner.
- Pour que la compilation aille jusqu'au bout, il faut désactiver le copro arithmétique (Floating point : software).
- Pour le reste, regarder les fichiers de configuration à votre disposition, et reporter les paramètres qui semblent aller.


—Démarrer la construction de la toolchain
ln -s wiz.config .config
ct-ng build


Au bout d'un certain temps, tous les outils devraient être construit. Archiver le répertoire d'installation de la nouvelle toolchain, pour pouvoir éventuellement la restaurer si besoin.


————————Tester la toolchain————————


Maintenant qu'on a construit nos outils de développement, on va vérifier que ça fonctionne. Voici deux programmes, en C et C++ respectivement, qui ajoutent dans un fichier texte "Salut tout le monde !". Noter l'appel final au launcher de la wiz, ceci afin de ne pas bloquer la console.

hello.c
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    FILE* _log = fopen("hello.txt","at") ;
    fprintf(_log, "Hello tout le monde !\n") ;
    fclose(_log);
    
    // retour au menu.
    // source : http://wiki.gp2x.org/wiki/Source_code_to_a_Demo_Program
    chdir("/usr/gp2x");
    execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);

    return 0;
}



hellocpp.cpp
#include <unistd.h>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char **argv)
{
    ofstream _log("hellocpp.txt", ios_base::out | ios_base::app) ;
    _log << "Hello tout le monde !\n" ;
    _log.close();
    
    // retour au menu.
    // source : http://wiki.gp2x.org/wiki/Source_code_to_a_Demo_Program
    chdir("/usr/gp2x");
    execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);

    return 0;
}



Compilation des programmes

—Invoquer les commandes suivantes pour obtenir les executables :
arm-gp2xwiz-linux-gnu-gcc -o hello.wiz.gpe hello.c
arm-gp2xwiz-linux-gnu-g++ -o hellocpp.wiz.gpe hellocpp.cpp


—Placer ces executable dans un dossier "testtoolchain"

Note
Le résultat de la compilation statique ne semble pas marcher, mais j'ai peut-être oublier quelquechose.

Test

—Insérer dans la console éteinte une carte mémoire ayant suffisamment de place libre
—Allumer la console
—Raccorder la console à l'ordinateur via son cordon USB. Choisir de montrer le contenu de la carte mémoire. Un nouveau périphérique est disponible sur l'ordinateur. Monter ce périphérique si ce n'est pas déjà fait automatiquement.
—Depuis l'ordinateur, copier le dossier "testtoolchain" dans le périphérique qui est apparu.
—Démonter le périphérique, déconnecter la console.
—Dans le menu du launcher, choisir l'option "launcher", puis explorer la carte mémoire pour retrouver le dossier "testtoolchain". Ouvrir le dossier et lancer un des exécutables : on revient au menu principal. Répeter la manipulation deux ou trois fois pour chaque exécutable et tenir le compte des lancement pour chacun.
—Reconnecter la console à l'ordinateur, et retrouver le dossier "testtoolchain" : normalement, on doit trouver deux fichiers texte un pour le programme en C, l'autre pour le programme C++. Quand on ouvre ces fichiers textes, il doit y avoir autant de lignes que le nombre de fois où on a lancé le programme correspondant.


À suivre...



————————Annexe————————



Fichier de configuration pour crosstool-ng v1.5

#
# Automatically generated make config: don't edit
# crosstool-NG version: 1.5.0
# Mon Nov 16 22:45:53 2009
#

#
# Paths and misc options
#

#
# crosstool-NG behavior
#
# CT_OBSOLETE is not set
# CT_EXPERIMENTAL is not set
# CT_DEBUG_CT is not set

#
# Paths
#
CT_LOCAL_TARBALLS_DIR=""
CT_WORK_DIR="${CT_TOP_DIR}/targets"
CT_PREFIX_DIR="${WIZ_HOME}"
CT_INSTALL_DIR="${CT_PREFIX_DIR}"
CT_REMOVE_DOCS=y
# CT_INSTALL_DIR_RO is not set

#
# Downloading
#
# CT_FORBID_DOWNLOAD is not set
# CT_FORCE_DOWNLOAD is not set
# CT_USE_MIRROR is not set
CT_CONNECT_TIMEOUT=10
# CT_ONLY_DOWNLOAD is not set

#
# Extracting
#
# CT_FORCE_EXTRACT is not set
CT_OVERIDE_CONFIG_GUESS_SUB=y
# CT_ONLY_EXTRACT is not set
CT_PATCH_BUNDLED=y
# CT_PATCH_LOCAL is not set
# CT_PATCH_BUNDLED_LOCAL is not set
# CT_PATCH_LOCAL_BUNDLED is not set
# CT_PATCH_BUNDLED_FALLBACK_LOCAL is not set
# CT_PATCH_LOCAL_FALLBACK_BUNDLED is not set
CT_PATCH_ORDER="bundled"
# CT_PATCH_SINGLE is not set
# CT_PATCH_USE_LOCAL is not set

#
# Build behavior
#
CT_PARALLEL_JOBS=4
CT_LOAD=0
CT_NICE=0
CT_USE_PIPES=y
# CT_CONFIG_SHELL_SH is not set
# CT_CONFIG_SHELL_ASH is not set
CT_CONFIG_SHELL_BASH=y
# CT_CONFIG_SHELL_CUSTOM is not set
CT_CONFIG_SHELL="bash"

#
# Logging
#
# CT_LOG_ERROR is not set
# CT_LOG_WARN is not set
CT_LOG_INFO=y
# CT_LOG_EXTRA is not set
# CT_LOG_DEBUG is not set
# CT_LOG_ALL is not set
CT_LOG_LEVEL_MAX="INFO"
# CT_LOG_SEE_TOOLS_WARN is not set
CT_LOG_PROGRESS_BAR=y
CT_LOG_TO_FILE=y
# CT_LOG_FILE_COMPRESS is not set

#
# Target options
#
CT_ARCH="arm"
# CT_ARCH_64 is not set
# CT_ARCH_SUPPORTS_BOTH_MMU is not set
CT_ARCH_SUPPORTS_BOTH_ENDIAN=y
CT_ARCH_SUPPORT_ARCH=y
CT_ARCH_SUPPORT_ABI=y
CT_ARCH_SUPPORT_CPU=y
CT_ARCH_SUPPORT_TUNE=y
CT_ARCH_SUPPORT_FPU=y
# CT_ARCH_DEFAULT_HAS_MMU is not set
# CT_ARCH_DEFAULT_BE is not set
CT_ARCH_DEFAULT_LE=y
CT_ARCH_ARCH="armv5te"
CT_ARCH_ABI=""
CT_ARCH_CPU="arm926ej-s"
CT_ARCH_TUNE="arm926ej-s"
CT_ARCH_FPU=""
# CT_ARCH_BE is not set
CT_ARCH_LE=y
# CT_ARCH_FLOAT_HW is not set
CT_ARCH_FLOAT_SW=y
CT_TARGET_CFLAGS=""
CT_TARGET_LDFLAGS=""

#
# General target options
#
# CT_ARCH_alpha is not set
CT_ARCH_arm=y
# CT_ARCH_avr32 is not set
# CT_ARCH_ia64 is not set
# CT_ARCH_mips is not set
# CT_ARCH_powerpc64 is not set
# CT_ARCH_powerpc is not set
# CT_ARCH_sh is not set
# CT_ARCH_x86_64 is not set
# CT_ARCH_x86 is not set
# CT_ARCH_ARM_EABI is not set
CT_ARCH_ARM_ABI_OK=y
CT_ARCH_USE_MMU=y

#
# Target optimisations
#

#
# Toolchain options
#

#
# General toolchain options
#
CT_USE_SYSROOT=y
CT_SYSROOT_DIR_PREFIX=""

#
# Tuple completion and aliasing
#
CT_TARGET_VENDOR="gp2xwiz"
CT_TARGET_ALIAS_SED_EXPR=""
CT_TARGET_ALIAS=""

#
# Toolchain type
#
# CT_NATIVE is not set
CT_CROSS=y
# CT_CROSS_NATIVE is not set
# CT_CANADIAN is not set
CT_TOOLCHAIN_TYPE="cross"

#
# Build system
#
CT_BUILD=""
CT_BUILD_PREFIX=""
CT_BUILD_SUFFIX=""

#
# Operating System
#
# CT_BARE_METAL is not set
CT_KERNEL_SUPPORTS_SHARED_LIBS=y
CT_KERNEL="linux"
CT_KERNEL_VERSION="2.6.31.1"
# CT_KERNEL_bare_metal is not set
CT_KERNEL_linux=y
CT_KERNEL_LINUX_INSTALL=y
CT_KERNEL_LINUX_INSTALL_CHECK=y
CT_KERNEL_V_2_6_31_1=y
# CT_KERNEL_V_2_6_31 is not set
# CT_KERNEL_V_3_6_30_8 is not set
# CT_KERNEL_V_3_6_30_7 is not set
# CT_KERNEL_V_2_6_30_6 is not set
# CT_KERNEL_V_2_6_30_5 is not set
# CT_KERNEL_V_2_6_30_4 is not set
# CT_KERNEL_V_2_6_30_3 is not set
# CT_KERNEL_V_2_6_30_2 is not set
# CT_KERNEL_V_2_6_30_1 is not set
# CT_KERNEL_V_2_6_30 is not set
# CT_KERNEL_V_2_6_29_6 is not set
# CT_KERNEL_V_2_6_28_10 is not set
# CT_KERNEL_V_2_6_27_35 is not set
# CT_KERNEL_V_2_6_26_8 is not set
# CT_KERNEL_V_2_6_25_20 is not set
# CT_KERNEL_V_2_6_24_7 is not set
# CT_KERNEL_V_2_6_23_17 is not set
# CT_KERNEL_V_2_6_22_19 is not set
# CT_KERNEL_V_2_6_21_7 is not set
# CT_KERNEL_V_2_6_20_21 is not set
# CT_KERNEL_V_2_6_19_7 is not set
# CT_KERNEL_V_2_6_18_8 is not set
# CT_KERNEL_V_select is not set
CT_KERNEL_LINUX_VERBOSITY_0=y
# CT_KERNEL_LINUX_VERBOSITY_1 is not set
# CT_KERNEL_LINUX_VERBOSITY_2 is not set
CT_KERNEL_LINUX_VERBOSE_LEVEL=0
# CT_KERNEL_LINUX_USE_CUSTOM_HEADERS is not set

#
# Common kernel options
#
CT_SHARED_LIBS=y

#
# Binary utilities
#
CT_ARCH_BINFMT_ELF=y
# CT_ARCH_BINFMT_FLAT is not set

#
# GNU binutils
#
CT_BINUTILS_VERSION="2.19.1"
# CT_BINUTILS_V_2_19_51_0_2 is not set
# CT_BINUTILS_V_2_19_51_0_1 is not set
# CT_BINUTILS_V_2_19_50_0_1 is not set
CT_BINUTILS_V_2_19_1=y
# CT_BINUTILS_V_2_19 is not set
# CT_BINUTILS_V_2_18_93 is not set
# CT_BINUTILS_V_2_18_92 is not set
# CT_BINUTILS_V_2_18_91 is not set
# CT_BINUTILS_V_2_18_90 is not set
# CT_BINUTILS_V_2_18_50_0_9 is not set
# CT_BINUTILS_V_2_18_50_0_8 is not set
# CT_BINUTILS_V_2_18_50_0_7 is not set
# CT_BINUTILS_V_2_18_50_0_6 is not set
# CT_BINUTILS_V_2_18_50_0_4 is not set
# CT_BINUTILS_V_2_18 is not set
# CT_BINUTILS_V_2_17 is not set
# CT_BINUTILS_V_2_16_1 is not set
# CT_BINUTILS_V_2_15 is not set
# CT_BINUTILS_V_2_14 is not set
CT_BINUTILS_EXTRA_CONFIG=""
# CT_BINUTILS_FOR_TARGET is not set

#
# C compiler
#
CT_CC="gcc"
CT_CC_VERSION="4.3.4"
CT_CC_gcc=y
# CT_CC_V_4_4_1 is not set
# CT_CC_V_4_4_0 is not set
CT_CC_V_4_3_4=y
# CT_CC_V_4_3_3 is not set
# CT_CC_V_4_3_2 is not set
# CT_CC_V_4_3_1 is not set
# CT_CC_V_4_3_0 is not set
# CT_CC_V_4_2_4 is not set
# CT_CC_V_4_2_3 is not set
# CT_CC_V_4_2_2 is not set
# CT_CC_V_4_2_1 is not set
# CT_CC_V_4_2_0 is not set
# CT_CC_V_4_1_2 is not set
# CT_CC_V_4_1_1 is not set
# CT_CC_V_4_1_0 is not set
# CT_CC_V_4_0_4 is not set
# CT_CC_V_4_0_3 is not set
# CT_CC_V_4_0_2 is not set
# CT_CC_V_4_0_1 is not set
# CT_CC_V_4_0_0 is not set
# CT_CC_V_3_4_6 is not set
# CT_CC_V_3_3_6 is not set
# CT_CC_V_3_2_3 is not set
CT_CC_GCC_4_3_or_later=y
# CT_CC_GCC_4_4_or_later is not set
CT_CC_CXA_ATEXIT=y
CT_CC_SJLJ_EXCEPTIONS_CONFIGURE=y
# CT_CC_SJLJ_EXCEPTIONS_USE is not set
# CT_CC_SJLJ_EXCEPTIONS_DONT_USE is not set
CT_CC_ENABLE_CXX_FLAGS=""
CT_CC_CORE_EXTRA_CONFIG=""
CT_CC_EXTRA_CONFIG=""
CT_CC_PKGVERSION="crosstool-NG-${CT_VERSION}"
CT_CC_BUGURL=""
CT_CC_SUPPORT_CXX=y
CT_CC_SUPPORT_FORTRAN=y
CT_CC_SUPPORT_JAVA=y
CT_CC_SUPPORT_ADA=y
CT_CC_SUPPORT_OBJC=y
CT_CC_SUPPORT_OBJCXX=y

#
# Additional supported languages:
#
CT_CC_LANG_CXX=y
# CT_CC_LANG_FORTRAN is not set
# CT_CC_LANG_JAVA is not set
CT_LIBC="glibc"

#
# C-library
#
CT_LIBC_VERSION="2.9"
# CT_LIBC_eglibc is not set
CT_LIBC_glibc=y
# CT_LIBC_newlib is not set
# CT_LIBC_uClibc is not set
CT_LIBC_V_2_9=y
# CT_LIBC_V_2_8 is not set
# CT_LIBC_V_2_7 is not set
# CT_LIBC_V_2_6_1 is not set
# CT_LIBC_V_2_6 is not set
# CT_LIBC_V_2_5_1 is not set
# CT_LIBC_V_2_5 is not set
# CT_LIBC_V_2_3_6 is not set
CT_LIBC_GLIBC_2_8_or_later=y
# CT_LIBC_GLIBC_TARBALL is not set
CT_LIBC_GLIBC_CVS=y
CT_LIBC_GLIBC_CVS_date=""

#
# glibc/eglibc common options
#
CT_LIBC_GLIBC_EXTRA_CONFIG=""
CT_LIBC_GLIBC_CONFIGPARMS=""
CT_LIBC_GLIBC_EXTRA_CFLAGS=""
CT_LIBC_EXTRA_CC_ARGS=""
CT_LIBC_GLIBC_USE_PORTS=y
CT_LIBC_ADDONS_LIST=""

#
# WARNING!!!
#

#
# For glibc >= 2.8, addons are only available via a CVS checkout.
#

#
# Be sure to review the associated options, above.
#
# CT_LIBC_GLIBC_KERNEL_VERSION_NONE is not set
CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS=y
# CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN is not set
CT_LIBC_GLIBC_MIN_KERNEL="2.6.31.1"

#
# Common C library options
#
CT_LIBC_SUPPORT_NPTL=y
CT_LIBC_SUPPORT_LINUXTHREADS=y
CT_THREADS="nptl"
CT_THREADS_NPTL=y
# CT_THREADS_LINUXTHREADS is not set
# CT_THREADS_NONE is not set

#
# Debug facilities
#
# CT_DEBUG_dmalloc is not set
# CT_DEBUG_duma is not set
CT_DEBUG_gdb=y
# CT_GDB_CROSS is not set
CT_GDB_NATIVE=y
# CT_GDB_NATIVE_STATIC is not set
# CT_GDB_NATIVE_USE_GMP_MPFR is not set
CT_GDB_GDBSERVER=y
CT_GDB_GDBSERVER_STATIC=y
CT_GDB_V_6_8=y
# CT_GDB_V_6_7_1 is not set
# CT_GDB_V_6_7 is not set
# CT_GDB_V_6_6 is not set
# CT_GDB_V_6_5 is not set
# CT_GDB_V_6_4 is not set
# CT_GDB_V_snapshot is not set
CT_GDB_VERSION="6.8"

#
# Native gdb needs a native ncurses library
#
CT_NCURSES_V_5_7=y
# CT_NCURSES_V_5_6 is not set
CT_NCURSES_VERSION="5.7"
# CT_DEBUG_ltrace is not set
# CT_DEBUG_strace is not set

#
# Tools facilities
#
# CT_TOOL_libelf is not set
# CT_TOOL_sstrip is not set

#
# Companion libraries
#
CT_WRAPPER_NEEDED=y
CT_GMP_MPFR=y
CT_GMP_V_4_3_1=y
# CT_GMP_V_4_3_0 is not set
# CT_GMP_V_4_2_4 is not set
# CT_GMP_V_4_2_2 is not set
CT_GMP_VERSION="4.3.1"
CT_MPFR_V_2_4_1=y
# CT_MPFR_V_2_4_0 is not set
# CT_MPFR_V_2_3_2 is not set
# CT_MPFR_V_2_3_1 is not set
CT_MPFR_VERSION="2.4.1"
# CT_PPL_CLOOG_MPC is not set

#
# Companion libraries common options
#
# CT_COMP_LIBS_CHECK is not set
# CT_COMP_LIBS_TARGET is not set
CT_TOOLS_WRAPPER_SCRIPT=y
# CT_TOOLS_WRAPPER_EXEC is not set
CT_TOOLS_WRAPPER="script"

2

Zut, je me suis trompé dans le titre, c'est la version 1.5 de crosstool-ng, et apparemment je ne peux pas changer.

Est-ce qu'un admin peut corriger SVP ? Merci d'avance.

3

4

Merci pour le partage d'informations avec nous. J'ai vraiment aimer et apprécier sur ce tutoriel informative.
bctb107

5