2012-08-22 20 views
59

En un archivo make de GNU, me pregunto si es posible, con una entrada en la lista de archivos, hacer una salida de lista de archivos con nuevas extensiones.¿Cómo cambiar la extensión de cada archivo en una lista con múltiples extensiones en GNU make?

En la entrada, me sale esta lista:

FILES_IN=file1.doc file2.xls 

y me gustaría construir esta variable en mi makefile de FILES_IN variables:

FILES_OUT=file1.docx file2.xlsx 

¿Es posible? Cómo ?

Es bastante difícil porque tengo que analizar la lista de archivos y detectar cada extensión (.doc, .xls) para reemplazarla por la extensión correcta.

Respuesta

107

La sustitución de extensiones en una lista de nombres de archivos separados por espacios en blanco es un requisito común, y existen funciones incorporadas para esto. Si desea agregar un x al final de cada nombre en la lista:

FILES_OUT = $(FILES_IN:=x) 

La forma general es $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Esto toma el valor de VARIABLE y reemplaza OLD_SUFFIX al final de cada palabra que termina con este sufijo por NEW_SUFFIX (las palabras que no coinciden se dejan sin cambios). GNU realiza llamadas a esta función (que existe en todas las implementaciones de make) substitution references.

Si lo que desea es cambiar .doc en .docx y .xls en .xlsx uso de esta función, es necesario utilizar una variable intermedia.

FILES_OUT_1 = $(FILES_IN:.doc=.docx) 
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx) 

También puede utilizar la sintaxis ligeramente más general $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Esta característica no es exclusiva de GNU make, pero no es tan portátil como la sustitución simple de sufijos.

También hay una función de creación de GNU que le permite encadenar múltiples sustituciones en la misma línea: patsubst function.

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN))) 
+2

O simplemente 'FILES_OUT: = $ (patsubst%,% x, $ (FILES_IN))' si la regla realmente puede hacerse así de genérica. – tripleee

+0

@Gilles ¡Gracias por esta útil respuesta! – TheFrancisOne

+0

¿Cuál es el nombre de este operador? Quiero consultar los manuales, pero no puedo encontrar el nombre correcto. – rkioji

Cuestiones relacionadas