模式规则未按预期工作

时间:2012-08-09 19:33:59

标签: makefile gnu-make

我有一部分GNU-make makefile(gcc v4.1.2)没有像我预期的那样工作。我在sub diretiories中有四个库,如果在base / build目录中运行make,我想以递归方式构建

/prj
|--/build
|  |--makefile
|  |--/Tables.lib
|  |  |--makefile
|  |--/General.lib
|  |  |--makefile (etc..)
|--/lib
|--/src

/ prj / build / makefile的简要代码:

LIB_DIR = /prj/lib

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a
DIRS := Tables.lib Composition_adjustment.lib General.lib Biblio.lib

all: $(LIBRARY)
#all: $(LIB_DIR)/libcomposition_adjustment.a # this line works

%.a : $(LIB_DIR)/%.a

$(LIB_DIR)/libtables.a:
    cd Tables.lib; $(MAKE)

$(LIB_DIR)/libcomposition_adjustment.a:
    cd Composition_adjustment.lib; $(MAKE)

$(LIB_DIR)/libgeneral.a:
    cd General.lib; $(MAKE)

$(LIB_DIR)/libbiblio.a: libgeneral.a
    cd Biblio.lib; $(MAKE)

它说“没有规则要制作目标'libcomposition_adjustment.a',需要'全'。停止”。但我认为%.a : $(LIB_DIR)/%.a行会处理这个问题。我错误地制作了这种模式规则吗?

如果我尝试注释掉的第二条all:行,它会按预期工作。

1 个答案:

答案 0 :(得分:2)

问题在于:

%.a : $(LIB_DIR)/%.a

这是一个没有命令的模式规则,Make根本不会将其解释为独立规则。解决这个问题的方法不止一种;最简单的可能是给它一个无操作命令:

%.a : $(LIB_DIR)/%.a
    @:

但更好的方法是完全没有可疑的规则:

LIB_DIR = /prj/lib

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a
LIBRARY := $(addprefix $(LIB_DIR)/,$(LIBRARY))

all: $(LIBRARY)

$(LIB_DIR)/libtables.a:
    cd Tables.lib; $(MAKE)

$(LIB_DIR)/libcomposition_adjustment.a:
    cd Composition_adjustment.lib; $(MAKE)

$(LIB_DIR)/libgeneral.a:
    cd General.lib; $(MAKE)

$(LIB_DIR)/libbiblio.a: $(LIB_DIR)/libgeneral.a
    cd Biblio.lib; $(MAKE)