从Makefile中读取变量,在Makefile中

4

我的工作文件夹树:

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

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

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


我的方法是先让Makefile B进行编译并导出该值,然后在Makefile A中读取该值。 - MYMNeo
1
我不是MAKE的专家,但似乎在makefile A中指定“BNAME”,并将其传递给makefile B更容易。根据B实际是什么(可能是整个类集,也可能是完整的命名空间,或者只是一两个类),这种方法当然更或多或少可行,因为我假设您的项目中至少有几个像B这样的子目录。 - Tomas Aschan
@MYMNeo 有趣。将值导出到文件中? - PanzerKadaver
https://dev59.com/KGw05IYBdhLWcg3wSABH - MYMNeo
2个回答

4
你可以在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: 进入目录 /home/guilma_p/lib/my/Printf' my_printf.o make: 离开目录 /home/guilma_p/lib/my/Printf' /bin/sh: -c: line 0: unexpected EOF while looking for matching `'' /bin/sh: -c: line 1: syntax error: unexpected end of file make: *** [libmy.a] Error 1 - PanzerKadaver

0

我找到了!非常感谢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)

1
如果出现递归 Makefile 的情况,您需要使用“--no-print-directory”选项。像这样:B_Files:=$(shell make --no-print-directory -C work_folder_B get_name) - PanzerKadaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接