0

GNU-make makefile (gcc v4.1.2) の一部が期待どおりに機能していません。makeサブディレクトリに 4 つのライブラリがあり、ベースの /build ディレクトリで実行されている場合に再帰的にビルドしたい

/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:コメントアウトされている2 行目を試してみると、期待どおりに動作します。

4

1 に答える 1

3

問題はここにあります:

%.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)
于 2012-08-09T21:12:03.690 に答える