Определить цель для вызова рекурсивных make-файлов - PullRequest
0 голосов
/ 20 декабря 2018

Что мне нужно: сделать цель LAUNCHMAKES зависимой от чего-либо, чтобы не вызывать вспомогательные make-файлы, когда исходный файл не был изменен.

SUB MakeFile содержит сбор всех файлов .cpp вкаталог и сохраняет их в объект /.Тогда никакой файл src не изменился, он все равно вызывает и порождает "Вход в каталог - Выход из каталога".Мне нужно избавиться от этого, когда в этом нет необходимости.Я прочитал о --no-print-directory, но это не так.

Структура проекта:

Project
|----project
|    |----dir1
|    |    |----src1.cpp
|    |    `----Makefile
|    |----dir2
|    |    |----src2.cpp
|    |    `----Makefile
     `----main.cpp
|----obj
|    |----src1.o
|    |----src2.o
|    `----main.o
|----MakeFile

Код:

release: LAUNCHMAKES obj/main.o
    $(CXX) $(CXXFLAGS) main.o src1.o src2.o -o result

LAUNCHMAKES: (?)
    for i in $(SUBDIRS); do \
    $(MAKE) -C $$i CXXFLAGS=$(CXXFLAGS);  \
    done

obj/main.o: project/main.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

1 Ответ

0 голосов
/ 20 декабря 2018

Не решение вашей проблемы, а пример нерекурсивного Makefile, просто чтобы показать вам, насколько просто это может быть для вашего простого примера проекта:

SUBDIRS := dir1 dir2
OBJDIR  := obj
SRCS    := $(shell find . -type f -name '*.cpp')
OBJS    := $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SRCS)))
VPATH   := $(SUBDIRS)

.PHONY: release clean

release: result

result: $(OBJS)
    $(CXX) $(LDFLAGS) $^ -o $@

$(OBJDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    rm -f $(OBJDIR)/*.o result

Демонстрация:

$ make
g++  -c dir2/src2.cpp -o obj/src2.o
g++  -c dir1/src1.cpp -o obj/src1.o
g++  -c main.cpp -o obj/main.o
g++  obj/src2.o obj/src1.o obj/main.o -o result
...