2010-09-10 30 views
12

Vì vậy, tôi cần đảm bảo rằng nếu tôi đang biên dịch chéo cho một mục tiêu cụ thể mà một biến trình bao được thiết lập. Nếu biến không được đặt thì hãy thực hiện hiển thị thông báo rồi thoát.Thoát khỏi tệp tạo nếu trạng thái của hai biến shell là một trạng thái nhất định

tôi có các nguyên tắc sau trong Makefile của tôi:

.PHONY: checksource 

all: checksource default 

checksource: 
    $(if $(and $(ifeq ($(CROSS_COMPILE), whatever)), $(ifeq ($(VARIABLE),))), \ 
    ($(shell echo "Error! VARIABLE not defined!") \ 
    $(shell exit 2))) 

Nếu $CROSS_COMPILE được thiết lập để bất cứ điều gì:

$> echo $CROSS_COMPILE 
whatever 
$> 

và $ BIẾN không được định nghĩa:

$> echo $VARIABLE 
$> 

Nó không thoát khỏi thực hiện và mục tiêu mặc định được xây dựng. Được rồi tôi biết rằng tôi chỉ có thể sử dụng lồng nhau ifeq để làm điều này nhưng tôi muốn làm cho nó đẹp (và tìm hiểu thêm một chút về makefiles).

Trả lời

13

Không có điều nào như $(ifeq). Tôi vẫn nghĩ rằng bạn nên làm dấu check ở mục makefile bản thân, chứ không phải là một trong những mục tiêu:

ifeq ($(CROSS_COMPILE),whatever) 
ifeq ($(VARIABLE),) 
$(error Variables not set correctly.) 
endif 
endif 

Và nếu bạn đang đặt trên lồng tránh ifeq:

ifeq ($(or $(subst whatever,,$(CROSS_COMPILE)),$(VARIABLE)),) 
$(error Variables not set correctly.) 
endif 

Nhưng tôi không thấy đó là một sự cải tiến. Nếu bạn muốn làm điều đó trong một mục tiêu, chỉ cần sử dụng vỏ và đừng bận tâm với make chức năng:

checksource: 
    @if [ "$(CROSS_COMPILE)" = whatever -a -z "$(VARIABLE)" ]; then \ 
     echo "Error: Variables not set correctly"; exit 2; \ 
    else true; fi 

tôi vẫn muốn đi với các tùy chọn đầu tiên, bởi vì bạn có thể dừng thực hiện trước khi nó stat là tất cả tên tệp trong Makefile và quyết định bắt đầu thực hiện checksource.

3

Làm điều đó trong thực hiện luôn tốt hơn sử dụng vỏ (cho dù qua $(shell) hoặc công thức). Nếu bạn thực hiện kiểm tra trong một công thức, thì nó có nghĩa là Makefile có thể chứa các mục tiêu khác mà không cần xác nhận cụ thể này.

assert = $(if $(filter whatever,${CROSS_COMPILE}),$(if ${VARIABLE},,$(error Urk! Variable problem))) 

checksource: 
     ${assert}some shell commands... 

P.S. Nếu bạn chạy sản phẩm gốc của mình với --warn-undefined-variables, bạn có thể có một số đầu mối tại sao các macro của bạn không mở rộng chính xác:

$ make -f 1.mak CROSS_COMPILE=whatever --warn-undefined-variables 
1.mak:6: warning: undefined variable `ifeq (whatever, whatever)' 
make: *** No rule to make target `default', needed by `all'. Stop. 
Các vấn đề liên quan