如何基于目标变量有条件地调用目标(Makefile)?

18

我希望根据是否在makefile中运行make devmake prod来运行不同版本的清理目标。

我并没有编译任何东西,只是想根据一个变量有条件地调用特定的目标或一组目标,例如:

ifeq ($(BUILD_ENV),"development")
clean: -clean
else
clean: -clean-info
endif

#---------------------------------
dev: BUILD_ENV = development
dev: dev-setup which-env

#---------------------------------
prod: BUILD_ENV = production
prod: prod-setup which-env

#---------------------------------


which-env: clean
    @echo -e "$(GREEN)$(BUILD_ENV)!$(CLEAR)"

-clean: -clean-info -clean-logs | silent
    @echo -e "$(GREEN)</CLEAN>$(CLEAR)"

-clean-info:
    @echo -e "$(GREEN)<CLEAN>...$(CLEAR)"

-clean-logs:
    @echo -e " $(GREY)Removing log and status files $(CLEAR)";
    @if [ -d .stat ]; then rm -rf .stat; fi
    @rm -f *.log || true

有没有一种方法可以使用Makefile来实现这个?我还没有找到任何关于这种用例的示例。

我不是要特定地清理什么或构建什么,这只是我试图有条件地调用一组目标的示例。实际目标可以是任何其他内容。


我不太明白你想要什么。你想在运行make devmake prod时运行适当的“clean”目标吗?但这样做不就只是清理你刚刚创建的东西吗?或者,你是想说当你运行make clean时,你想运行基于你上次运行的版本的目标,无论是make dev还是make prod - MadScientist
@MadScientist -- 这只是一个例子 -- 不要被特定的清理命令所困扰,我只是写这个来演示我想用目标来做什么。在这种情况下,只有当BUILD_ENV变量设置为development时,我才想运行clean目标,否则运行clean_info。(我只是想根据变量的值调用一组特定的目标的方法。) - qodeninja
1个回答

25

目前并不清楚您所要求的是否真正符合您的要求,但我会尝试回答:

all:

ifeq ($(BUILD_ENV),development)
all: clean-dev
else
all: clean-other
endif

clean-dev:
    @echo running $@, doing something

clean-other:
    @echo running $@, doing something else

如果你运行make BUILD_ENV=development,你会得到某些东西;如果你运行makemake BUILD_ENV=production,你会得到其他东西。


1
也许代码有误导性——我只想运行一个该死的条件目标!我尝试按照你上面列出的方法做,但不起作用。也许是我正在运行的 make 版本(osx/homebrew)的问题。 - qodeninja
@qodeninja: [扶额] 上述代码适用于GNUMake 3.81,但是如果你在运行自制的Make工具,可能会得到奇怪的结果。听起来唯一能回答关于你的Make版本的问题的人就是你自己。 - Beta
谢谢!GNU Make 3.81 版权所有(C)2006年自由软件基金会。 这是自由软件;请查看源代码以了解复制条件。 没有保证;甚至没有适销性或特定用途的适用性保证。该程序构建于i386-apple-darwin11.3.0。 - qodeninja
1
奇怪的语言结构,“all:”正在重新定义“all:”?为什么要第一个“all”? - Peter Krauss
@PeterKrauss:在这种情况下,第一个“all”不是必需的,但它使得第一个目标更容易被眼睛找到。 - Beta
1
所有者接受了答案,但我们仍然不知道如何有条件地测试目标。 - fde-capu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接