【问题标题】:Read a variable from Makefile, in a Makefile在 Makefile 中从 Makefile 读取变量
【发布时间】:2013-04-22 10:06:09
【问题描述】:

我的工作文件夹树:

.
|-- work_folder1
|    |-- some.c file
|    |-- Makefile B
|
|-- some.c file
|-- Makefile A

我的makefile A调用Makefile B中的'all'规则。Makefile B的'all'规则生成一个名为'B.o' [$(NAME) variable]的.o文件并将其复制到工作文件夹(cp ../ )。 Makefile A 编译.c 文件并将它们与“B.o”链接。但是如果我决定在 Makefile B 中更改 'B.o' 的名称,例如 'my_B.o',Makefile A 将无法编译,因为 'B.o' 不再存在。

如何从 Makefile A 读取 Makefile B 的 $(NAME) 变量?

【问题讨论】:

  • 我的方法是让Makefile B先make并导出这个值,然后读取Makefile A中的值
  • 我不是 MAKE 专家,但在 makefile A 中指定 BNAME 似乎更容易,并将其传递给 makefile B。取决于 B 的实际情况(一整套类,可能是一个完整的命名空间,或者只有一个或两个类)这种方法当然或多或少是可行的,因为我假设您的项目中至少有几个像 B 这样的子目录。
  • @MYMNeo 很有趣。导出文件中的值?

标签: c makefile


【解决方案1】:

您可以在 Makefile B 中添加一个特殊的 .PHONY 规则,以便它输出您想要的名称。

在 Makefile B 中

.PHONY: get_names

get_names:
    @echo "B.o"

在 Makefile A 中

B_Files:=$(shell $(MAKE) -C work_folder_B get_names)

# You can use $(B_Files) that will contain `B.o`.

请注意在 Makefile A 中使用 :=,以便您运行 make 以仅获取一次名称。

【讨论】:

  • 嗯,当我尝试您的代码时,make 命令返回错误:ar r libmy.a make: Entering directory /home/guilma_p/lib/my/Printf' my_printf.o make: Leaving directory /home/guilma_p/lib/my/Printf' /bin/sh: -c:第 0 行:在寻找匹配的 `'' /bin/sh 时出现意外 EOF:-c:第 1 行:语法错误:文件意外结束 make:*** [libmy.a] 错误 1
【解决方案2】:

我找到了!非常感谢 Didier!

在我的 Makefile B 中:

$(NAME): my_B.o

PHONY: get_name

get_name:
    @echo $(NAME)

在我的 Makefile A 中:

B_Files:=$(shell make -s -C work_folder_B get_name)

【讨论】:

  • 如果是recur Makefile,你需要使用'--no-print-directory'选项。像这样:B_Files:=$(shell make --no-print-directory -C work_folder_B get_name)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多