在 GNU Make 中定义顺序而不强加依赖

Define order without imposing dependency in GNU Make

我想要假 clean 目标总是在 build 目标之前执行,但没有别的(比如 build 目标不会触发 clean)。

我知道不依赖 GNU Make 语言的解决方案:

make clean
make build
.PHONY: install
install:
    $(MAKE) clean
    $(MAKE) build

以上“变通办法”是非通用的。我要记住不要运行make clean build!

我的问题是关于GNU Make 语言的表达能力是否可以在不强加依赖的情况下定义顺序

其他构建系统有可选的依赖声明服从顺序,比如 Gradle 的 mustRunAfter.

实际上有一种方法可以做你想做的事,但请注意我上面关于深度优先顺序的警告。

你的问题不是很清楚,但我想你想说的是,如果用户在命令行上同时要求 cleanbuild,请确保 cleanbuild.

之前首先执行

您可以这样做:

build: $(filter clean,$(MAKECMDGOALS))

这将导致 build 依赖于 clean IFF clean 被指定为要构建的命令行目标之一。

但是请注意我上面的评论:如果您在启用并行性的情况下调用 make,这将是不够的,因为它不会意识到所有目标文件等。还必须等待 clean 完成。为了使其真正万无一失,您必须将此先决条件添加到 EVERY 目标。

I have to remember not to run make clean build!

您可以测试 MAKECMDGOALS 变量是否存在 cleanbuild,如果它们都存在则抛出错误:

ifeq (clean, $(filter clean, $(MAKECMDGOALS)))
  ifeq (build, $(filter build, $(MAKECMDGOALS)))
    $(error Cannot have clean and build goals at the same time)
  endif  
endif