3

我需要一些关于我的 Makefile 项目的帮助。源目录看起来像这样。

|-- Makefile
|-- drivers
|   |-- Makefile
|   |-- tty
|       |-- Makefile
|       |-- console.c
|       |-- keyboard.c
|-- kernel
|   |-- Makefile
|   |-- kmain.c

在顶部的 Makefile 中,我导出了一个变量 OBJECTS,我想用目标文件填充它,这样我就可以在顶部的 Makefile 中构建并将它们链接在一起。

我想通过执行以下操作来更新驱动程序/tty/Makefile 中的对象:

OBJECTS += $(CURDIR)console.o
OBJECTS += $(CURDIR)keyboard.o

但是对 OBJECTS 的更改并没有冒泡到顶部的 Makefile。我一直在查看 Linux 源代码树中的 Makefile,它们似乎在做类似的事情。但是,我无法让它工作。我在这里错过了什么吗?

4

2 回答 2

1

当您递归运行 make 时,它​​会为每个后续调用 make 打开一个新的子外壳,因此您无法使用导出返回链。一种方法是每次调用 submake 以附加到对象列表文件,然后可能包含该文件。一个更好的解决方案可能是按照让你的主makefileinclude直接对这些子make文件中的每一个做一些事情,而不是在它们上调用make。OBJECTS +=此方法允许使用带有语句的每个 submake 文件来构建 OBJECTS 变量。另一个额外的好处是您只运行一个 make 实例而不是多个 submake,这允许 make 更好地生成依赖项。看看“递归使认为有害” http://aegis.sourceforge.net/auug97.pdf

用户 Dan Molding https://stackoverflow.com/users/95706/dan-moulding之前在这里发布的一个很酷的 makefile 构建系统确实展示了很多很酷的东西,你可以用 submake 文件做很多事情,而只有一个主生成文件。Dan的boilermake项目在这里:https ://github.com/dmoulding/boilermake

于 2012-10-05T13:41:00.920 回答
1

您似乎正在递归地使用 Make ,例如

# Makefile:

export OBJECTS :=
all:
    $(MAKE) -C drivers/tty
    @echo OBJECTS is $(OBJECTS)

# drivers/tty/Makefile:

OBJECTS += $(CURDIR)console.o
all:
    whatever

这是行不通的,因为每个 Make 都有自己的OBJECTS; 子 Make 不能修改父 Make 中的变量。它是export, not import/exportor (没有orshare之类的东西,我只是想说明一下)。import/exportshare

您可以通过包含其他 makefile 而不是调用它们来获得所需的效果:

# Makefile:

OBJECTS :=
all: DRIVERS_TTY
    @echo OBJECTS is $(OBJECTS)

include drivers/tty/Makefile

# drivers/tty/Makefile:

OBJECTS += drivers/tty/console.o

DRIVERS_TTY:
    whatever

你会注意到那里有一些令人不快的位置依赖性。drivers/tty/Makefile里面有“drivers/tty”,这使得维护很痛苦。include一旦你掌握了这个基本技巧,就有办法解决这个问题。

于 2012-10-05T13:45:14.373 回答