我正在尝试向并行生成文件中的规则添加额外的依赖项。我可能已经找到了一种方法,但我对此表示怀疑。(我还没有编写原始的 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 规则是什么魔法。既然我已经添加了一个明确的空规则,它是否正确执行?