在 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
.
实际上有一种方法可以做你想做的事,但请注意我上面关于深度优先顺序的警告。
你的问题不是很清楚,但我想你想说的是,如果用户在命令行上同时要求 clean
和 build
,请确保 clean
在 build
.
之前首先执行
您可以这样做:
build: $(filter clean,$(MAKECMDGOALS))
这将导致 build
依赖于 clean
IFF clean
被指定为要构建的命令行目标之一。
但是请注意我上面的评论:如果您在启用并行性的情况下调用 make,这将是不够的,因为它不会意识到所有目标文件等。还必须等待 clean
完成。为了使其真正万无一失,您必须将此先决条件添加到 EVERY 目标。
I have to remember not to run make clean build!
您可以测试 MAKECMDGOALS
变量是否存在 clean
和 build
,如果它们都存在则抛出错误:
ifeq (clean, $(filter clean, $(MAKECMDGOALS)))
ifeq (build, $(filter build, $(MAKECMDGOALS)))
$(error Cannot have clean and build goals at the same time)
endif
endif
我想要假 clean
目标总是在 build
目标之前执行,但没有别的(比如 build
目标不会触发 clean
)。
我知道不依赖 GNU Make 语言的解决方案:
- 需要顺序时按顺序启动它们:
make clean
make build
- 将顺序执行编码为所需的配方:
.PHONY: install
install:
$(MAKE) clean
$(MAKE) build
以上“变通办法”是非通用的。我要记住不要运行make clean build
!
我的问题是关于GNU Make 语言的表达能力,是否可以在不强加依赖的情况下定义顺序。
其他构建系统有可选的依赖声明服从顺序,比如 Gradle 的 mustRunAfter
.
实际上有一种方法可以做你想做的事,但请注意我上面关于深度优先顺序的警告。
你的问题不是很清楚,但我想你想说的是,如果用户在命令行上同时要求 clean
和 build
,请确保 clean
在 build
.
您可以这样做:
build: $(filter clean,$(MAKECMDGOALS))
这将导致 build
依赖于 clean
IFF clean
被指定为要构建的命令行目标之一。
但是请注意我上面的评论:如果您在启用并行性的情况下调用 make,这将是不够的,因为它不会意识到所有目标文件等。还必须等待 clean
完成。为了使其真正万无一失,您必须将此先决条件添加到 EVERY 目标。
I have to remember not to run make clean build!
您可以测试 MAKECMDGOALS
变量是否存在 clean
和 build
,如果它们都存在则抛出错误:
ifeq (clean, $(filter clean, $(MAKECMDGOALS)))
ifeq (build, $(filter build, $(MAKECMDGOALS)))
$(error Cannot have clean and build goals at the same time)
endif
endif