我开始为图书馆编写几个简单的测试。我目前正在尝试编写一个名为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重新编译?
答案 0 :(得分:1)
您的测试取决于all
。由于没有名为“all”的文件,因此Make得出结论,必须重建它,依赖于它的测试也必须重建。
修复很简单。 all
的规则除了需要libname.a
之外什么都不做,所以只是切断了中间人:
$(TESTS) : % : %.cpp libname.a
$(CC) $(CFLAGS) $< -L. -lname -o $@