Xóa mục khỏi biến Makefile?


82

Tôi có một tệp makefile, bao gồm một số tệp trang khác, tất cả đều thêm vào một biến như thế này:

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

Bây giờ tôi muốn xóa SomethingElsekhỏi VARbiến. Tôi (...)phải làm gì để làm điều này?

Tôi đang sử dụng GNU Make và một giải pháp cụ thể của GNU Make sẽ ổn.

Câu trả lời:


109

Bạn có thể sử dụng filter-outhàm văn bản nếu đang sử dụng GNU Make.

OTHERVAR := $(filter-out SomethingElse,$(VAR))

Và bạn có chắc chắn tôi phải sử dụng =và không :=?
Bjarke Freund-Hansen

1
Cả hai đều đúng trong ví dụ tôi đưa ra? Nếu tôi sử dụng, =tôi gặp lỗi makefile khi nói điều gì đó về VAR cuối cùng tự giới thiệu chính nó trong một đệ quy vô hạn. ( VAR = $(filter-out SomethingElse,$(VAR)))
Bjarke Freund-Hansen

4
Tóm lại, nguyên nhân của nó phụ thuộc vào cách sử dụng. Nhưng trong ví dụ của tôi, câu trả lời đúng sẽ là: VAR := $(filter-out SomethingElse,$(VAR)) (Có :=và không =). Cảm ơn. :)
Bjarke Freund-Hansen

12
Lưu ý: Cũng có thể được sử dụng trên nhiều mặt hàng. Ví dụ: VAR := $(filter-out A B C,$(VAR)).
tổng kiểm tra

1
Lưu ý cho bất kỳ ai khác đến cùng. filter-outchỉ hoạt động trên các từ được phân cách bằng dấu cách. Nếu bạn cần xóa nội dung nào đó khỏi chuỗi không được phân tách từ, bạn có thể sử dụng substthay thế filter-out. Tức là: $(subst -world,,hello-world)sẽ cho kết quả hello.
Jacob

6

Đầu câu trả lời đúng ở trên:

VAR = bla1 bla2 bla3 bla4 bla5

TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))

all:
    @echo "VAR is: $(VAR)"

Đầu ra:
VAR là: bla1 bla2 bla4 bla5

Lưu ý rằng điều này phá vỡ tất cả "tính đệ quy" khi bộ lọc được thực thi, nhưng điều đó có thể không quan trọng trong trường hợp của bạn.


Đây có phải là hành vi không được mong đợi? Khi bạn xác định VAR bình thường, sau đó bạn đặt ngay TMPVAR, do đó mở rộng VAR tại thời điểm này. Sau đó, bạn đặt lại VAR bình thường để giới thiệu đến phiên bản TMPVAR đã lọc. Và trong tất cả các mục tiêu, bạn sử dụng VAR và do đó mở rộng nó. Tôi không thấy làm thế nào điều này phá vỡ sự tái phạm hoặc trong bất kỳ cách nào là hành vi có vấn đề?
Bjarke Freund-Hansen

1
Tôi có thể đã không rõ ý của tôi. Hãy tưởng tượng có BLA1 = bla1, sau đó VAR = $(BLA1) bla2 bla3 bla4 bla5thay vì định nghĩa VAR ở trên. Việc thực thi BLA1 += bla1111sau bộ lọc sẽ không ảnh hưởng đến giá trị của VAR, vì nó sẽ mất tham chiếu đến giá trị của $ (BLA1).
Andreas Mikael Bank

0

Vì tôi cũng gặp trường hợp tương tự, tôi muốn thêm một câu trả lời mới. Trong trường hợp của tôi, cũng có dấu phẩy trong chuỗi biến và hơn thế nữa, tôi muốn xóa dấu phẩy và từ cuối cùng:

VAR = "bla1, bla2"

Trong trường hợp này, bộ lọc ra không hoạt động (thậm chí không có trong các câu trả lời trước đó, khi không có dấu ngoặc kép)

Giải pháp của tôi là sử dụng subst:

VAR = "bla1, bla2"

TTT = , bla2
TMPVAR := $(VAR)
SUBST = $(subst $(TTT),, $(TMPVAR))
FILT = $(filter-out $(TTT), $(TMPVAR))

subst:
    @echo "subst : $(SUBST)"

filter:
    @echo "filter-out : $(FILT)"
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.