..
  Copyright (C)  2023  Jeremie Salvi.
  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.3
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
  A copy of the license is included in the section entitled "GNU
  Free Documentation License".

Installation de l'environnement sous ArchLinux
==============================================

Introduction
------------

Tout d'abord je tiens à vous rassurer, cela doit fonctionner sur la majorité des distributions.
Je vais utiliser vscodium (fork de visual studio code sans la télémétrie microsoft), 
un framework basé sur electron, donc compatible multi OS et multi distributions.
L'emulateur basé sur QEMU sera compilé à la main, donc ça devrait passer sur n'importe quel linux 😊.

.. warning:: Je suis passé en root pour ne pas m'encombrer avec ``sudo``, pensez y si nécessaire

Pour plus d'infos en général, allez faire un tour sur `La documentation officielle de l'esp 32 <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/>`_

Installation de vscodium
------------------------

Vscodium n'est pas disponible dans les paquets officiels ArchLinux, il faut donc aller sur les ArchLinux User Repositories (AUR.)

`Dépot AUR des binaires vscodium <https://aur.archlinux.org/packages/vscodium-bin>`_

.. code-block:: bash
  :linenos:
  :caption: installation de vscodium

  cd /opt
  git clone https://aur.archlinux.org/vscodium-bin.git
  cd vscodium-bin/
  makepkg
  pacman -U vscodium-bin-1.72.2.22289-1-x86_64.pkg.tar.zst

.. warning:: Si vous êtes en root pour programmer, il faut utiliser les arguments suivants pour
  lancer vscodium : ``codium --no-sandbox --user-data-dir ~/.config/vscodium``

Pour le confort de développement, nous allons installer une extension pour améliorer
l'autocompletion en C/C++. Elle n'est pas disponible sur le marketplace vscodium, il faut l'installer
manuellement. On la télécharge `ici <https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools>`_.

On l'installe depuis le menu des extensions comme ci dessous.

.. image:: ../images/esp32/ms_cpp_extension.png
  :width: 400

Nous allons aussi utiliser l'extension native debug pour l'intégration du debugeur.
Elle se trouve dans le store. Pour l'utilistation, on verra ça dans la partie
`création d'un environnement vscodium </esp32/vscode_integration.html#configurer-le-debugeur>`_.

.. image:: ../images/esp32/native_debug_extension.png
  :width: 400

Installation des prérequis pour l'esp-idf (Espressif IoT Development Framework)
-------------------------------------------------------------------------------

La commande est directement fournie dans la documentation, il suffit de la copier coller :

.. code-block:: bash

  pacman -S --needed gcc git make flex bison gperf python cmake ninja dfu-util ccache libusb

Installation et configuration de l'esp-idf
------------------------------------------

Dans un premier temps, on récupère les dépots :

.. code-block:: bash
  :linenos:

  mkdir -p /opt/esp
  cd /opt/esp
  git clone --recursive https://github.com/espressif/esp-idf.git

Il faut ensuite installer les outils. Par defaut ils sont installés dans ``$HOME/.espressif``.
On peut changer cet emplacement grâce à la variable d'environnement ``IDF_TOOLS_PATH``.

.. code-block:: bash
  :linenos:

  export IDF_TOOLS_PATH=/opt/esp/esp-idf/.espressif
  cd esp-idf
  ./install.sh esp32

L'environnement utilise un paquets d'outils, il est dur de mémoriser tout
les chemins et les variables d'environnement. Heureusement on nous fournit aussi un sctipt
qui rend tout ça accessible depuis la console. Pour ça il faut le charger :

.. code-block:: bash

  . /opt/esp/esp-idf/export.sh

Comme il faut l'appeller dans chaque nouveau terminal, on 
se créer un alias pour faciliter l'accès :

.. code-block:: bash

  alias esp_idf_import=". /opt/esp/esp-idf/export.sh"

On colle cette ligne dans notre .bashrc ou notre .profile. Pour vérifier qu'on 
a bien tout importé, on tappe la commande env, et on devrait avoir les infos
suivantes : 

.. code-block:: bash
  :linenos:
  
  env
  >> ESP_IDF_VERSION="5.1"
  >> ESP_ROM_ELF_DIR="/opt/esp/esp-idf/.espressif/tools/esp-rom-elfs/20220823/"
  >> IDF_DEACTIVATE_FILE_PATH="/tmp/tmpxj9n6nndidf_46523"
  >> IDF_PATH="/opt/esp/esp-idf"
  >> IDF_PYTHON_ENV_PATH="/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env"
  >> IDF_TOOLS_EXPORT_CMD="/opt/esp/esp-idf/export.sh"
  >> IDF_TOOLS_INSTALL_CMD="/opt/esp/esp-idf/install.sh"
  >> IDF_TOOLS_PATH="/opt/esp/esp-idf/.espressif"
  >> OPENOCD_SCRIPTS="/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/share/openocd/scripts"
  >> PATH="/opt/esp/esp-idf/components/esptool_py/esptool:/opt/esp/esp-idf/components/espcoredump:/opt/esp/esp-idf/components/partition_table:/opt/esp/esp-idf/components/app_update:/opt/esp/esp-idf/.espressif/tools/xtensa-esp-elf-gdb/12.1_20221002/xtensa-esp-elf-gdb/bin:/opt/esp/esp-idf/.espressif/tools/xtensa-esp32-elf/esp-2022r1-11.2.0/xtensa-esp32-elf/bin:/opt/esp/esp-idf/.espressif/tools/esp32ulp-elf/2.35_20220830/esp32ulp-elf/bin:/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/bin:/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env/bin:/opt/esp/esp-idf/tools:/usr/local/sbin:/usr/local/bin:/usr/bin"

Si l'on à pas les chemins ``/opt/esp/esp-idf`` dans le path et les variables d'environnement ``IDF_``, les outils fournis
dans l'ESP-IDF ne fonctionneront tout simplement pas.

Compilation de qemu-system-xtensa patché pour les esp32
-------------------------------------------------------

Espressif, l'entreprise qui concoit les ESP32, nous fournit un fork de QEMU modifié pour emmuler celui ci.
On le trouve à l'addresse suivante : `GitHub du fork QEMU <https://github.com/espressif/qemu>`_.
Toute la procédure est expliquée ici : `Wiki du dépot <https://github.com/espressif/qemu>`_.

Je ne vais pas tout réexpliquer ici, ce qu'il faut savoir c'est que nous ne voulons pas 
recompiler tout qemu, juste le binaire qemu-system-xtensa modifié pour esp32. Je vais donc
refaire la compilation en désactivant un maximum de fonctionnalités inutiles. On trouve la 
liste des fonctionnalités dans le fichier ``configure`` du dépot.

.. code-block:: bash
  :linenos:
  :caption: compilation de QEMU pour esp32

  #!/bin/bash
  cd /opt
  git clone https://github.com/espressif/qemu.git
  cd qemu
  ./configure --target-list=xtensa-softmmu \
    --enable-gcrypt \
    --enable-debug --enable-sanitizers \
    --disable-strip --disable-user \
    --disable-capstone --disable-vnc \
    --disable-sdl --disable-gtk \
    --disable-opengl --disable-vfio-user-server
  ninja -C build







