如何在Makefile中读取bash传入的目标参数?
Makefile获取命令行目标实现条件判断的解决方案
你要的类似C语言argv[]的功能,Make里有内置变量MAKECMDGOALS可以直接用——它会保存你执行make时命令行传入的所有目标列表。比如执行make KU_II,这个变量的值就是KU_II;如果传多个目标,比如make SecChecks KU_II,它的值就是SecChecks KU_II。
修正你的Makefile代码
下面是调整后的完整代码,核心是用MAKECMDGOALS提取目标,替换你原来错误的变量赋值和条件判断:
CC := clang++ CCFLAGS := -Wall -Wextra -pedantic -std=c++17 -g .DEFAULT_GOAL := help .PHONY: SecChecks KU_II help vars # 提取命令行传入的第一个目标(适配单目标场景) TARGET := $(firstword $(MAKECMDGOALS)) vars: ifeq ($(TARGET),SecChecks) @echo "A" else ifeq ($(TARGET),KU_II) @echo "B" else @echo "NO" $(TARGET) @echo "当前规则目标:" $@ endif SecChecks: vars ## Project 0: Security checks @echo "命令行目标:" $(TARGET) @echo "当前规则自动变量:" $@ KU_II: vars ## shopping list over vector products @echo "命令行目标:" $(TARGET) @echo "当前规则自动变量:" $@ help: ## prints the help text @echo "Usage: make \033[36m<TARGET>\033[0m" @echo "Available targets:" @awk -F':.*?##' '/^[a-zA-Z_-]+:.*?##.*$$/{printf " \033[36m%-10s\033[0m%s\n", $$1, $$2}' $(MAKEFILE_LIST)
关键问题说明
为什么之前的
$@不行?$@是当前规则的目标名,在vars:这个规则里,$@的值永远是vars,不是你命令行传入的SecChecks或KU_II,所以用它赋值INPUT自然拿不到正确目标。为什么
$1/$$1不行?$1是Make函数的参数占位符,不是命令行目标的参数,所以完全不适用这个场景。关于多目标的处理
如果需要支持命令行传多个目标,直接用$(MAKECMDGOALS)即可,它会保留所有目标的空格分隔列表,你可以用Make的字符串处理函数进一步拆分。
内容的提问来源于stack exchange,提问作者xedex_3
相关产品推荐
相关产品推荐

