2010-06-23 43 views
19

Tôi có một thư mục images/ mà tôi muốn sao chép vào build/images/ từ bên trong một Makefile. Thư mục có thể chứa nhiều cấp độ của thư mục phụ. Điều gì sẽ là cách thanh lịch nhất để làm điều đó? Tôi muốn:Làm thế nào để sao chép một thư mục trong một Makefile?

  • tránh một bản sao thư mục đầy đủ trên mỗi make chạy (tức là không có cp -r)
  • nhất quán đảm bảo (có nghĩa là nếu một tập tin thay đổi trong images/ nó sẽ tự động được cập nhật trong build/images/)
  • tránh để xác định một quy tắc cho mỗi hình ảnh và mỗi thư mục con trong Makefile
  • giải quyết vấn đề trong vòng make, vì vậy không rsync hoặc cp -u nếu có thể

Tôi đang sử dụng GNU, vì vậy công cụ cụ thể của GNU được cho phép.

+1

Hãy xem này: http://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make/2483203#2483203 ('cp' thay vì' convert') Nhưng cá nhân tôi nghĩ việc sử dụng 'rsync' là sạch hơn và mạnh mẽ hơn. –

Trả lời

27

Vâng, tôi chỉ sử dụng rsync. Bất kỳ kịch bản make nào bạn sẽ tạo ra với những ràng buộc này sẽ chỉ sao chép chức năng của nó và hầu hết có thể sẽ chậm hơn và có thể chứa lỗi. Một quy tắc ví dụ có thể nhìn:

build/images: 
    rsync -rupE images build/ 

.PHONY: build/images 

(.PHONY để kích hoạt quy tắc này mọi lúc).

Có thể sử dụng liên kết tượng trưng hoặc liên kết cứng?

build/images: 
    ln -s ../images build/images 

Nếu bạn thực sự muốn tránh rsync và liên kết, mảnh này reimplements họ bằng cách nào đó (không dự thi, cần find, mkdir và đồng bằng cp):

image_files:=$(shell find images -type f) 
build/images/%: images/% 
    mkdir -p $(@D) 
    cp $< [email protected] 

build: $(patsubst %,build/%,image_files) 
+2

Bạn có thể muốn thêm một '--delete' vào lệnh' rsync' để xóa các tệp khi chúng bị xóa khỏi cây nguồn. – bitmusher

+0

rsync bỏ qua '-E' nếu' -p' được sử dụng. –

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