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, Execució de lilypond-book


LilyPond: manual d’utilització del programa v2.25.22 (development-branch).