Makefile 在不做任何修改的情况下进行重建
我已经开始为一个库编写几个简单的测试。我目前正在尝试编写一个名为Makefile 在不做任何修改的情况下进行重建,makefile,Makefile,我已经开始为一个库编写几个简单的测试。我目前正在尝试编写一个名为btests的make目标,该目标应该能够编译所有这些测试 测试以简单的.cpp文件的形式驻留在tests/目录中,其中包含库 makefile的任务很简单:将每个tests/name.cpp编译成一个可执行的tests/name文件,该文件已与库链接 它工作得很好,除了一件事:每次我运行makebtests,测试都会被重新编译。但是,只有当它们已更改或库本身已更改时,才应重新编译它们 以下是相关代码: CC=g++ CFLAGS=
btests
的make目标,该目标应该能够编译所有这些测试
测试以简单的.cpp
文件的形式驻留在tests/
目录中,其中包含库
makefile的任务很简单:将每个tests/name.cpp
编译成一个可执行的tests/name
文件,该文件已与库链接
它工作得很好,除了一件事:每次我运行makebtests
,测试都会被重新编译。但是,只有当它们已更改或库本身已更改时,才应重新编译它们
以下是相关代码:
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)
CC=g++
CFLAGS=-Wall
SRCPATH=源
OBJPATH=object
TESTPATH=测试
OBJ=$(OBJPATH)/nameb.o$(OBJPATH)/hebbann.o
INF=$(SRCPATH)/nameb.hpp$(SRCPATH)/hebbann.hpp
测试=$(测试路径)/测试api$(测试路径)/测试速度
全部:libname.a
libname.a:$(OBJ)
ar rvs libname.a$(OBJ)
$(OBJ):$(OBJPATH)/%.o:$(SRCPATH)/%.cpp$(SRCPATH)/%.hpp
$(CC)$(CFLAGS)-c$<-o$@
B测试:$(测试)
$(测试):%:%.cpp全部
$(CC)$(CFLAGS)$<-L.-lname-o$@
安装:全部
mkdir-p/usr/include/name
cp$(INF)/usr/include/name
cp libname.a/usr/lib
包装:全部
mkdir-p名称/
cp$(INF)名称/
tar-cvf libname.tar name/libname.a doc/source/
清洁:
rm-f$(OBJPATH)/*libname.a libname.tar$(测试)
只有当某些内容发生更改时,我如何才能强制make重新编译?您的测试取决于所有的。由于没有名为“all”的文件,Make得出结论,必须重建它,依赖它的测试也必须重建
解决办法很简单。all
的规则只要求libname.a
,所以只需去掉中间人:
$(TESTS) : % : %.cpp libname.a
$(CC) $(CFLAGS) $< -L. -lname -o $@
$(测试):%:%.cpp libname.a
$(CC)$(CFLAGS)$<-L.-lname-o$@
该makefile看起来不错-它真的是您正在使用的吗?我无法重现此问题;你确定这就是你正在使用的makefile,并且没有其他东西会影响各种文件的最后修改时间吗?我删掉了那些看起来与我无关的部分,但我想它们不是。我将添加整个makefile。使用make-d了解它的想法。@AB:不,它只是一个通配符,在测试中依次替换每个元素。