2015-04-22 15 views
5

xem xét như sau:Làm thế nào để bao gồm đường dẫn tiền tố trong GNU Make Mẫu quy tắc

%.foo: %.bar 
    echo $< > [email protected] 

Giả sử chúng ta có một tập tin 1.bar, lệnh thực thi đơn giản echo 1.bar > 1.foo là. Tuy nhiên, khi % chứa đường dẫn, thay vì chỉ là tên tệp, nó bắt đầu trở nên khó tính. Vấn đề của tôi là tôi muốn thêm một đường dẫn khác vào %.bar, hình mẫu trở nên hoàn toàn bị xáo trộn. Ví dụ, khi %.barnice/path/1.bar, điều này trở nên bất khả thi:

%.foo: /project/something/%.bar 
    echo $< > [email protected] 

này sẽ chạy, nhưng nó thực thi echo nice/path//project/something/1.bar > 1.foo thay cho echo /project/something/nice/path1.bar > 1.foo

Lý do cho điều này là trong cách làm không quy mô của nó. Từ tài liệu:

Khi mẫu đích không chứa dấu gạch chéo (và thường thì không), tên thư mục trong tên tệp được xóa khỏi tên tệp trước khi được so sánh với tiền tố và hậu tố đích. [...] Các thư mục được bỏ qua chỉ với mục đích tìm kiếm một quy tắc ngầm để sử dụng, không phải trong việc áp dụng quy tắc đó. Do đó, ‘e% t’ khớp với tên tệp src/eat, với ‘src/a’ làm gốc. Khi điều kiện tiên quyết được chuyển thành tên tệp, các thư mục từ thân cây được thêm ở phía trước, trong khi phần còn lại của thân cây được thay thế cho ‘%’. Gốc ‘src/a’ có mẫu tiền đề ‘c% r’ cung cấp tên tệp là src/car

Có cách nào để tắt quy tắc này cho một quy tắc cụ thể không?

+1

Bạn chỉ cần cố gắng sử dụng tên tập tin để trần trong công thức? Nếu vậy chỉ cần sử dụng '$ (notdir $ <)' hoặc '$ (

+0

Câu hỏi của bạn không làm cho tình hình rõ ràng. Nếu bạn đã viết quy tắc này như một quy tắc rõ ràng, nó sẽ trông như thế nào? Đường dẫn đích mở rộng mà bạn muốn là gì và đường dẫn tiên quyết mở rộng bạn muốn là gì? – MadScientist

+0

Đường dẫn tiên quyết mở rộng phải là '/ project/something/nice/path1.bar'. Nó làm cho 'nice/path // project/something/1.bar'. Tức là, nó chia tách '%' trong một tiền tố ('nice/path') và một gốc (' 1.bar'), sau đó prepends '/ project/something /' vào gốc, và THEN sẽ thêm tiền tố vào đó. Tôi muốn nó ngừng tách '%' trong một tiền tố và gốc. – Gx1sptDTDa

Trả lời

3

Bạn có thể muốn đọc lên trên How Patterns Match:

Khi mô hình mục tiêu không chứa một dấu gạch chéo (và nó thường không), tên thư mục trong tên tập tin được xóa tên tập tin trước khi nó được so sánh với tiền tố và hậu tố đích. Sau khi so sánh tên tệp với mẫu đích, tên thư mục, cùng với dấu gạch chéo kết thúc chúng, được thêm vào tên tệp tiền đề được tạo từ mẫu điều kiện tiên quyết của quy tắc mẫu và tên tệp. Các thư mục được bỏ qua chỉ với mục đích tìm kiếm một quy tắc ngầm để sử dụng, không phải trong việc áp dụng quy tắc đó. Do đó, ‘e% t’ khớp với tên tệp src/eat, với ‘src/a’ làm gốc. Khi điều kiện tiên quyết được chuyển thành tên tệp, các thư mục từ thân cây được thêm ở phía trước, trong khi phần còn lại của thân cây được thay thế cho ‘%’. Gốc ‘src/a’ với mẫu tiền đề ‘c% r’ cung cấp tên tệp là src/car.

Ở trên giải thích lý do tại sao nice/path/ được thêm vào điều kiện tiên quyết /project/something/1.bar.


Một sửa chữa sẽ được sử dụng tên tập tin đầy đủ trong các quy tắc, ví dụ .:

${CURDIR}/nice/path/%.foo: /project/something/%.bar  
+2

Tôi biết * tại sao * nó làm như vậy (vì vậy tại sao tôi trích dẫn chính xác cùng một tài liệu trong câu hỏi), nhưng làm thế nào tôi có thể tắt nó đi? Lý do là trong trường hợp sử dụng thực tế tôi phải sử dụng điều này, là đường dẫn của tôi phụ thuộc vào tên tệp (đó là một cấu trúc thư mục hơi phức tạp). – Gx1sptDTDa

+0

@ Gx1sptDTDa Rất tiếc, đã bỏ lỡ trích dẫn của bạn. Tại sao bạn không thể sử dụng tên tập tin đầy đủ? –

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