5.5 Make y los Makefiles
Posiblemente todas las plataformas en que puede correr LilyPond,
contemplan una posibilidad de software llamada make
. Este
programa lee un archivo especial llamado Makefile
que
define las relaciones de dependencia entre los archivos y qué
instrucciones necesitamos dar al sistema operativo para producir
un archivo a partir de otro. Por ejemplo, el archivo de make
detallaría cómo obtener ‘balada.pdf’ y ‘balada.midi’ a
partir de ‘balada.ly’ mediante la ejecución de LilyPond.
Existen ocasiones en las que es buena idea crear un
Makefile
para nuestro proyecto, bien sea por nuestra propia
comodidad o como cortesía para otros que posiblemente tengan
acceso a nuestros archivos fuente. Esto es cierto para proyectos
muy grandes con muchos archivos de inclusión y distintas opciones
de salida (p.ej. partitura completa, particellas, partitura del
director, reducción para piano, etc.), o para proyectos que
requieren instrucciones difíciles para montarlas (como los
proyectos de lilypond-book
). La complejidad y flexibilidad
de los Makefiles varía enormemente según las necesidades y la
habilidad de los autores. El programa GNU Make viene instalado en
las distribuciones de GNU/Linux y en MacOS X, y también existe
para Windows.
Consulte el Manual de GNU Make para ver todos los
detalles sobre el uso de make
, pues lo que sigue a
continuación ofrece solamente una pincelada de todo lo que es
capaz de hacer.
Las instrucciones que definen las reglas en un archivo de make
difieren en función de la plataforma; por ejemplo, las distintas
formas de GNU/Linux y MacOS usan bash
, mientras que Windows
usa cmd
. Observeque en MacOS X, tenemos que configurar el
sistema para que utilice el intérprete de órdenes. A continuación
presentamos algunos makefiles de ejemplo, con versiones tanto para
GNU/Linux/MacOS como para Windows.
El primer ejemplo es para una obra orquestal en cuatro movimientos con la estructura de directorios siguiente:
Sinfonia/ |-- MIDI/ |-- Makefile |-- Notas/ | |-- cello.ily | |-- cifras.ily | |-- trompa.ily | |-- oboe.ily | |-- trioCuerdas.ily | |-- viola.ily | |-- violinUno.ily | `-- violinDos.ily |-- PDF/ |-- Particellas/ | |-- sinfonia-cello.ly | |-- sinfonia-trompa.ly | |-- sinfonia-oboes.ly | |-- sinfonia-viola.ly | |-- sinfonia-violinUno.ly | `-- sinfonia-violinDos.ly |-- Partituras/ | |-- sinfonia.ly | |-- sinfoniaI.ly | |-- sinfoniaII.ly | |-- sinfoniaIII.ly | `-- sinfoniaIV.ly `-- sinfoniaDefs.ily
Los archivos ‘.ly’ de los directorios Partituras
y
Particellas
obtienen las notas de archivos ‘.ily’ que
están en el directorio Notas
:
%%% principio del archivo "sinfonia-cello.ly" \include ../definicionesSinf.ily \include ../Notas/cello.ily
El makefile tendrá los objetivos de partitura
(la pieza
completa en todo su esplendor), movimientos
(partitura
completa de los movimientos individuales) y particellas
(partes individuales para los atriles). También existe un objetivo
archivo
que produce un tarball de los archivos fuente,
adecuado para compartirlo a través de la web o por correo
electrónico. A continuación presentamos el makefile para
GNU/Linux o MacOS X. Se debe guardar con el nombre exacto
Makefile
el el directorio superior del proyecto:
Nota: Cuando se define un objetivo o una regla de patrón, las líneas siguientes deben comenzar con tabuladores, no con espacios.
# nombre principal de los archivos de salida nombre = sinfonia # determinar cuántos procesadores existen CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//` # La instrucción para ejecutar lilypond LILY_CMD = lilypond -ddelete-intermediate-files \ -dno-point-and-click -djob-count=$(CPU_CORES) # Los sufijos utilizados en este Makefile. .SUFFIXES: .ly .ily .pdf .midi # Los archivos de entrada y salida se buscan dentro de los directorios relacionados en # la variable VPATH. Todos esllos son subdirectorios del directorio # en curso (dado por la variable de GNU make `CURDIR'). VPATH = \ $(CURDIR)/Partituras \ $(CURDIR)/PDF \ $(CURDIR)/Particellas \ $(CURDIR)/Notas # La regla de patrón para crear archivos PDF y MIDI a partir de un archivo de entrada LY. # Los archivos de salida .pdf se colocan en el subdirectorio `PDF', y los archivos # .midi van al subdirectorio `MIDI'. %.pdf %.midi: %.ly $(LILY_CMD) $<; \ # esta línea comienza con un salto de tabulación if test -f "$*.pdf"; then \ mv "$*.pdf" PDF/; \ fi; \ if test -f "$*.midi"; then \ mv "$*.midi" MIDI/; \ fi notas = \ cello.ily \ trompa.ily \ oboe.ily \ viola.ily \ violinUno.ily \ violinDos.ily # Dependencias de los movimientos. $(nombre)I.pdf: $(nombre)I.ly $(notas) $(nombre)II.pdf: $(nombre)II.ly $(notas) $(nombre)III.pdf: $(nombre)III.ly $(notas) $(nombre)IV.pdf: $(nombre)IV.ly $(notas) # Dependencias de la partitura completa. $(nombre).pdf: $(nombre).ly $(notas) # Dependencias de las particellas. $(nombre)-cello.pdf: $(nombre)-cello.ly cello.ily $(nombre)-trompa.pdf: $(nombre)-trompa.ly trompa.ily $(nombre)-oboes.pdf: $(nombre)-oboes.ly oboe.ily $(nombre)-viola.pdf: $(nombre)-viola.ly viola.ily $(nombre)-violinUno.pdf: $(nombre)-violinUno.ly violinUno.ily $(nombre)-violinDos.pdf: $(nombre)-violinDos.ly violinDos.ily # Teclee `make partitura' para generer la partitura completa de los cuatro # movimientos como un archivo único. .PHONY: partitura partitura: $(nombre).pdf # Teclee `make particellas' para generar todas las particellas. # Teclee `make fulanito.pdf' para generar la particella del instrumento `fulanito'. # Ejemplo: `make sinfonia-cello.pdf'. .PHONY: particellas particellas: $(nombre)-cello.pdf \ $(nombre)-violinUno.pdf \ $(nombre)-violinDos.pdf \ $(nombre)-viola.pdf \ $(nombre)-oboes.pdf \ $(nombre)-trompa.pdf # Teclee `make movimientos' para generar los archivos de los # cuatro movimientos de forma separada. .PHONY: movimientos movimientos: $(nombre)I.pdf \ $(nombre)II.pdf \ $(nombre)III.pdf \ $(nombre)IV.pdf all: partitura particellas movimientos archivo: tar -cvvf stamitz.tar \ # esta línea comienza con un salto de tabulación --exclude=*pdf --exclude=*~ \ --exclude=*midi --exclude=*.tar \ ../Stamitz/*
Existen ciertas complicaciones en la plataforma Windows. Después
de descargar e instalar el programa GNU Make para Windows, debemos
configurar la ruta adecuada en las variables de entorno del
sistema de forma que el shell del DOS pueda encontrar el programa
Make. Para hacerlo, pulse con el botón derecho sobre "Mi PC",
elija Propiedades
y Avanzadas
. Pulse sobre
Variables de entorno
, y luego en la pestaña Variables
del sistema
, seleccione Ruta
, pulse sobre editar
y
añada la ruta al archivo ejecutable de GNU Make, con lo que
quedará algo parecido a lo siguiente:
C:\Archivos de programa\GnuWin32\bin
El makefile en sí debe modificarse para que maneje distintas
instrucciones del shell y para que pueda tratar con los espacios
que aparecen en el nombre de algunos directorios del sistema
predeterminados. El objetivo archivo
se elimina porque
Windows no tiene la instrucción tar
, y Windows tiene
también una extensión predeterminada distinta para los archivos
MIDI.
## VERSIÓN PARA WINDOWS ## nombre = sinfonia LILY_CMD = lilypond -ddelete-intermediate-files \ -dno-point-and-click \ -djob-count=$(NUMBER_OF_PROCESSORS) #obtener el nombre 8.3 de CURDIR (rodeo para los espacios en PATH) workdir = $(shell for /f "tokens=*" %%b in ("$(CURDIR)") \ do @echo %%~sb) .SUFFIXES: .ly .ily .pdf .mid VPATH = \ $(workdir)/Partituras \ $(workdir)/PDF \ $(workdir)/Particellas \ $(workdir)/Notas %.pdf %.mid: %.ly $(LILY_CMD) $< # esta línea comienza con un salto de tabulación if exist "$*.pdf" move /Y "$*.pdf" PDF/ # comienzo con tab if exist "$*.mid" move /Y "$*.mid" MIDI/ # comienzo con tab notas = \ cello.ily \ cifras.ily \ trompa.ily \ oboe.ily \ trioCuerdas.ily \ viola.ily \ violinUno.ily \ violinDos.ily $(nombre)I.pdf: $(nombre)I.ly $(notas) $(nombre)II.pdf: $(nombre)II.ly $(notas) $(nombre)III.pdf: $(nombre)III.ly $(notas) $(nombre)IV.pdf: $(nombre)IV.ly $(notas) $(nombre).pdf: $(nombre).ly $(notas) $(nombre)-cello.pdf: $(nombre)-cello.ly cello.ily $(nombre)-trompa.pdf: $(nombre)-trompa.ly trompa.ily $(nombre)-oboes.pdf: $(nombre)-oboes.ly oboe.ily $(nombre)-viola.pdf: $(nombre)-viola.ly viola.ily $(nombre)-violinUno.pdf: $(nombre)-violinUno.ly violinUno.ily $(nombre)-violinDos.pdf: $(nombre)-violinDos.ly violinDos.ily .PHONY: partitura partitura: $(nombre).pdf .PHONY: particellas particellas: $(nombre)-cello.pdf \ $(nombre)-violinUno.pdf \ $(nombre)-violinDos.pdf \ $(nombre)-viola.pdf \ $(nombre)-oboes.pdf \ $(nombre)-trompa.pdf .PHONY: movimientos movimientos: $(nombre)I.pdf \ $(nombre)II.pdf \ $(nombre)III.pdf \ $(nombre)IV.pdf all: partitura particellas movimientos
El Makefile siguiente es para un documento de
lilypond-book
hecho en LaTeX. Este proyecto tiene un
índice, que requiere ejecutar la instrucción latex
dos
veces para actualizar los enlaces. Todos los archivos de salida
se almacenan en el directorio salida
para los documentos
.pdf y en el directorio salidahtml
para la salida en
formato html.
SHELL=/bin/sh NOMBRE=miproyecto DIR_SALIDA=salida DIR_WEB=salidahtml VISOR=acroread NAVEGADOR=firefox LILYBOOK_PDF=lilypond-book --output=$(DIR_SALIDA) --pdf $(NOMBRE).lytex LILYBOOK_HTML=lilypond-book --output=$(DIR_WEB) $(NOMBRE).lytex PDF=cd $(DIR_SALIDA) && pdflatex $(NOMBRE) HTML=cd $(DIR_WEB) && latex2html $(NOMBRE) INDICE=cd $(DIR_SALIDA) && makeindex $(NOMBRE) VISTA_PREVIA=$(VISOR) $(DIR_SALIDA)/$(NOMBRE).pdf & all: pdf web guardar pdf: $(LILYBOOK_PDF) # comienza con un tab $(PDF) # comienza con un tab $(INDICE) # comienza con un tab $(PDF) # comienza con un tab $(VISTA_PREVIA) # comienza con un tab web: $(LILYBOOK_HTML) # comienza con un tab $(HTML) # comienza con un tab cp -R $(DIR_WEB)/$(NOMBRE)/ ./ # comienza con un tab $(NAVEGADOR) $(NOMBRE)/$(NOMBRE).html & # comienza con un tab guardar: pdf cp $(DIR_SALIDA)/$(NOMBRE).pdf $(NOMBRE).pdf # comienza con un tab clean: rm -rf $(DIR_SALIDA) # comienza con un tab web-clean: rm -rf $(DIR_WEB) # comienza con un tab archivo: tar -cvvf miproyecto.tar \ # comienza con un tab --exclude=salida/* \ --exclude=salidahtml/* \ --exclude=miproyecto/* \ --exclude=*midi \ --exclude=*pdf \ --exclude=*~ \ ../MiProyecto/*
HACER: conseguir que funcione en Windows
El makefile anterior no funciona en Windows. Una alternativa para
los usuarios de Windows sería crear un archivo de lotes sencillo
que contenga las instrucciones de montaje. Esto no rastrea las
dependencias en la manera en que lo hace un makefile, pero al
menos reduce el proceso de construcción a una sola instrucción.
Guarde el código siguiente como montaje.bat
o
montaje.cmd
. El archivo de lotes se puede ejecutar en
la línea de órdenes del DOS o simplemente haciendo doble click
sobre su icono.
lilypond-book --output=salida --pdf miproyecto.lytex cd salida pdflatex miproyecto makeindex miproyecto pdflatex miproyecto cd .. copy salida\miproyecto.pdf MiProyecto.pdf
Véase también
Manual de utilización del programa: Utilización desde la línea de órdenes, lilypond-book