2009-10-09 36 views
17

Trong makefile của tôi, tôi có một biến với một danh sách các thư mục, như thế này:yếu tố Gia nhập một danh sách trong GNU Make

DIRS = /usr /usr/share/ /lib 

Bây giờ, tôi cần phải tạo ra biến PATH từ nó, mà về cơ bản là giống nhau , nhưng sử dụng dấu chấm phẩy làm dấu phân cách:

PATH = /usr:/usr/share/:/lib 

Làm cách nào để làm điều đó? Ý tôi là, làm thế nào để tôi tham gia các phần tử của danh sách DIRS với dấu chấm phẩy, thay vì dấu cách?

+0

+1 Tôi có câu hỏi tương tự CHÍNH XÁC ... bạn nghĩ điều này sẽ dễ dàng. –

Trả lời

30

Bạn có thể sử dụng lệnh $(subst), kết hợp với một mẹo nhỏ để có được một biến mà có một giá trị của một không gian duy nhất:

p = /usr /usr/share /lib 
noop= 
space = $(noop) $(noop) 

all: 
     @echo $(subst $(space),:,$(p)) 

Hy vọng rằng sẽ giúp,

Eric Melski

+0

Wow, hoạt động như một sự quyến rũ, cảm ơn rất nhiều! Đã đấu tranh với nó trong nhiều giờ! –

+1

Bạn cũng có thể sử dụng '$ (eval)' thay vì '$ (noop)' ở đó, do đó loại bỏ sự cần thiết phải xác định noop. –

+2

+1 để tìm kiếm ma thuật đen như vậy. –

8

Biểu mẫu Sạch nhất (mà tôi có thể tìm thấy):

classpathify = $(subst $(eval) ,:,$(wildcard $1)) 
cp = a b c d/*.jar 

target: 
    echo $(call classpathify,$(cp)) 
# prints a:b:c:d/1.jar:d/2.jar 

Ghi chú:

  • Biến nó thành một hàm giả làm cho ý định rõ ràng hơn là thực hiện một loạt các thao tác chuỗi phức tạp.
  • Tôi đã bao gồm hàm $ (ký tự đại diện) vì bạn hầu như luôn sử dụng hai hàm này cùng nhau khi chỉ định đường dẫn lớp
  • Đảm bảo không đặt thêm bất kỳ dấu cách nào sau dấu phẩy hoặc bạn sẽ nhận được thông báo như ":: a: b : c: d: e ".
+0

Một điều tôi muốn thêm: Bây giờ java hỗ trợ cú pháp "-cp lib/*", bạn có thể tránh làm $ (wildcard $ 1), có lẽ là một điều tốt để làm như xu hướng cho các dự án Java sử dụng tấn JAR có thể dẫn đến trường hợp bạn vượt quá giới hạn độ dài trên một số nền tảng nhất định. –

+1

Dạng thức chung hơn: joinwith = $ (subst $ (eval), $ 1, $ 2) $ (gọi joinwith, -o, $ (list_of_files_separated_by_spaces)) –

Các vấn đề liên quan