我正在尝试在并行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规则是什么样的魔法。现在我已经添加了明确的空规则,它是否正确执行了?
答案 0 :(得分:0)
我不想回答我自己的问题,但我想我找到了答案。
depmod.pl规则的依赖关系在原始脚本中并不真实/相关。
代码:
depmod.pl: $(VER)/examples/depmod.pl
ln -sf $< $@
应该写的:
depmod.pl:
ln -sf $(VER)/examples/depmod.pl $@
所以我的额外空规则没有区别。在新脚本中,依赖性几乎可以实现。