在并行makefile中插入依赖项

时间:2013-10-23 08:02:47

标签: makefile

我正在尝试在并行makefile中为规则添加额外的依赖项。我可能找到了办法,但我有点怀疑。 (我没有写过原始的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 $< $@


我想在make中添加一个“下载”规则。

$(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规则是什么样的魔法。现在我已经添加了明确的空规则,它是否正确执行了?

1 个答案:

答案 0 :(得分:0)

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

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

代码:

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

应该写的:

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

所以我的额外空规则没有区别。在新脚本中,依赖性几乎可以实现。