linux - 详解mkmakefile生成的Makefile(Linux内核、buildroot、busybox)

标签 linux linux-kernel makefile gnu-make buildroot

脚本 mkmakefile 在 builddir 中生成以下 Makefile。

如果被调用,所有目标都被传递到 srcdir Makefile。

谁能解释一下为什么?神奇在哪里?

lastword = $(word $(words $(1)),$(1))
makedir := $(dir $(call lastword,\$(MAKEFILE_LIST)))

MAKEARGS := -C path_to_srcdir
MAKEARGS += O=$(if $(patsubst /%,,$(makedir)),$(CURDIR)/)$(patsubst %/,%,$(makedir))

MAKEFLAGS += --no-print-directory

.PHONY: all $(MAKECMDGOALS)

all := $(filter-out all Makefile,$(MAKECMDGOALS))

all:
    $(MAKE) $(MAKEARGS) $(all)

Makefile:;

$(all): all
    @:

%/: all
    @:

最佳答案

让我们分解一下。首先,使用 all 作为目标和变量名是令人讨厌的,这是编码新手或代码生成器会做的事情。让我们重命名变量 all_targs 并假设我们通过 make Makefile foo bar baz 调用。如果我们抓取一些与问题无关的部分,我们会得到

MAKEARGS := -C path_to_srcdir

.PHONY: all $(MAKECMDGOALS)

all_targs := $(filter-out all Makefile,$(MAKECMDGOALS)) # foo bar baz

all:
    $(MAKE) $(MAKEARGS) $(all_targs)

Makefile:;

$(all_targs): all
    @: # do nothing

所以我们什么都不做 Makefileall_targsfoo bar baz,对于这三个目标我们什么都不做,但我们需要 所有all 的规则运行命令

make -C path_to_srcdir foo bar baz

(还有一些曲折,但这是它的核心。)

关于linux - 详解mkmakefile生成的Makefile(Linux内核、buildroot、busybox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740096/

相关文章:

linux - 有没有办法计算目录的 inode ?

Linux awk 降序排序不起作用

linux - 在运行时查找我的 Linux 共享库

python - Python中跨平台tell/seek的问题

Linux进程内存方案

linux - 为什么我们需要 x86 上的 zone_highmem?

c - 如何从 Linux 内核中删除 conntrack 条目?

macos - Mac OS X : no target found 上的 Makefile 问题

c++ - 我怎样才能使我的 makefile 以我需要的方式将我的项目放在一起?

c++ - gazebo ros插件报错: Undefined symbols for architecture x86_64