我使用Makefiles。
我有一个名为run的目标,它运行构建目标。简化后,如下图所示:
prog: ....
...
run: prog
./prog
有传递参数的方法吗?这
make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat
我使用Makefiles。
我有一个名为run的目标,它运行构建目标。简化后,如下图所示:
prog: ....
...
run: prog
./prog
有传递参数的方法吗?这
make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat
当前回答
它已经有一段时间了,但我将提供我在生产中使用的版本。
我希望有人会觉得它有用。
例子:
.PHONY: greeting
greeting:
echo $(if $s,$s,)
命令:
使问候s="hello world"
输出:
你好世界
其他回答
它已经有一段时间了,但我将提供我在生产中使用的版本。
我希望有人会觉得它有用。
例子:
.PHONY: greeting
greeting:
echo $(if $s,$s,)
命令:
使问候s="hello world"
输出:
你好世界
你可以像下面这样将变量传递给Makefile:
run:
@echo ./prog $$FOO
用法:
$ make run FOO="the dog kicked the cat"
./prog the dog kicked the cat
or:
$ FOO="the dog kicked the cat" make run
./prog the dog kicked the cat
或者使用Beta提供的解决方案:
run:
@echo ./prog $(filter-out $@,$(MAKECMDGOALS))
%:
@:
%: -匹配任何任务名称的规则; @: -空食谱=什么都不做
用法:
$ make run the dog kicked the cat
./prog the dog kicked the cat
对于标准make,您可以通过这样定义宏来传递参数
make run arg1=asdf
然后像这样使用它们
run: ./prog $(arg1)
etc
制作参考资料 微软的NMake
建立在理想答案的基础上。 你可以创建一个通用的“函数”来获取参数 使用以下方法:
define fetch_parameter
$(eval target_name:= $(firstword $(MAKECMDGOALS)))
$(eval varname := $(target_name)_value)
$(eval $(varname) := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)))
$(eval $($(varname))::;@:)
endef
然后你可以像这样在你的目标中使用它:
my-target: res := $(call fetch_parameter)
my-target: ## Example target. Usage: make my-target <value>
echo The value: $($@_value)
这样你就可以在任何你想检索值的目标上使用res:= $(调用fetch_parameter)。
注意:我在这段代码中添加了额外的:$(eval $($(varname))::;@:),因为如果你有多个调用fetch_parameter的目标,它也会被触发。 如果你有:
my-target: res := $(call fetch_parameter)
my-target: ## Example target. Usage: make my-target <value>
echo The value: $($@_value)
my-target2: res := $(call fetch_parameter)
my-target2: ## Example target. Usage: make my-target2 <value>
echo The value: $($@_value)
并且你调用make my-target2 hello, make的工作方式,$(call fetch_parameter)都将被触发,导致创建2个伪hello目标,但额外的:(hello::) make不会抱怨你覆盖了一个目标。
不是很自豪,但我不想传递环境变量,所以我把运行罐装命令的方式颠倒了:
run:
@echo command-you-want
这将打印你想要运行的命令,所以只需要在subshell中求值即可:
$(make run) args to my command