2010-05-06 29 views
6

Đây là một trong hai tầm thường hoặc chạy ngược với triết lý về cách sử dụng nên được sử dụng, nhưng tôi muốn có một dòng lệnh đọc là "make debug" thay vì "make DEBUG = 1 ". Tôi đã thử tạo ra một mục tiêu giả gọi là debug mà không làm gì ngoại trừ thiết lập biến DEBUG, nhưng sau đó có một sự khác biệt giữa "make debug build" và "make debug" - cụ thể là trong một trường hợp, biến đã được thiết lập sau khi build đã xảy ra.sử dụng các mục tiêu makefile để thiết lập các tùy chọn xây dựng

Có cách nào để ưu tiên các mục tiêu nhất định không?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

3

Bạn cũng có thể làm điều đó bằng cách nhìn vào MAKECMDGOALS biến

ifneq "$(findstring debug, $(MAKECMDGOALS))" "" 
DEBUG = 1 
endif 

build: 
    @echo build and DEBUG is [$(DEBUG)] 

debug: 

Đây là những gì sẽ xảy ra khi bạn gọi nó là:

$ make build 
build and DEBUG is [] 
$ make build debug 
build and DEBUG is [1] 
make: Nothing to be done for `debug'. 
$ make debug build 
make: Nothing to be done for `debug'. 
build and DEBUG is [1] 
0

Nếu debug của bạn sẽ chỉ được sử dụng với việc xây dựng mục tiêu, bạn cũng có thể thực hiện cuộc gọi debug xây dựng, do đó bạn có thể chỉ cần gõ make debug hay make build, nơi make build sẽ không gỡ lỗi.

Nhưng đối với câu hỏi thực tế của bạn, tôi không đủ quen thuộc với makefiles để trả lời câu hỏi đó.

1

bạn có thể viết như sau:

.PHONY: debug 
debug: 
     $(MAKE) -$(MAKEFLAGS) build DEBUG=1 

build: 
     echo makeflags='$(MAKEFLAGS)' debug=${DEBUG} 

này sẽ ít nhất là làm việc với GNU Make, BSD Make và Interix Make. Tôi đã không thử tất cả các triển khai khác.

+0

Tính linh hoạt theo chi phí đánh giá đệ quy của tệp tạo. – dmckee

5

Xem 'Giá trị biến mục tiêu cụ thể' trong this page.

+9

Không có hại gì khi nhắc đến bạn chỉ cần làm 'mục tiêu: DEBUG = 1' cho một mục tiêu so với chỉ anh ta vào tài liệu ... đúng không? – dlamotte

+0

Điều này không giải quyết được vấn đề "tạo bản sửa lỗi xây dựng" không tương đương với "tạo bản dựng lỗi" không? Tính năng đặc biệt này chính xác là những gì tôi đã thử. – leoger

+1

Nhìn lại, tôi có thể thấy nó phù hợp với câu hỏi của bạn như thế nào, nhưng bạn không nói rõ. Đặt mục tiêu là * luôn luôn * ra lệnh, vì vậy tôi nghĩ rằng bạn đang ở trên một nhiệm vụ không thể. – bmargulies

0

Một cách tiếp cận là thiết lập các phụ thuộc và xây dựng các quy tắc trong cả mục tiêu xây dựng và gỡ lỗi, nhưng thêm các tùy chọn gỡ lỗi của bạn vào mục tiêu gỡ lỗi. Một ví dụ đơn giản:

Makefile

program:  program.c 
       gcc -o program program.c 
debug:   program.c 
       gcc -D DEBUG -o program program.c 

Program.c

#include <stdio.h> 
int main(void) { 
#ifdef DEBUG 
    printf("DEBUG on!\n"); 
#endif 
    printf("in the program\n"); 
    return 0; 
} 
1

Một điều bạn có thể làm với gnumake là macro sử dụng mà mở rộng ra quy tắc với foreach dựng sẵn. Một cái gì đó như:

TARGETS := build all foo bar baz 

define DEBUG_TARGET_RULE 
$(1).debug: 
     $$(MAKE) DEBUG=1 $(1) 
debug.$(1): 
     $$(MAKE) DEBUG=1 $(1) 
endef 

$(foreach target,$(TARGETS),$(eval $(call DEBUG_TARGET_RULE,$(target)))) 

này sẽ cho phép bạn gõ make debug.foo hoặc make foo.debug và nó sẽ tự động biến thành make DEBUG=1 foo, và nó làm việc cho bất kỳ mục tiêu mà bạn đặt trong $(TARGETS)

+0

Không chính xác những gì tôi đang tìm kiếm, nhưng cách giải quyết thú vị cũng thể hiện một tính năng hữu ích của việc thực hiện. – leoger

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