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)))
O simplemente 'FILES_OUT: = $ (patsubst%,% x, $ (FILES_IN))' si la regla realmente puede hacerse así de genérica. – tripleee
@Gilles ¡Gracias por esta útil respuesta! – TheFrancisOne
¿Cuál es el nombre de este operador? Quiero consultar los manuales, pero no puedo encontrar el nombre correcto. – rkioji