LilyPond: manual d'utilització del programa: 5.5 Make i els Makefiles

## 5.5 Make i els Makefiles

Possiblement totes les plataformes on pot executar-se el LilyPond contemplen una possibilitat de programari anomenada `make`. Aquest programa llegeix un fitxer especial anomenat `Makefile` que defineix les relacions de dependència entre els fitxers i quines instruccions necessitem donar al sistema operatiu per produir un fitxer a partir d’un altre. Per exemple, el fitxer de make detallaria com obtenir ‘`balada.pdf`’ i ‘`balada.midi`’ a partir de ‘`balada.ly`’ mitjançant l’execució del LilyPond.

Hi ha ocasions en les quals és una bona idea crear un `Makefile` per al nostre projecte, bé sigui per la nostra pròpia comoditat o com a cortesia per a altres que possiblement tinguin accés als nostres fitxers font. Això és cert per a projectes molt grans amb molts fitxers d’inclusió i diferents opcions de sortida (per exemple partitura completa, particel·les, partitura del director, reducció per a piano, etc.), o per a projectes que requereixen ordres difícils per muntar-los (com els projectes de `lilypond-book`). La complexitat i flexibilitat dels Mekfiles varia enormement segons les necessitats i l’habilitat dels autors. El programa GNU Make ve instal·lat a les distribucions del GNU/Linux i al MacOS X, i també existeix per al Windows.

Consulteu el Manual de GNU Make per veure tots els detalls sobre l’ús de `make`, atès que el segueix a continuació ofereix sols una pinzellada de tot els és capaç de fer.

Les instruccions que defineixen les regles a un fitxer de make difereixen en funció de la plataforma; per exemple, les diferents formes del GNU/Linux i del MacOS usen `bash`, mentre que el Windows usa `cmd`. Observeu que al MacOS C, hem de configurar el sistema perquè faci servir l’interpret d’ordres. A continuació presentem alguns makefiles d’exemple, amb versions tant per al GNU/Linux/MacOS com per al Windows.

El primer exemple és per a una obra orquestral en quatre moviments amb l’estructura de directoris següent:

>     Sinfonia/
>     |-- MIDI/
>     |-- Makefile
>     |-- Notes/
>     |   |-- cello.ily
>     |   |-- xifres.ily
>     |   |-- trompa.ily
>     |   |-- oboe.ily
>     |   |-- trioCordes.ily
>     |   |-- viola.ily
>     |   |-- violiU.ily
>     |   `-- violiDos.ily
>     |-- PDF/
>     |-- Particelles/
>     |   |-- sinfonia-cello.ly
>     |   |-- sinfonia-trompa.ly
>     |   |-- sinfonia-oboes.ly
>     |   |-- sinfonia-viola.ly
>     |   |-- sinfonia-violiU.ly
>     |   `-- sinfonia-violiDos.ly
>     |-- Partitures/
>     |   |-- sinfonia.ly
>     |   |-- sinfoniaI.ly
>     |   |-- sinfoniaII.ly
>     |   |-- sinfoniaIII.ly
>     |   `-- sinfoniaIV.ly
>     `-- sinfoniaDefs.ily

Els fitxers ‘`.ly`’ dels directoris `Partitures` i `Particelles` obtenen les notes de fitxers ‘`.ily`’ que estan al directori `Notes`:

>     %%% principi del fitxer "sinfonia-cello.ly"
>     \include ../definicionsSinf.ily
>     \include ../Notes/cello.ily

El makefile tindrà els objectius de `partitura` (la peça completa en tot el seu esplendor), `moviments` (partitura completa dels moviments individuals) i `particel·les` (parts individuals per als faristols). També hi ha un objectiu `fitxer` que produeix un fitxer tar de distribució (tarball) dels fitxers font, adequat per compartir-lo a través de la web o per correu electrònic. A continuació presentem el makefile per a GNU/Linux o MacOS C. S’ha de desar amb el nom exacte `Makefile` al directori superior del projecte:

Nota: Quan es defineix un objectiu o una regla de patró, les línies següents han de començar amb tabuladors, no amb espais.

>     # nom principal dels fitxers de sortida
>     nom = sinfonia
>     # determinació del nombre de processadors
>     CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//`
>     # L'ordre per executar el LilyPond
>     LILY_CMD = lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click -djob-count=$(CPU_CORES)

>     # Els sufixos utilitzats a aquest Makefile.
>     .SUFFIXES: .ly .ily .pdf .midi

>     # Els fitxers d'entrada i de sortida es busquen dins dels directoris relacionats a
>     # la variable VPATH.  Tots ells són subdirectoris del directori
>     # en curs (donat per la variable de GNU make `CURDIR').
>     VPATH = \
>       $(CURDIR)/Partitures \
>       $(CURDIR)/PDF \
>       $(CURDIR)/Particelles \
>       $(CURDIR)/Notes

>     # La regla de patró per crear fitxers PDF i MIDI a partir fitxers d'entrada LY
>     # Els fitxers de sortida .pdf es col·loquen al subdirectori `PDF', i els fitxers
>     # .midi van al subdirectori `MIDI'.
>     %.pdf %.midi: %.ly
>             $(LILY_CMD) $<; \           # Aquesta línia comença amb un salt de tabulació
>             if test -f "$*.pdf"; then \
>                 mv "$*.pdf" PDF/; \
>             fi; \
>             if test -f "$*.midi"; then \
>                 mv "$*.midi" MIDI/; \
>             fi

>     notes = \
>       cello.ily \
>       trompa.ily \
>       oboe.ily \
>       viola.ily \
>       violiU.ily \
>       violiDos.ily

>     # Dependències dels moviments
>     $(nom)I.pdf: $(nom)I.ly $(notes)
>     $(nom)II.pdf: $(nom)II.ly $(notes)
>     $(nom)III.pdf: $(nom)III.ly $(notes)
>     $(nom)IV.pdf: $(nom)IV.ly $(notes)

>     # Dependències de la partitura completa.
>     $(nom).pdf: $(nom).ly $(notes)

>     # Dependències de les particel·les.
>     $(nom)-cello.pdf: $(nom)-cello.ly cello.ily
>     $(nom)-trompa.pdf: $(nom)-trompa.ly trompa.ily
>     $(nom)-oboes.pdf: $(nom)-oboes.ly oboe.ily
>     $(nom)-viola.pdf: $(nom)-viola.ly viola.ily
>     $(nom)-violiU.pdf: $(nom)-violiU.ly violiU.ily
>     $(nom)-violiDos.pdf: $(nom)-violiDos.ly violiDos.ily

>     # Teclegeu `make partitura' per generar la partitura completa dels quatre
>     # moviments com un fitxer únic.
>     .PHONY: partitura
>     partitura: $(nom).pdf

>     # Teclegeu `make particelles' per generar totes les particel·les
>     # Teclegeu `make pepet.pdf' per generar la particel·la de
>     # l'instrument `pepet'.

>     # Exemple: `make sinfonia-cello.pdf'.
>     .PHONY: particellas
>     particellas: $(nom)-cello.pdf \
>            $(nom)-violinUno.pdf \
>            $(nom)-violinDos.pdf \
>            $(nom)-viola.pdf \
>            $(nom)-oboes.pdf \
>            $(nom)-trompa.pdf

>     # Teclegeu `make moviments' per generar els fitxers dels
>     # quatre moviments de forma separada.
>     .PHONY: moviments
>     moviments: $(nom)I.pdf \
>                $(nom)II.pdf \
>                $(nom)III.pdf \
>                $(nom)IV.pdf

>     all: partitura particelles moviments

>     fitxer:
>             tar -cvvf stamitz.tar \       # aquesta línia comença amb un salt de tabulació
>             --exclude=*pdf --exclude=*~ \
>             --exclude=*midi --exclude=*.tar \
>             ../Stamitz/*

A la plataforma Windows hi ha certes complicacions. Després de descarregar i instal·lar el programa GNU Make per al Windows, haurem de configurar la ruta adequada a las variables d’entorn del sistema de que l’intèrpret d’ordres del DOS pugui trobar el programa Make. Per fer-lo, polseu amb el botó dret sobre "El meu ordinador", escolliu `Propietats` i `Avançades`. Polseu sobre `Variables d'entorn`, i després a la pestanya `Variables del sistema`, seleccioneu `Ruta`, polseu sobre `edita` i afegiu la ruta al fitxer executable de GNU Make, amb la qual cosa quedarà quelcom semblant al següent:

>     C:\Fitxers de programa\GnuWin32\bin

El makefile en si s’ha de modificar perquè gestioni diverses instruccions de l’intèrpret d’ordres i perquè pugui tractar amb els espais que apareixen al nom d’alguns directoris del sistema predeterminats. L’objectiu `fitxer` s’elimina perquè el Windows no té l’ordre `tar`, i el Windows a més té una extensió predeterminada diferent per als fitxers MIDI.

>     ## VERSIÓ PER AL WINDOWS
>     ##
>     nom = sinfonia
>     LILY_CMD = lilypond -ddelete-intermediate-files \
>                         -dno-point-and-click \
>                         -djob-count=$(NUMBER_OF_PROCESSORS)

>     #obtenció del nom 8.3 de CURDIR (truc per als espais a PATH)
>     workdir = $(shell for /f "tokens=*" %%b in ("$(CURDIR)") \
>               do @echo %%~sb)

>     .SUFFIXES: .ly .ily .pdf .mid

>     VPATH = \
>       $(workdir)/Partitures \
>       $(workdir)/PDF \
>       $(workdir)/Particelles \
>       $(workdir)/Notes

>     %.pdf %.mid: %.ly
>             $(LILY_CMD) $<      # aquesta línia comença amb un salt de tabulació
>             if exist "$*.pdf"  move /Y "$*.pdf"  PDF/ # començament amb tab
>             if exist "$*.mid" move /Y "$*.mid" MIDI/  # començament amb tab

>     notes = \
>       cello.ily \
>       xifres.ily \
>       trompa.ily \
>       oboe.ily \
>       trioCordes.ily \
>       viola.ily \
>       violiU.ily \
>       violiDos.ily

>     $(nom)I.pdf: $(nom)I.ly $(notes)
>     $(nom)II.pdf: $(nom)II.ly $(notes)
>     $(nom)III.pdf: $(nom)III.ly $(notes)
>     $(nom)IV.pdf: $(nom)IV.ly $(notes)

>     $(nom).pdf: $(nom).ly $(notes)

>     $(nom)-cello.pdf: $(nom)-cello.ly cello.ily
>     $(nom)-trompa.pdf: $(nom)-trompa.ly trompa.ily
>     $(nom)-oboes.pdf: $(nom)-oboes.ly oboe.ily
>     $(nom)-viola.pdf: $(nom)-viola.ly viola.ily
>     $(nom)-violiU.pdf: $(nom)-violiU.ly violiU.ily
>     $(nom)-violiDos.pdf: $(nom)-violiDos.ly violiDos.ily

>     .PHONY: partitura
>     partitura: $(nom).pdf

>     .PHONY: particelles
>     particelles: $(nom)-cello.pdf \
>            $(nom)-violiU.pdf \
>            $(nom)-violiDos.pdf \
>            $(nom)-viola.pdf \
>            $(nom)-oboes.pdf \
>            $(nom)-trompa.pdf

>     .PHONY: moviments
>     moviments: $(nom)I.pdf \
>                $(nom)II.pdf \
>                $(nom)III.pdf \
>                $(nom)IV.pdf

>     all: partitura particelles moviments

El Makefile següent és per a un document de `lilypond-book` fet en LaTeX. Aquest projecte té un índex, que requereix executar l’ordre `latex` dues vegades per actualitzar els enllaços. Tots els fitxers de sortida s’emmagatzemen al directori `sortida` per als documents .pdf i al directori `sortidahtml` per a la sortida en format html.

>     SHELL=/bin/sh
>     NOM=elmeuprojecte
>     DIR_SORTIDA=sortida
>     DIR_WEB=sortidahtml
>     VISUALITZADOR=acroread
>     NAVEGADOR=firefox
>     LILYBOOK_PDF=lilypond-book --output=$(DIR_SORTIDA) --pdf $(NOM).lytex
>     LILYBOOK_HTML=lilypond-book --output=$(DIR_WEB) $(NOM).lytex
>     PDF=cd $(DIR_SORTIDA) && pdflatex $(NOM)
>     HTML=cd $(DIR_WEB) && latex2html $(NOM)
>     INDEX=cd $(DIR_SORTIDA) && makeindex $(NOM)
>     VISTA_PREVIA=$(VISUALITZADOR) $(DIR_SORTIDA)/$(NOM).pdf &

>     all: pdf web desar

>     pdf:
>             $(LILYBOOK_PDF)  # comença amb un tab
>             $(PDF)           # comença amb un tab
>             $(INDEX)        # comença amb un tab
>             $(PDF)           # comença amb un tab
>             $(VISTA_PREVIA)  # comença amb un tab

>     web:
>             $(LILYBOOK_HTML) # comença amb un tab
>             $(HTML)          # comença amb un tab
>             cp -R $(DIR_WEB)/$(NOM)/ ./  #
>             $(NAVEGADOR) $(NOM)/$(NOM).html &  # comença amb un tab

>     desar: pdf
>             cp $(DIR_SORTIDA)/$(NOM).pdf $(NOM).pdf  # comença amb un tab

>     clean:
>             rm -rf $(DIR_SORTIDA) # comença amb un tab

>     web-clean:
>             rm -rf $(DIR_WEB) # comença amb un tab

>     fitxer:
>             tar -cvvf elmeuprojecte.tar \ # comença amb un tab
>             --exclude=sortida/* \
>             --exclude=sortidahtml/* \
>             --exclude=elmeuprojecte/* \
>             --exclude=*midi \
>             --exclude=*pdf \
>             --exclude=*~ \
>             ../ElMeuProjecte/*

PERFER: aconseguir que funcioni a windows

El makefile anterior no funciona al Windows. Una alternativa per als usuaris del Windows seria crear un fitxer de lots senzill que contingui les ordres de muntatge. Això no segueix les dependències com ho fa un makefile, però almenys redueix el procés de construcció a una sola instrucció. Deseu el codi següent com `muntatge.bat` o `muntatge.cmd`. El fitxer de lots es pot executar en la línia d’ordres del DOS o simplement fent doble clic sobre la seva icona.

>     lilypond-book --output=sortida --pdf elmeuprojecte.lytex
>     cd sortida
>     pdflatex elmeuprojecte
>     makeindex elmeuprojecte
>     pdflatex elmeuprojecte
>     cd ..
>     copy sortida\elmeuprojecte.pdf ElMeuProjecte.pdf

#### Vegeu també

Manual d’utilització del programa: Utilització des de la línia d'ordres, lilypond-book

#### LilyPond — Utilització v2.22.2 (branca estable).