Hàm tệp trong makefile lấy tiền tố bằng ký hiệu '@'


10

Đoạn trích mã này là từ Chương 8.6 của hướng dẫn sử dụng GNU makefile.

@ $ @. In cho chức năng tệp arg trong tệp thực hiện nghĩa là gì? và tại sao các lệnh shell như rm có tiền tố là biểu tượng '@'

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

Cú pháp chức năng tệp là

$(file op filename[,text])
make 

Câu trả lời:


9

Có ba cách sử dụng không liên quan @ở đây.

Trong $@, ký tự @là tên của một biến tự động có thể được sử dụng trong một quy tắc. Giá trị của biến đó là mục tiêu mà quy tắc đang xây dựng.

Khi @được sử dụng ở đầu dòng công thức (lệnh), ngay sau ký tự tab, nó khiến lệnh không được in khi sắp được thực thi.

Các nhân vật @ở nơi khác không phải là đặc biệt.

Vì vậy, trong ví dụ của bạn, để xây dựng program:

  1. Các filechức năng được gọi. Nó ghi các phụ thuộc của mục tiêu ( $^biến tự động) vào tệp program.in.
  2. Bất cứ lệnh nào được lưu trữ trong biến CMDđược thực thi, với các tham số được lưu trong biến CMDFLAGS, cộng với tham số phụ @program.in. Điều này không phụ thuộc vào những gì CMD.

  3. Lệnh rm program.inđược thực thi, mà không in nó trước.

Một vài lệnh xử lý một tham số bắt đầu bằng việc @chỉ ra một tệp để đọc thêm tham số. Đây là một quy ước DOS xuất hiện do DOS có giới hạn nghiêm ngặt về độ dài dòng lệnh và không có cách nào để nội suy đầu ra của lệnh thành một dòng lệnh. Điều này là không phổ biến trong thế giới Unix vì Unix không có những hạn chế này. Do đó, hiệu quả của công thức có thể giống như

$(CMD) $(CMDFLAGS) $(OBJECTS)

2

@ tiền tố trong dòng triệt tiêu tiếng vang của dòng.

Theo mặc định, makein từng dòng Makefiletrước khi nó được thực thi. Khi các dòng bắt đầu bằng @, những dòng đó sẽ không được in.

Không có @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

Với @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Một lưu ý rằng chỉ @khi bắt đầu dòng gây ra tiếng vang . >$@.inhoặc @$@.inchỉ là các chuỗi bình thường và $@trong đó sẽ được mở rộng:

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in

Câu trả lời này không nói, tại sao lại >$@.inđược sử dụng làm chế độ tập tin ... nhưng nó hữu ích theo cách riêng của nó .. cảm ơn cuonglm ...
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.