防止Makefile目标重新编译

时间:2016-03-16 03:41:23

标签: compilation makefile

我有以下Makefile。出于某种原因,当我执行make时,即使我没有修改文件,它也会重建目标test_phantom_types.o

GTEST_HEADERS = ${GTEST_DIR}/include/gtest/*.h \
                ${GTEST_DIR}/include/gtest/internal/*.h

BASE_DIR =  ..

BUILD_DIR = build

USER_DIR = $(BASE_DIR)/tests/src

CPPFLAGS += -isystem $(GTEST_DIR)/include

CXXFLAGS += -g -Wall -Wextra -pthread -std=c++11

TESTS = test_phantom_types

all : $(TESTS)

clean :
        cd $(BUILD_DIR); \
        rm -rf $(BUILD_DIR)/*.o; \
        cd ../

test_phantom_types.o : $(USER_DIR)/test_phantom_types.cpp \
                       $(BASE_DIR) $(GTEST_HEADERS)
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(BASE_DIR) -c   $(USER_DIR)/test_phantom_types.cpp -o $(BUILD_DIR)/$@

test_phantom_types : test_phantom_types.o
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $(addprefix     $(BUILD_DIR)/,$^) ${GTEST_DIR}/libgtest.a ${GTEST_DIR}/libgtest_main.a -o   $(addprefix $(BUILD_DIR)/, $@)

check : $(TESTS)
        ./$(addprefix $(BUILD_DIR)/,$^)

.PHONY : clean

1 个答案:

答案 0 :(得分:2)

make非常直观。

你告诉它你有一个名为test_phantom_types.o的目标,所以它希望该目标生成该文件。

但是,在你的情况下,它并没有。它会生成$(BUILD_DIR)/$@(来自-o $(BUILD_DIR)/$@)并且这不是一回事。

因此,当您运行make并确定(来自all - > test_phantom_types - > test_phantom_types.o序列)时,需要检查是否需要构建它要查找的test_phantom_types.o文件,无法找到并重建它。

如果您尝试,可以在make -d的输出中看到此内容。

这就是第二个Rule of Makefiles

的原因
  

2.每个非.PHONY规则必须使用其目标的确切名称更新文件。

     

确保每个命令脚本都接触文件“$ @” - 而不是“../$@”或“$(notdir $ @)”,但确切地说是$ @。这样你和GNU总是同意。