@: (Tại biểu tượng dấu hai chấm) có nghĩa là gì trong Makefile?


155

Những điều sau đây làm gì trong Makefile?

rule: $(deps)
    @:

Tôi dường như không thể tìm thấy điều này trong hướng dẫn sử dụng.

Câu trả lời:


206

Nó có nghĩa là "không lặp lại lệnh này trên đầu ra." Vì vậy, quy tắc này có nghĩa là "thực thi lệnh shell :và không lặp lại đầu ra.

Tất nhiên lệnh shell :là không có op, vì vậy đây là "không làm gì cả và đừng nói."

Tại sao?

Mẹo ở đây là bạn đã có một sự kết hợp tối nghĩa của hai cú pháp khác nhau. Các làm (1) cú pháp là việc sử dụng của một hành động bắt đầu với @, mà chỉ đơn giản không phải là để hiển thị các lệnh. Vì vậy, một quy tắc như

always:
       @echo this always happens

sẽ không phát ra

   echo this always happens
   this always happens

Bây giờ, phần hành động của một quy tắc có thể là bất kỳ lệnh shell nào , bao gồm :. Bash giúp giải thích điều này cũng như bất cứ nơi nào:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
Đừng vui vẻ với việc đánh máy của tôi, bạn cũng sẽ già đi một ngày nào đó.
Charlie Martin

4
Đây là một giải thích tuyệt vời về những gì nó làm, nhưng bạn có biết tại sao bạn sẽ làm điều này trong một makefile không?
Charles Keepax

8
Không phải sương mù.
Charlie Martin

2
Nó có thể hữu ích trong các tệp tạo tệp gọi rất nhiều chương trình bên ngoài và nơi bạn muốn sử dụng tiếng vang rất nhiều để làm cho nó trông hay, như thế này
mã hóa

1
@ charles-keepax nếu bạn hỏi cụ thể về tham chiếu @:(không chỉ @) thì ngoài câu trả lời của @ guestolio, nó cũng có thể là một sơ khai còn sót lại từ sự phát triển. Nó giống như viết một hàm trong Python chỉ chứa pass. Nó có thể hữu ích cho việc loại bỏ các khối mã để sao chép / dán nhưng chúng thường không tồn tại lâu. Khi khai thác theo cách này, tập tin vẫn sẽ biên dịch, vượt qua linting, v.v.
Boweeb

40

Đối với những người tò mò về lý do tại sao bạn có thể làm điều này, sẽ hữu ích nếu bạn muốn giả vờ như một việc gì đó đã được thực hiện, để Make không xuất ra "Không có gì để làm" cho mục tiêu của bạn.

Một ví dụ là nếu bạn có một mục tiêu giả mạo mà bạn luôn thực hiện và trong đó bạn có một loạt các điều kiện trong lệnh. Bạn muốn có ít nhất một cái gì đó trong trường hợp những điều kiện đó trở thành sai và không có gì được thực hiện.

Ví dụ: (tập lệnh của Linux / Makefile.clean):

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
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.