我使用Makefiles。

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

prog: ....
  ...

run: prog
  ./prog

有传递参数的方法吗?这

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

当前回答

不是很自豪,但我不想传递环境变量,所以我把运行罐装命令的方式颠倒了:

run:
    @echo command-you-want

这将打印你想要运行的命令,所以只需要在subshell中求值即可:

$(make run) args to my command

其他回答

这个问题已经提了三年了,但是不管怎样……

如果您正在使用GNU make,这很容易做到。唯一的问题是make会将命令行中的非选项参数解释为目标。解决办法是把他们变成什么都不做的目标,这样make就不会抱怨:

# If the first argument is "run"...
ifeq (run,$(firstword $(MAKECMDGOALS)))
  # use the rest as arguments for "run"
  RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
  # ...and turn them into do-nothing targets
  $(eval $(RUN_ARGS):;@:)
endif

prog: # ...
    # ...

.PHONY: run
run : prog
    @echo prog $(RUN_ARGS)

运行这个函数会得到:

$ make run foo bar baz
prog foo bar baz

您可以显式地提取命令行中的第n个参数。要做到这一点,你可以使用变量MAKECMDGOALS,它保存给'make'的命令行参数列表,它将其解释为目标列表。如果你想提取第n个参数,你可以使用该变量与"word"函数结合使用,例如,如果你想要第二个参数,你可以将它存储在一个变量中,如下所示:

second_argument := $(word 2, $(MAKECMDGOALS) )

我找到了一种方法,用等号=!这个答案是对@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

不是很自豪,但我不想传递环境变量,所以我把运行罐装命令的方式颠倒了:

run:
    @echo command-you-want

这将打印你想要运行的命令,所以只需要在subshell中求值即可:

$(make run) args to my command

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

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

例子:

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

命令:

使问候s="hello world"

输出:

你好世界