【问题标题】:How do you conditionally call a target based on a target variable (Makefile)?如何根据目标变量(Makefile)有条件地调用目标?
【发布时间】:2013-09-30 22:52:08
【问题描述】:

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

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

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

有没有办法用 Makefiles 做到这一点?我还没有找到任何可以说明这个用例的东西。

我并不是要专门清理任何东西或构建任何东西,这只是我尝试有条件地调用一组目标的一个例子。实际目标可以是其他任何东西。

【问题讨论】:

  • 我不太明白你想要什么。您想在运行make devmake prod 时运行适当的clean 目标吗?但这不只是清理你刚刚通过创造得到的东西吗?或者,你是想说当你运行make clean 时,你想根据你最后运行的那个来运行目标的版本,make devmake prod
  • @MadScientist -- 这只是一个例子 -- 不要陷入特定的干净命令,我写这个只是为了演示我试图对目标做什么。在这种情况下,我只想在 BUILD_ENV 变量设置为 development 时运行 clean 目标,否则只运行 clean_info。 (我只是想要一种方法来根据变量的值调用一组特定的目标。)

标签: makefile conditional target


【解决方案1】:

完全不清楚你所要求的是否真的是你想要的,但这里是:

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 你会得到别的东西。

【讨论】:

  • 也许代码具有误导性——我想要的只是运行一个 dang 条件目标!我尝试执行您上面列出的操作,但没有成功。也许它是我正在运行的 make 版本(osx/homebrew)
  • @qodeninja: [facepalm] 以上内容适用于 GNUMake 3.81,但是是的,如果您运行的是自制的 Make 工具,您可能会得到奇怪的结果。听起来好像只有您可以回答有关您的 make 版本的问题。
  • 谢谢! GNU Make 3.81 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不是为了适销性或特定用途的适用性。这个程序是为 i386-apple-darwin11.3.0 构建的
  • 奇怪的语言结构,all: 正在重新定义all:?为什么是第一个all
  • @PeterKrauss:在这种情况下,第一个all 不是必需的,但它使第一个目标更容易通过肉眼找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多