2013-07-12 33 views
6

Tôi đang cố gắng thực hiện câu lệnh make để kiểm tra kiến ​​trúc. Tôi rất chặt chẽ để nhận được nó để làm việc:Lỗi điều kiện Makefile

test: 
     ifeq ("$(shell arch)", "armv7l") 
       echo "This is an arm system" 
     else 
       echo "This is not an arm system." 
     endif 

Tôi có một vấn đề: mặc dù điều này dường như quyết tâm ifeq ("i386", "armv7l") mà phải là sai lầm, tôi nhận được lỗi sau:

$ make 
ifeq ("i386", "armv7l") 
/bin/sh: -c: line 0: syntax error near unexpected token `"i386",' 
/bin/sh: -c: line 0: `ifeq ("i386", "armv7l")' 
make: *** [test] Error 2 

Vì vậy, nó đang phân giải thành hai chuỗi so với nhau, nhưng có lỗi cú pháp. Có gì sai ở đây?

Trả lời

9

Bạn không thể sử dụng các câu lệnh như ifeq bên trong công thức. Công thức nấu ăn (các dòng bắt đầu bằng TAB) được chuyển tới trình bao. Vỏ không hiểu ifeq; đó là một cấu trúc thực hiện.

Bạn sẽ phải sử dụng các câu lệnh if trong một công thức. Và, bạn không phải sử dụng $(shell ...) trong công thức vì bạn đang đã là trong vỏ.

test: 
     if [ `arch` = armv7l ]; then \ 
      echo "This is an arm system"; \ 
     else \ 
      echo "This is not an arm system."; \ 
     fi 

Điều này có thể không phải là cách tốt nhất để xử lý này, nhưng kể từ khi bạn không cung cấp bất kỳ thông tin vào những gì bạn đang thực sự cố gắng để làm với điều này đó là tất cả chúng ta có thể nói.

+0

Làm thế nào rõ ràng hơn nhiều nó có thể được? Tôi chỉ cố gắng kiểm tra kiến ​​trúc và điều kiện làm các câu lệnh. Nhưng cảm ơn bạn đã trả lời. Đã chấp nhận. –

+0

Nếu bạn thực sự chỉ muốn viết một tuyên bố if trong mỗi dòng công thức duy nhất thì tôi đồng ý rõ ràng. Tuy nhiên, phần lớn thời gian, mọi người thực sự muốn làm điều gì đó hơn, như sử dụng các cờ biên dịch khác nhau hoặc các trình biên dịch khác nhau, thêm các tệp nguồn khác nhau, v.v. Có nhiều cách thanh lịch hơn để làm những việc này hơn là thêm nhiều -báo cáo trong tất cả các công thức nấu ăn của bạn. – MadScientist

+0

Nhân cách '==' đồng nghĩa với '=' –

11

Như MadScientist đã nói, make đang chuyển các dòng ifeq vào vỏ, nhưng nếu bạn viết đúng, bạn chắc chắn có thể trộn các cấu trúc như ifeq với các lệnh trong công thức. Bạn chỉ cần hiểu làm thế nào make phân tích một Makefile:

Nếu một dòng bắt đầu với một TAB, nó được coi là một lệnh cho vỏ không phân biệt nơi dòng là bên trong file.

Nếu nó không bắt đầu bằng TAB, make diễn giải nó như là một phần của ngôn ngữ riêng của nó.

Vì vậy, để sửa chữa tập tin của bạn, chỉ cần tránh bắt đầu make điều kiện với một TAB:

test: 
ifeq ("$(shell arch)", "armv7l") 
     echo "This is an arm system" 
else 
     echo "This is not an arm system." 
endif 
+1

Cả hai câu trả lời đều tuyệt vời. Cảm ơn bạn đã giải thích lý do tại sao nó sẽ không hoạt động. Tôi chắc chắn sẽ ghi nhớ điều này! –

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