0

ライブラリの簡単なテストをいくつか書き始めました。私は現在、btestsそれらすべてをコンパイルするはずの make ターゲットを作成しようとしています。

テストは、ライブラリが格納されている単純なファイルtests/の形式でディレクトリに存在します。.cpp#include

makefile のタスクは単純です。ライブラリにリンクさtests/name.cppれた実行可能ファイルにそれぞれをコンパイルします。tests/name

そして、1 つのことを除いて、正常に動作します: を実行するたびにmake btests、テストが再コンパイルされます。ただし、それらが変更された場合、またはライブラリ自体が変更された場合にのみ再コンパイルする必要があります。

これは関連するコードです:

CC=g++
CFLAGS=-Wall

SRCPATH=source
OBJPATH=object
TESTPATH=tests

OBJ=$(OBJPATH)/nameb.o $(OBJPATH)/hebbann.o
INF=$(SRCPATH)/nameb.hpp $(SRCPATH)/hebbann.hpp
TESTS=$(TESTPATH)/test_api $(TESTPATH)/test_speed


all : libname.a

libname.a : $(OBJ)
    ar rvs libname.a $(OBJ)

$(OBJ) : $(OBJPATH)/%.o : $(SRCPATH)/%.cpp $(SRCPATH)/%.hpp
    $(CC) $(CFLAGS) -c $< -o $@

btests : $(TESTS)

$(TESTS) : % : %.cpp all
    $(CC) $(CFLAGS) $< -L. -lname -o $@

install : all
    mkdir -p /usr/include/name
    cp $(INF) /usr/include/name
    cp libname.a /usr/lib

pack : all
    mkdir -p name/
    cp $(INF) name/
    tar -cvf libname.tar name/ libname.a doc/ source/

clean :
    rm -f $(OBJPATH)/* libname.a libname.tar $(TESTS)

何かが変更された場合にのみ make を強制的に再コンパイルするにはどうすればよいですか?

4

1 に答える 1

1

テストは に依存しallます。「all」と呼ばれるファイルが存在しないため、Make は再構築する必要があると判断し、それに依存するテストも再構築する必要があります。

修正は簡単です。ルール forallは requirelibname.aのみを行うため、仲介者を切り取るだけです。

$(TESTS) : % : %.cpp libname.a
    $(CC) $(CFLAGS) $< -L. -lname -o $@
于 2013-01-05T00:02:28.690 に答える