2013-10-26 19 views
5

Làm cách nào để sử dụng $(MAKEFLAGS) (hoặc một cách khác để truyền các biến được xác định trên dòng lệnh để tạo con) theo cách hỗ trợ gọi từ shell với cả make VAR=valmake -args?

Tôi cần các cấu hình con của mình có thể định cấu hình, nhưng tôi ghét các autotools, vì vậy tôi đang sử dụng các biến thực hiện cho điều này, ví dụ: gọi từ shell:

$ make USE_SSE3=1 

USE_SSE3 cần áp dụng cho tất cả các bản dựng trong tất cả các tệp phụ.

The manual khẳng định rằng:

nếu bạn ‘làm -ks’ sau đó MAKEFLAGS được giá trị ‘ks’.

Vì vậy, tôi đang sử dụng -$(MAKEFLAGS) (có tiền tố dấu gạch ngang) trong Makefile của tôi.

Tuy nhiên, mở rộng thành đối số không hợp lệ khi các biến không có cờ được sử dụng. Nếu tôi chạy:

$ make FOO=bar 

thì phụ trang không hợp lệ -FOO=bar. OTOH không có định nghĩa biến tiền tố dấu gạch ngang hoạt động, sau đó là make -s, v.v.

Có cú pháp/biến/hack làm cho việc chuyển các đối số các định nghĩa biến duy nhất hoạt động với các tệp phụ makefiles không?

Di sản $(MKFLAGS) không có vấn đề tiền tố dấu gạch ngang lạ, nhưng nó cũng không bao gồm các định nghĩa biến. Tôi đã cố gắng sửa biến với $(patsubst), nhưng điều đó chỉ làm mọi thứ tồi tệ hơn bằng cách cắt bớt khoảng trắng.

Tôi cần giải pháp tương thích với GNU lỗi thời 3.81 được chuyển bằng Mac OS X Mavericks.


foo: 
    $(MAKE) -C subproject -$(MAKEFLAGS) 

$ make foo -s  # MAKEFLAGS = 's' 
$ make foo BAR=baz # MAKEFLAGS = 'BAR=baz' 
$ make foo -j8  # MAKEFLAGS = ' --job-server=…' 
+0

Điều này dường như làm việc mà không bất kỳ nỗ lực đặc biệt. Hãy thử 'foo: $ (MAKE) bar' và' bar: echo flag là $ (MAKEFLAGS), BAR là $ (BAR) '. – Beta

Trả lời

9

Bạn không nên đặt MAKEFLAGS ở tất cả. Tại sao bạn muốn? Bạn đã không đưa ra bất kỳ lý do gì để làm như vậy.

MAKEFLAGS được dự định, thực sự, là một thực thi nội bộ thông qua các đối số từ cha mẹ thực hiện cho một đứa trẻ thực hiện. Nó không có ý định, nói chung, được sửa đổi bởi một makefile. Về điều duy nhất bạn có thể làm một cách hữu ích là thêm cờ mới.

Nếu bạn chỉ chạy làm đệ quy sử dụng biến $(MAKE) hơn hardcoding make, nó sẽ chỉ làm việc:

recurse: 
     @$(MAKE) all FOO=bar 

hoặc bất cứ điều gì.

+0

Tôi không cần sửa đổi 'MAKEFLAGS', tôi chỉ muốn họ * làm việc *. Ví dụ của bạn mất các biến đã được chuyển đến việc tạo cấp cao nhất. Tôi cần cho phép người dùng thiết lập các biến cấu hình và các makefiles phụ để phản ứng với chúng. – Kornel

+2

Không, không. Tất cả các biến được chuyển đến cấp cao nhất được thông qua, dưới dạng biến dòng lệnh, để tạo phụ - miễn là bạn không gây rối với MAKEFLAGS. Vui lòng hiển thị ví dụ không hoạt động vì mọi người đã sử dụng thành công việc này trong hơn 20 năm. – MadScientist

+0

Ồ, tôi thấy - cờ được chuyển hoàn toàn tới các tệp phụ makefiles. Tôi giả định sai biến phải được sử dụng một cách rõ ràng. – Kornel

0

Để kiểm tra xem -B có mặt trong make cờ tôi làm:

BB_CLOBBER := $(shell echo $(MAKEFLAGS) | grep wB) 
ifeq (,$(BB_CLOBBER)) 
    # also force clobber make if these files are missing 
    BB_CLOBBER := $(shell (test -e $(bb_gen)/minimal/.config && test -e $(bb_gen)/full/.config) || echo "B") 
endif 

bb_prepare: 
ifneq (,$(BB_CLOBBER)) 
    @rm -rf $(bb_gen)/full 
    ... 
Các vấn đề liên quan