Làm thế nào để thay đổi phần mở rộng của mỗi tệp trong danh sách có nhiều phần mở rộng trong GNU thực hiện?


82

Trong makefile GNU, tôi tự hỏi liệu có thể, với đầu vào danh sách tệp, có thể tạo đầu ra danh sách tệp với các phần mở rộng mới hay không.

Trong đầu vào, tôi nhận được danh sách này:

FILES_IN=file1.doc file2.xls

Và tôi muốn tạo biến này trong makefile của mình từ biến FILES_IN :

FILES_OUT=file1.docx file2.xlsx

Có khả thi không? Làm sao ?

Nó khá khó khăn vì tôi phải phân tích cú pháp danh sách tệp và phát hiện từng phần mở rộng (.doc, .xls) để thay thế nó cho đúng phần mở rộng.

Câu trả lời:


141

Thay thế phần mở rộng trong danh sách các tên tệp được phân tách bằng khoảng trắng là một yêu cầu phổ biến và có các tính năng tích hợp cho việc này. Nếu bạn muốn thêm một xvào cuối mỗi tên trong danh sách:

FILES_OUT = $(FILES_IN:=x)

Hình thức chung là $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Điều này nhận giá trị VARIABLEvà thay thế OLD_SUFFIXở cuối mỗi từ kết thúc bằng hậu tố này bằng NEW_SUFFIX(các từ không khớp được giữ nguyên). GNU gọi các tham chiếu thay thế tính năng này (tồn tại trong mọi thực hiện) .

Nếu bạn chỉ muốn thay đổi .docthành .docx.xlsvào .xlsxsử dụng tính năng này, bạn cần phải sử dụng một biến trung gian.

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

Bạn cũng có thể sử dụng cú pháp tổng quát hơn một chút $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Tính năng này không phải là duy nhất đối với GNU make, nhưng nó không phải là tính di động như sự thay thế thay đổi hậu tố đơn giản.

Ngoài ra còn có một tính năng tạo GNU cho phép bạn xâu chuỗi nhiều thay thế trên cùng một dòng: patsubsthàm .

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

3
Hoặc chỉ FILES_OUT := $(patsubst %,%x,$(FILES_IN))khi quy tắc thực sự có thể được thực hiện chung chung.
tripleee

Tên của nhà điều hành này là gì? Tôi muốn kiểm tra hướng dẫn sử dụng, nhưng không thể tìm thấy tên thích hợp.
rph

1
@rkioji Toán tử nào? Tôi cung cấp một liên kết đến sổ tay hướng dẫn tạo GNU $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), bạn còn tham khảo thêm điều gì nữa?
Gilles 'SO- đừng có xấu xa nữa'

@Gilles oh yeah, không thấy liên kết. Tôi đề cập đến "sự thay thế". Cảm ơn!
rph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.