0

我正在尝试向并行生成文件中的规则添加额外的依赖项。我可能已经找到了一种方法,但我对此表示怀疑。(我还没有编写原始的 makefile,我也不是 make 专家。)

原始的 makefile 如下所示:

VER = busybox-1.16.2
URL = http://busybox.net/downloads/$(VER).tar.bz2

export KBUILD_OUTPUT = $(ROOTDIR)/user/busybox/build-$(VER)

all: build-$(VER)/.config depmod.pl
    $(MAKE) -C build-$(VER)

build-$(VER)/.config: $(ROOTDIR)/config/.config
    mkdir -p build-$(VER)
    sed -n \
        -e '/_CROSS_COMPILER_PREFIX=/s:=.*:="$(CROSS_COMPILE)":' \
        -e '/CONFIG_USER_BUSYBOX_/s:CONFIG_USER_BUSYBOX_:CONFIG_:p' \
        $< > $@.uclinux-dist.new
    set -e ; \
    if [ ! -e $@ ] || ! cmp -s $@.uclinux-dist.new $@.uclinux-dist.old ; then \
        cp $@.uclinux-dist.new $@.uclinux-dist.old ; \
        cp $@.uclinux-dist.old $@ ; \
        yes "" | $(MAKE) -C $(VER) oldconfig ; \
    fi

depmod.pl: $(VER)/examples/depmod.pl
    ln -sf $< $@


我想在制作中添加“下载”规则。

$(VER)/: $(VER).tar.bz2
    tar -jxvf $(VER).tar.bz2
    touch $@

$(VER).tar.bz2:
    wget $(URL)
    touch $@


此规则必须在执行其他任何操作之前执行。并行构建可防止诸如

all: |$(VER)/ build-$(VER)/.config depmod.pl


(这适用于单线程构建。)
到目前为止,我的解决方案是:

VER = busybox-1.18.5
URL = http://busybox.net/downloads/$(VER).tar.bz2

export KBUILD_OUTPUT = $(ROOTDIR)/user/busybox/build-$(VER)

all: build-$(VER)/.config depmod.pl
    $(MAKE) -C build-$(VER)

$(VER)/: $(VER).tar.bz2
    tar -jxvf $(VER).tar.bz2
    touch $@

$(VER).tar.bz2:
    wget $(URL)
    touch $@

build-$(VER)/.config: $(ROOTDIR)/config/.config | $(VER)/
    mkdir -p build-$(VER)
    sed -n \
        -e '/_CROSS_COMPILER_PREFIX=/s:=.*:="$(CROSS_COMPILE)":' \
        -e '/CONFIG_USER_BUSYBOX_/s:CONFIG_USER_BUSYBOX_:CONFIG_:p' \
        $< > $@.uclinux-dist.new
    set -e ; \
    if [ ! -e $@ ] || ! cmp -s $@.uclinux-dist.new $@.uclinux-dist.old ; then \
        cp $@.uclinux-dist.new $@.uclinux-dist.old ; \
        cp $@.uclinux-dist.old $@ ; \
        yes "" | $(MAKE) -C $(VER) oldconfig ; \
    fi

depmod.pl: $(VER)/examples/depmod.pl
    ln -sf $< $@

$(VER)/examples/depmod.pl: | $(VER)/


问题是,我真的不知道 depmod.pl 规则是什么魔法。既然我已经添加了一个明确的空规则,它是否正确执行?

4

1 回答 1

0

我不想回答我自己的问题,但我想我已经找到了答案。

depmod.pl 规则的依赖在原始脚本中不是真实的/相关的。

编码:

depmod.pl: $(VER)/examples/depmod.pl
    ln -sf $< $@

应该写:

depmod.pl:
        ln -sf $(VER)/examples/depmod.pl $@

所以我额外的空规则没有任何区别。在新的脚本中,依赖几乎是有意义的。

于 2013-10-23T08:15:55.317 回答