我使用Makefiles。

我有一个名为run的目标,它运行构建目标。简化后,如下图所示:

prog: ....
  ...

run: prog
  ./prog

有传递参数的方法吗?这

make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat

当前回答

下面是我的例子。注意,我是在Windows 7下编写的,使用Dev-Cpp附带的mingw32-make.exe。(我有c:\Windows\System32\make.bat,所以命令仍然被称为“make”。)

clean:
    $(RM) $(OBJ) $(BIN) 
    @echo off
    if "${backup}" NEQ "" ( mkdir ${backup} 2> nul && copy * ${backup} )

日常清洁用途:

make clean

在mydir/中清理和创建备份的用法:

make clean backup=mydir

其他回答

建立在理想答案的基础上。 你可以创建一个通用的“函数”来获取参数 使用以下方法:

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不会抱怨你覆盖了一个目标。

它已经有一段时间了,但我将提供我在生产中使用的版本。

我希望有人会觉得它有用。

例子:

.PHONY: greeting
greeting:
    echo $(if $s,$s,)

命令:

使问候s="hello world"

输出:

你好世界

我找到了一种方法,用等号=!这个答案是对@lesmana的回答的补充(因为它在这里是最完整和解释最充分的回答),但是它太大了,不能作为评论来写。再一次,我重复他的信息:TL;DR不要试图这样做!

我需要一种方法来处理我的参数——xyz-enabled=false(因为默认为true),现在我们都知道这不是一个make目标,因此不是$(MAKECMDGOALS)的一部分。

当通过回显$(.VARIABLES)查看所有的make变量时,我得到了这些有趣的输出:

[...] -*-command-variables-*- --xyz-enabled [...]

这允许我们有两种方法:要么以——开头(如果适用于您的情况),要么查看GNU的特定变量(可能不打算让我们使用)-*-command-variables-*-。**参见页脚的其他选项**在我的情况下,这个变量持有:

--xyz-enabled=false

通过这个变量,我们可以将它与已经存在的解决方案$(MAKECMDGOALS)结合起来,从而定义:

# the other technique to invalidate other targets is still required, see linked post
run:
    @echo ./prog $(-*-command-variables-*-) $(filter-out $@,$(MAKECMDGOALS))`

并使用它与(显式地混合参数的顺序):

make run -- config --xyz-enabled=false over=9000 --foo=bar show  isit=alwaysreversed? --help

返回:

./prog isit=alwaysreversed? --foo=bar over=9000 --xyz-enabled=false config show --help

如你所见,我们打乱了参数的总顺序。带有“assignment”-args的部分似乎被颠倒了,“target”-args的顺序保持不变。我把赋值参数放在开头,希望你的程序不关心参数放在哪里。


下面的make变量看起来也很有希望:

MAKEFLAGS =  -- isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false
MAKEOVERRIDES = isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false

不。看看GNU make手册页中的语法

生成[-f makefile][选项]…[目标]……

您可以指定多个目标,因此是'no'(至少以您指定的确切方式为no)。

你可以像下面这样将变量传递给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