Makefile将默认目标更新为指定的最后一个

时间:2015-06-23 06:40:27

标签: makefile

我有一个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?

2 个答案:

答案 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 / releasealways 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