我正在编写一个主makefile来编译和安装多个基于autoconf的库,它们相互依赖。一切工作都很好。问题是:如果我单独使用这些库中的一个,并且“使& &安装”前缀文件夹中的头文件被覆盖(即使它们未被触摸)。这会导致所有依赖库从头开始编译。使安装导致重新编译
有没有办法避免不必要的重新编译,而没有入侵makefile?
我正在编写一个主makefile来编译和安装多个基于autoconf的库,它们相互依赖。一切工作都很好。问题是:如果我单独使用这些库中的一个,并且“使& &安装”前缀文件夹中的头文件被覆盖(即使它们未被触摸)。这会导致所有依赖库从头开始编译。使安装导致重新编译
有没有办法避免不必要的重新编译,而没有入侵makefile?
也许解决方案是晚了一点,但
./configure INSTALL="install -p"
修复重新编译的问题。该标志使GNU安装将安装文件的时间戳设置为构建文件的时间戳。
您可以使用仅存在的sentinel文件来建立您的依赖关系图。例如。
prefix := /usr/local
.PHONY: all
all: libx-built
libx-built \
: libx.tar.gz \
; tar xzvf [email protected] \
&& cd libx \
&& ./configure --prefix=$(prefix) \
&& make && make install \
&& touch [email protected]
然后,只有在libx-built是新的时候,才会进行相关的liby构建。
liby-built \
: liby.tar.gz libx-built \
; ...
我认为这并不能涵盖所有的情况。如果用户从svn更新他/她的源并做了一个make -since sentinel文件没有被触及,那么将不会构建任何东西。我错了吗? 目标是建立和安装所有的变化;但要避免不必要的构建。 – 2010-07-13 02:22:25
这是正确的。但是由于我们谈论的是基于autoconf的库,我认为它们是需要安装的一堆第三方软件包,因此只有在决定升级时才会更改。如果是这样的话,那么你可以使用这样的技巧来破解DAG。如果没有,那么也许给我一个你正在做什么的具体例子,我会修改我的建议。 – 2010-07-14 00:51:27