无需任何修改即可进行重建

时间:2013-01-04 22:16:14

标签: makefile

我开始为图书馆编写几个简单的测试。我目前正在尝试编写一个名为btests的make目标,该目标应该全部编译。

测试以简单tests/文件的形式驻留在.cpp目录中#include库。

makefile的任务很简单:将每个tests/name.cpp编译成一个已与文件库链接的可执行文件tests/name

它运行正常,除了一件事:每次运行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重新编译?

1 个答案:

答案 0 :(得分:1)

您的测试取决于all。由于没有名为“all”的文件,因此Make得出结论,必须重建它,依赖于它的测试也必须重建。

修复很简单。 all的规则除了需要libname.a之外什么都不做,所以只是切断了中间人:

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