【问题标题】:Passing Variable to make from the command line?从命令行传递变量?
【发布时间】:2012-05-11 15:51:40
【问题描述】:

全部,

我正在尝试从命令行传递要 make 的变量。我的命令在下面

make ARCH=arm CROSS_COMPILE=/my_dir/bin/arm-openwrt-linux-g++

我收到的错误是

g++: error: arm: No such file or directory

但文件 'arm-openwrt-linux-g++' 确实存在。

我认为问题是我需要将变量传递给子制作文件。可以提供一些有关如何从命令行将变量传递给子生成文件的示例的帮助。我尝试使用 make 的 -e 和导出选项,但看不到任何工作。

谢谢

makefile 的内容:

# GNU Make solution makefile autogenerated by Premake
# Type "make help" for usage help

ifndef config
config=debug
endif
export config

    PROJECTS := json openjaus

.PHONY: all clean help $(PROJECTS)

all: $(PROJECTS)

json: 
@echo "==== Building json ($(config)) ===="
@${MAKE} --no-print-directory -C .build -f json.make

openjaus: json
    @echo "==== Building openjaus ($(config)) ===="
    @${MAKE} --no-print-directory -C .build -f openjaus.make

【问题讨论】:

  • 如果我们看不到它们,我们无法猜测您的 Makefile 中发生了什么。
  • 是否需要文件的内容来评估命令行是否正确?我的基本问题是我正确地传递了变量。如有需要,我会提供文件内容。
  • 你传递它们的方式没有明显的错误;这就是我发表评论的原因。您的 Makefile 中发生了一些事情来触发该错误,这在您显示的调用中并不明显。
  • 我已将 makefie 的内容添加到原始帖子中。谢谢
  • 仍然没有迹象表明哪里出了问题;您确实需要安排将您的设置传递给子makes,可能通过显式调用 (${MAKE} ARCH=${ARCH} ...)。

标签: makefile


【解决方案1】:

因此,您的问题与通过命令行发送变量无关。

您的问题是,在您未向我们展示的子目录中的其中一个 makefile 中,您以不正确的方式使用变量 $(ARCH) 使得命令行的扩展不是合法的g++ 命令行。

根据错误消息,很可能您在不应该在的地方添加了一个空格,因此您得到的是-fmarch= arm,而不是-fmarch=arm。显然这只是一个示例,因为您没有提供足够的信息。

另一个注意事项:我们不知道您的 makefile 是如何工作的,但通常支持像 CROSS_COMPILE 这样的变量的 makefile 期望它被设置为交叉编译命令的前缀;在您的情况下,它将是CROSS_COMPILE=/my_dir/bin/arm-openwrt-linux-。但是,您的 makefile 可能会有所不同。

提问时,最好不要立即猜测答案是什么。首先描述问题,其中包括显示错误行以及它之前的几行。例如,在这种情况下,您会收到来自 g++ 的错误,因此打印出来的命令行会向您展示它是如何调用 g++ 的。

一旦你给出了基本的细节,那么如果你认为你对问题所在有所了解,请继续提出建议,和/或询问它。

如果您提供调用g++ 的规则和/或显示g++ 命令行的make 输出,那么我们可以提供更多帮助。

干杯!

【讨论】:

  • 谢谢大家!正在编辑原始帖子以添加更多详细信息。
  • 问题已解决。问题是 submake 文件中的规则使用主机 g++ 而不是目标 g++。非常感谢所有评论的人!
【解决方案2】:

这是我认为需要发生的事情:

您需要确保您的子 makefile 确实尊重 $(ARCH)$(CROSS_COMPILE) 变量。它们也是由 Premake 生成的吗?如果是这样,那是它处理交叉编译的方式吗?检查文档。

在我的测试(如下)中,我发现在命令行上设置的变量会传播到子 make,这让我认为您的子 makefile 不尊重$(ARCH)

生成文件:

a:
        $(MAKE) -C z

z/Makefile:

a:
        @echo "MAKE=$(MAKE)"
        @echo "ARCH=$(ARCH)"

不带参数运行make

$ make
make -C z
make[1]: Entering directory `/home/foo/test/z'
MAKE=make
ARCH=
make[1]: Leaving directory `/home/foo/test/z'

运行make ARCH=bar:

$ make ARCH=bar
make -C z
make[1]: Entering directory `/home/foo/z/z'
MAKE=make
ARCH=bar
make[1]: Leaving directory `/home/foo/z/z'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多