A la découverte de redo

download A la découverte de redo

If you can't read please download the document

Transcript of A la découverte de redo

Diamond_editions

A la dcouverte du systme de build redoThierry GAYEThttp://www.nextinnovation.orgBien que GNU/make soit devenu un standard, redo a t dvelopp comme une alternative devant combler les lacunes de l'outils initial. Nous allons voir comment l'utiliser.1. IntroductionDvelopp en scripts bash et python, redo est un concurrent de plus pour gnu/make bas sur une conception de Daniel J. Bernstein. Une rcriture en langage C est en cours pour le rendre encore plus performant.L'ide de redo a t de rcrire le fonctionnement de make en seulement 250 lignes de script shell. Une version light (partie minimal de redo) mme t ralis en vrifiant les dpendances et ce en seulement 150 lignes de code soit environ 3 kilo-octets.. Le nom redo vient du fait que dans la communaut, 75 version diffrentes de make coexistent sous la mme appellation et aussi pour faire la mme chose. Cela rend donc l'outil plus clair pour l'outil. Cela en fait donc un mini systme de build avec gestion d dpendance qqui peut tre inclus dans les projets eux mme.Il est distribu sous licence LGPLv2.La version minimale tant quant elle donn au domaine public.2. Premier pas avec redoLa thorie derrire redo est presque magique: il peut faire tout ce que make peut faire. Seule la mise en uvre est beaucoup plus simple car la syntaxe est plus propre, et vous pouvez faire encore plus souple choses sans recourir des hacks immonde. Loin des automatismes, des templates offertes soit par autotools, cMake ou autre, redo est vraiment orient comme un systme minimal mains nanmoins fonctionnel.Pour l'exemple, nous allons nous utiliser les code sources suivants. Premirement nous allons avoir besoin d'une fonction d'entre main() qui sera dfinie dans le fichier main.c:#include

#include "extension.h"

int main() { printf(module);

return 0;}Nous aurons galement besoin d'un header extension.h qui dfiniera une dclaration externe au main:extern char *module;Enfin, pour montrer un exemple concret de programmation modulaire, nous allons dfinir un second fichier source extension.c:char *module = "hello, world!\n";Les trois fichiers seront utiliss lors de la compilation.Commenons par regarder la version de redo dont nous disposons:$ redo --version0.11Tout d'abord, pour commencer, crons un fichier default.o.do qui dfiniera le comportement de la cible par dfaut pour l'tape de compilation:redo-ifchange $2.cgcc -MD -MF $2.d -c -o $3 $2.cread DEPS /dev/null); then echo 1>&2 arrt de la gnration de la documentation; merci d'installer doxygen exit 0fidoxygen >doxygen.outSera excut via la commande redo documentation ou make documentation via le wrapper.4.2 ctag.do pour l'indexation du codedeps=$(find -name '*.[ch]')redo-ifchange $deps

if ! (which ctags &>/dev/null); then echo 1>&2 arret de l'indexation; merci d'installer ctags exit 0fictags -f- --exclude="output" --exclude="html" -RSera excut via la commande redo ctag ou make ctags via le wrapper.4.3 install.do pour l'installation des fichiers#!/bin/bashexec >&2redo-ifchange all

INSTALL_DIR=${INSTALL_DIR:-output/generic}mkdir -p $INSTALL_DIR

files_to_copy=" helloworld"cp -au $files_to_copy "$INSTALL_DIR"Sera excut via la commande redo install ou make install via le wrapper.A noter l'uasage de exec >&2 qui est permet de scuriser l'usage de certain scripts en lien avec redo.5. Makefile pour contrler redoComme nous l'avons vu, tout se fait en invoquant le script redo. redo all lorsqu'il est sans argument ou bien redo clean pour nettoyer lenvironnement de dveloppement, ou enfin redo helloworld pour spcifier la gnration d'une target.Pour interconnecter les GNU/make avec redo, un petit makefile est fourni. Il sert juste de passerelle entre les deux systme:all:

Makefile: @

%: FORCE +./redo $@

.PHONY: FORCECela permetta d'invoqu les mme cible pass make pour redo:$ make cleanredo clean redo clean$ make redo all redo allredo helloworldredo main.omain.c: In function main:main.c:7:2: attention : le format n'est pas une chane littrale et pas d'argument de format [-Wformat-security]redo extension.oredo helloworld6. Paramtres utilisable avec redoRedo possde un certain nombre de paramtres que l'on peu utiliser pour dtailler les tapes interne. En gnral, ils ne sont pas utile mais en cas de problme dans la chane de build, cela peut s'avrer trs utile:Nom du paramtre Description

-j n--jobs=nNombre de threads lancer pour paralliser la gnration

-d--debugAffiche des infos de debug au niveau des vrification de dpendance

-v--verboseAffiche toutes les informations lu dans les fichiers de dpendances .d et les fichiers .do

-x--xtraceAffiche les commandes telle qu'elles sont excutes rellement

-k--keep-goingContinue aussi longtemps que possible mme si une cible choue.

--shuffleRend l'ordre du build alatoire pour trouver des bugs de dpendance

--debug-locksAffiche les messages sur les fichiers de vrouillage (utile pour le dbug de redo)

--debug-pidsAffiche le process id (aka PID) dans les traces (utile pour le debug)

--versionAffiche la version courante du script redo et sort

A partir de notre exemple prcdent qui donnait le rsultat suivant, nous allons voir que nous pouvons avoir plus d'information utile:$ redo clean && redo allredo cleanredo allredo helloworldredo main.oredo extension.oEn mode verbose nous obtenons la sortie suivante avec des informations dtailles sur les tapes intermdiaires redo:$ redo clean --verbose ; redo all --verbose

redo clean* sh -ev clean.do clean clean clean.redo2.tmprm -fR *.orm -fR *.drm -fR helloworld

find -depth '(' -name '.do_built*' -o -name '*.did' ')' -exec rm -rf "{}" \;redo clean (done)

redo all* sh -ev all.do all all all.redo2.tmpredo-ifchange helloworld

redo helloworld* sh -ev helloworld.do helloworld helloworld helloworld.redo2.tmpDEPS="main.o extension.o"redo-ifchange $DEPS

redo main.o* sh -ev default.o.do main.o main main.o.redo2.tmpredo-ifchange $2.c

$CC $CPPFLAGS $CFLAGS -MD -MF $2.d -c -o $3 $2.c

read DEPS