ChatGPT解决这个技术问题 Extra ChatGPT

How to change the extension of each file in a list with multiple extensions in GNU make?

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.


G
Gilles 'SO- stop being evil'

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)))

Or just FILES_OUT := $(patsubst %,%x,$(FILES_IN)) if the rule really can be made that generic.
What is the name of this operator? I want check the manuals, but cannot find the proper name.
@rkioji What operator? I give a link to the GNU make manual for $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), what else are you refering to?
@Gilles oh yeah, didn't see the link. I referred to "substitution". Thanks!

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now