2011-02-03 4 views
7

Đây là từ một kịch bản bash tôi đã sử dụng để xây dựng một chương trình:c makefile với các lệnh shell và các biến

dateString=$(date +%Y/%m/%d\ %H:%M:%S) 
revision=(`svn info | grep Revision | tr -d [:alpha:]':'`) 
echo "#define VERSION_DATE \"$dateString\""  > version.h 
echo "#define VERSION_REVISION \"$revision\"" >> version.h 

tôi đã thay đổi từ việc sử dụng build.sh đến một makefile:

version.h: 
    dateString=$$(date +%Y/%m/%d\ %H:%M:%S) 
    revision=(`svn info | grep Revision | tr -d [:alpha:]':'`) 
    echo "#define VERSION_DATE \"$dateString\"" > version.h.tmp 
    echo "#define VERSION_REVISION \"$revision\"" >> version.h.tmp 
    mv version.h.tmp version.h 

Nhưng tệp version.h kết thúc như sau:

#define VERSION_DATE "\ateString" 
#define VERSION_REVISION "\evision" 

Tôi không thể nhận được các biến trình bao chính xác. Tôi nghĩ rằng nó bởi vì họ cuối cùng là Makefile vars. Nếu có ai biết làm thế nào để làm điều đó, tôi sẽ không biết làm thế nào. Cảm ơn nhiều.

Trả lời

9

Hãy nhớ rằng mọi lệnh được chạy trong trình bao riêng của nó, do đó, dateString và sửa đổi sẽ không được đặt trong lệnh thứ ba và thứ tư.

Vì vậy, bạn sử dụng dấu chấm phẩy và dấu gạch chéo ngược ở cuối mỗi dòng để tạo thành một lệnh. Ngoài ra, bạn cần phải sử dụng $$ để tham khảo $ shell.

Hoặc không sử dụng biến trung gian, khi đó bạn sẽ không cần nó là một lệnh. Một cái gì đó như thế này:

version.h: 
    echo \#define VERSION_DATE \"$$(date +%Y/%m/%d\ %H:%M:%S)\" > version.h.tmp 
    echo \#define VERSION_REVISION \"$$(svn info | grep Revision | tr -d [:alpha:]:)\" >> version.h.tmp 
    mv version.h.tmp version.h 
+0

Tuyệt vời, đã thực hiện công việc, cảm ơn bạn. Cảm ơn Paul cũng vì câu trả lời. –

+0

Lưu ý rằng phiên bản này của tập lệnh không phải là "quốc tế". Trong tiếng Pháp chẳng hạn, bạn nên grep cho "Révision" (chú ý giọng). – Gui13

+0

Nếu bạn có 'svnversion' thực thi, bạn có thể thay thế trực tiếp thông tin' svn dài 'của bạn | grep ... 'bởi nó. Nó cung cấp cho bạn bản sửa đổi trực tiếp. – Gui13