我有一个makefile,可以编译发布版本或调试版本(分别使用-O3
或-g
。第一个和默认版本是release
所以make
相当于make release
。有时候我make debug
但我习惯于只输入make
,下次我编译它时会重新发布。
有没有一种方法makefile可以记住指定的最后一个目标,如果没有给出参数则默认为make?
这有一个类似的标题,但实际上是一个不同的问题:How does "make" app know default target to build if no target is specified?
答案 0 :(得分:1)
这会将最后一个目标名称写入文件.default_make_target
,然后在没有给出参数时将其用作默认目标。它在输出中显示正确的目标名称,并在其过期时以Nothing to be done for 'target'.
正确退出。
DEFAULT_TARGET=debug
LAST_TARGET_FILE=.default_make_target
LAST_TARGET=$(foreach f, $(wildcard $(LAST_TARGET_FILE)), $(shell cat $(f)))
.PHONY: debug release clean
.DEFAULT_GOAL:= $(or $(LAST_TARGET),$(DEFAULT_TARGET))
debug: CFLAG_OPTS+= -g
debug: CHOSEN_TARGET=debug
debug: real_target
release: CFLAG_OPTS+= -O3
release: CHOSEN_TARGET=release
release: real_target
real_target:
@echo $(CHOSEN_TARGET) > $(LAST_TARGET_FILE)
echo '$(CFLAG_OPTS)' > real_target #just an example
clean:
rm -f real_target
...测试
> make debug
echo '-g' > real_target
> make
make: Nothing to be done for 'debug'.
> make clean
rm -f real_target
> make release
echo '-O3' > real_target
> make
make: Nothing to be done for 'release'.
>
*更新:
以前我有@echo debug > $(LAST_TARGET_FILE)
作为假冒调试规则的主体(同样适用于发布),这意味着debug
/ release
为always out of date。相反,它需要在真实目标的主体中运行,并设置CHOSEN_TARGET
。
现在使用.DEFAULT_GOAL:=
而不是default: $(if...)
会导致在更新时打印正确的目标。例如make: Nothing to be done for 'release'.
答案 1 :(得分:1)
我更喜欢这个:
LAST_TARGET_FILE=.last_target
UPDATE_LAST_TARGET=@echo "LAST_TARGET=$@" >$(LAST_TARGET_FILE)
-include $(LAST_TARGET_FILE)
.PHONY: default
default: $(firstword $(LAST_TARGET) release)
.PHONY: debug
debug:
$(UPDATE_LAST_TARGET)
echo debug
.PHONY: release
release:
$(UPDATE_LAST_TARGET)
echo release