You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键问题说明

  1. 为什么之前的$@不行?
    $@是当前规则的目标名,在vars:这个规则里,$@的值永远是vars,不是你命令行传入的SecChecks或KU_II,所以用它赋值INPUT自然拿不到正确目标。

  2. 为什么$1/$$1不行?
    $1是Make函数的参数占位符,不是命令行目标的参数,所以完全不适用这个场景。

  3. 关于多目标的处理
    如果需要支持命令行传多个目标,直接用$(MAKECMDGOALS)即可,它会保留所有目标的空格分隔列表,你可以用Make的字符串处理函数进一步拆分。

内容的提问来源于stack exchange,提问作者xedex_3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:57:05