2012-01-11 14 views
10

Tôi đang sử dụng GNU để xây dựng một nhóm các thư viện tĩnh, bằng cách sử dụng các quy tắc ngầm để làm như vậy. Các quy tắc này chạy lệnh ar (1) để cập nhật thư viện/lưu trữ. Hồ sơ đã chỉ ra rằng thời gian xây dựng sẽ giảm nếu tôi sử dụng tùy chọn -j để thực hiện để chạy các công việc song song trong quá trình xây dựng.Làm cách nào để tránh các vấn đề tương tranh khi sử dụng GNU tạo các tệp lưu trữ song song?

Thật không may, GNU làm thủ công có một phần http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html rằng khá nhiều nói rằng làm không cung cấp bảo vệ đồng thời để chạy ar (1), và do đó nó có thể (và không) tham nhũng kho lưu trữ. Hướng dẫn tiếp tục trêu chọc rằng điều này có thể được khắc phục trong tương lai.

Một giải pháp cho việc này là sử dụng http://code.google.com/p/ipcmd, về cơ bản thực hiện khóa semaphore trước khi chạy lệnh, do đó tuần tự hóa các lệnh ar (1) tạo lưu trữ. Giải pháp đặc biệt này không tốt cho tôi vì tôi đang xây dựng với các công cụ biên dịch chéo dựa trên mingw trên Windows.

Có giải pháp đơn giản hay tốt hơn cho vấn đề này không?

Trả lời

2

Làm lưu trữ một bước duy nhất, chứ không phải là cố gắng cập nhật các kho lưu trữ từng bước:

libfoo.a: $(OBJS) 
     -rm -f [email protected] 
     $(AR) rc [email protected] $^ 
     $(RANLIB) [email protected] 
+1

Tôi nghĩ rằng bạn cần phải chạy kho lưu trữ, chứ không phải objs. Có thể bạn cũng có thể sử dụng $^cho các tệp đối tượng trong các quy tắc. – user1143888

2

Hãy thử như sau -

AR := flock make.lock $(AR) 

clean:: 
    rm -f make.lock 

Bây giờ ar (1) sẽ thực hiện với một khóa độc quyền vào tập tin make.lock, do đó tuần tự truy cập vào thư viện.

Bạn có thể thêm lệnh để xóa tệp make.lock sau lệnh ranlib.

Thêm export AR để truyền bá định nghĩa cho phụ, nếu cần.

+0

Sẽ có ý nghĩa khi 'bẻ khóa 'kho lưu trữ đang được xây dựng? Hay 'bầy đàn' cấm truy cập theo những cách khác? –

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