2011-01-17 19 views
41

Trong tệp makefile của tôi, tôi muốn kiểm tra sự tồn tại của thư viện và cung cấp thông báo lỗi thông tin. Tôi tạo ra một điều kiện cần thoát khỏi quá trình làm khi tập tin không được tìm thấy:GNU làm cho sản lượng "lệnh bắt đầu trước mục tiêu đầu tiên" lỗi

9: ifeq ($(${JSONLIBPATH}),) 
10: JSONLIBPATH = ${ALTJSONLIBDIR}/${LIBJSON} 
11: endif 
12: ifeq ($(${JSONLIBPATH}),) 
13: $(error JSON library is not found. Please install libjson before building) 
14: endif 

makefile của tôi bị mắc kẹt trên đường dây 13:

Makefile:13: *** commands commence before first target. Stop. 

Sau dòng 13, makefile của tôi có mục tiêu của nó.

Tôi đã thử đặt khối điều kiện này vào mục tiêu (ví dụ: mục tiêu được gọi là isJSONLibraryInstalled) nhưng điều này không thực thi đúng.

Làm cách nào để kiểm tra sự tồn tại của tệp và xử lý trường hợp lỗi trước khi xử lý mục tiêu? Xin lỗi nếu đây là một câu hỏi ngớ ngẩn.

Trả lời

62

Trước hết, bạn đang xem nội dung của một biến được đặt tên theo đường dẫn hiện tại, có lẽ không phải là những gì bạn muốn. Tham chiếu biến môi trường đơn giản là $ (name) hoặc $ {name}, không phải $ ($ {name}). Do đó, dòng 13 luôn được đánh giá.

Thứ hai, tôi nghĩ rằng đó là nghẹt thở trên thụt lề của biểu thức $ (lỗi ...). Trong khi biểu thức giải quyết thành một chuỗi rỗng, vẫn còn một ký tự tab ở đầu dòng, cho biết một lệnh, mà lần lượt không thể tồn tại bên ngoài một quy tắc.

Tôi nghĩ rằng việc sử dụng dấu cách thay vì các tab thụt lề sẽ hoạt động.

+9

Mạnh hơn: Tôi đã sử dụng tab này lâu rồi. lỗi mục tiêu đầu tiên'. Bạn đã lưu trong ngày. Rất cám ơn ... :) – NeonGlow

+0

Cảm ơn bạn đã tiết kiệm thời gian ... –

+2

Quan sát tuyệt vời .. tab ở nơi bị cấm :) –

1

Đối với tôi đó là khoảng trắng không cần thiết trước khi trình kết nối gây ra lỗi này. Trên slickEdit Tôi đã chọn tùy chọn để xem tất cả các nhân vật đặc biệt và nhận thấy những con cừu đen.

+0

Đóng, đó là ký tự tab không cần thiết trước '$ (lỗi ...' thay thế gây ra lỗi Xóa hoặc thay thế nó bằng dấu cách sẽ làm cho lỗi biến mất. –

3

Khi bạn nhận được Hãy thông báo lỗi, hãy luôn kiểm tra tài liệu Thông báo lỗi http://www.gnu.org/software/make/manual/make.html#Error-Messages On GNU Make 3,81 (lỗi dường như đã được gỡ bỏ từ các phiên bản mới hơn), nó nói:

Điều này có nghĩa là điều đầu tiên trong makefile có vẻ là một phần của một kịch bản lệnh: nó bắt đầu bằng một ký tự TAB và dường như không phải là một lệnh làm hợp pháp (chẳng hạn như một phép gán biến). Kịch bản lệnh phải luôn được liên kết với một mục tiêu.

Điều làm cho vấn đề trở nên khó hiểu hơn là phần "dường như không phải là lệnh thực hiện pháp lý". Điều đó giải thích tại sao trong:

a := b 
    $(error a) 

lỗi xảy ra tại dòng 2 và không 1: làm đơn giản chấp nhận tuyên bố rằng nó có thể phân tích như việc chuyển nhượng, vì vậy các công việc sau:

a := b 
a: 
    echo $a 

Lưu ý: SO hiện chuyển đổi các tab thành không gian trong mã của bạn, vì vậy bạn không thể chỉ sao chép mã trên vào trình soạn thảo của mình: https://meta.stackexchange.com/questions/143632/tabs-converted-to-spaces

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