In a GNU makefile, I am wondering if it is possible, with an file list input, to make a file list output with new extensions.
In input, I get this list:
FILES_IN=file1.doc file2.xls
And I would like to build this variable in my makefile from FILES_IN variable:
FILES_OUT=file1.docx file2.xlsx
Is it possible ? How ?
It's quite difficult because I have to parse file list, and detect each extension (.doc, .xls) to replace it to correct extension.
A file name may have no extensions. Sometimes it is said to have more than one extension, although terminology varies in this regard, and most authors define extension in a way that doesn't allow more than one in the same file name. More than one extension usually represents nested transformations, such as files. tar.
The variable $@ represents the name of the target and $< represents the first prerequisite required to create the output file.
Substituting extensions in a list of whitespace-separated file names is a common requirement, and there are built-in features for this. If you want to add an x
at the end of every name in the list:
FILES_OUT = $(FILES_IN:=x)
The general form is $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)
. This takes the value of VARIABLE
and replaces OLD_SUFFIX
at the end of each word that ends with this suffix by NEW_SUFFIX
(non-matching words are left unchanged). GNU make calls this feature (which exists in every make implementation) substitution references.
If you just want to change .doc
into .docx
and .xls
into .xlsx
using this feature, you need to use an intermediate variable.
FILES_OUT_1 = $(FILES_IN:.doc=.docx) FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)
You can also use the slightly more general syntax $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX)
. This feature is not unique to GNU make, but it is not as portable as the plain suffix-changing substitution.
There is also a GNU make feature that lets you chain multiple substitutions on the same line: the patsubst
function.
FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With