Правило `Makefile` для восстановления директории объектных файлов без перекомпиляции с нуля? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующее Makefile, которое прекрасно работает, но каждый раз, когда он перекомпилируется с самого начала, даже если ничего не изменилось.

CXX = g++

CXXFLAGS = -std=c++11
INC_PATH = `pkg-config --cflags ../openCV/build/lib/pkgconfig/opencv.pc` \
    `pkg-config --cflags ../SDL2-2.0.8/instDir/lib/pkgconfig/sdl2.pc` \
    `pkg-config --cflags ../jsoncpp/build/pkg-config/jsoncpp.pc` \
    -I ../poco/instDir/include/

#LIB_PATH = -L../cmake_bin_dir/lib/ ./gainput/build/lib -L../SDL2-2.0.8/build/ -L../SDL2-2.0.8/build/lib
LIBS =  `pkg-config --libs ../openCV/build//lib/pkgconfig/opencv.pc` \
    `pkg-config --libs ../SDL2-2.0.8/instDir/lib/pkgconfig/sdl2.pc` \
    `pkg-config --libs ../jsoncpp/build/pkg-config/jsoncpp.pc` \
    -L../poco/instDir/lib/ -lPocoNetd -lPocoUtild -lPocoFoundationd \

SOURCEDIR := ./
SOURCES := $(wildcard $(SOURCEDIR)/*.cpp)
OBJDIR=$(SOURCEDIR)/obj

OBJECTS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.d,$(SOURCES))

# ADD MORE WARNINGS!
WARNING := -Wall -Wextra

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: parking

clean:
    $(RM) $(OBJECTS) $(DEPENDS) parking

# Linking the executable from the object files
parking: $(OBJECTS)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)

-include $(DEPENDS)

$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

Кажется, проблема в этих строках

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

и, в частности, зависимость от $(OBJDIR) (где сохраняются файлы *.o и *.d), фактически, когда я удаляю ее, кажется, что она не перекомпилируется.Проблема заключается в том, что если я удаляю $(OBJDIR), каталог не восстанавливается снова.

Что такое правило Makefile для регенерации каталога, в котором хранятся объектные файлы, без запуска всей компиляции с нуля?

1 Ответ

0 голосов
/ 04 октября 2018

$(OBJDIR) является необходимым условием для ваших объектных файлов.Как и в любом каталоге, его время последнего изменения изменяется каждый раз, когда изменяется его содержимое ... Вместо этого объявите его как обязательное условие только для заказа :

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile | $(OBJDIR)

Таким образом, если оно уже существуетего время последней модификации не будет учитываться make, чтобы решить, какие цели необходимо восстановить.

...