0

我已经开始为一个库编写几个简单的测试。我目前正在尝试编写一个名为的 make 目标,该目标btests应该将它们全部编译。

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

makefile 的任务很简单:将每个文件编译tests/name.cpptests/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)

仅当某些内容发生更改时,我如何才能强制重新编译?

4

1 回答 1

1

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

修复很简单。规则all除了 require 什么都不做libname.a,所以只需去掉中间人:

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