Генерируйте все зависимости проекта в единственном файле с помощью gcc - флаг MM

Я хочу генерировать единственный файл зависимости, который состоит из всех зависимостей исходных файлов с помощью gcc-M флаги через Make-файл. Я погуглил для этого решения, но, все упомянутые решения для генерации нескольких deps файлов для нескольких объектов.

DEPS = make.dep

$(OBJS): $(SOURCES)
    @$(CC) -MM $(SOURCEs) > $(DEPS)
    @mv -f $(DEPS) $(DEPS).tmp
    @sed -e 's|.$@:|$@:|' < $(DEPS).tmp > $(DEPS)
    @sed -e 's/.*://' -e 's/\\$$//' < $(DEPS).tmp | fmt -1 | \
      sed -e 's/^ *//' -e 's/$$/:/' >> $(DEPS)
    @rm -f $(DEPS).tmp

Но это не работает правильно. Скажите мне, где я делаю ошибку.

7
задан tshepang 8 March 2014 в 08:09
поделиться

2 ответа

Нечто подобное я использую, чтобы собрать все свои зависимости в один файл:

program_H_SRCS := $(wildcard *.h)
program_C_SRCS := $(wildcard *.c)
DEPS = make.deps

make.deps: $(program_C_SRCS) $(program_H_SRCS)
    $(CC) $(CPPFLAGS) -MM $(program_C_SRCS) > make.deps

include $(DEPS)

В основном это заставляет все пользовательские (в отличие от системных) зависимости перестраиваться в один файл при каждом изменении любого C или H файла в проекте.

+++++++++ EDIT +++++++++++

С тех пор я нашел лучший способ делать это. Я генерирую отдельный файл dep для каждого исходного файла. Вот основной makefile:

program_NAME := myprogram
program_SRCS := $(wildcard *.c)
program_OBJS := ${program_SRCS:.c=.o}
clean_list += $(program_OBJS) $(program_NAME)

# C Preprocessor Flags
CPPFLAGS += 
# compiler flags
CFLAGS += -ansi -Wall -Wextra -pedantic-errors

.PHONY: all clean distclean

all: $(program_NAME)

clean:
    @- $(RM) $(clean_list)

distclean: clean

# Generate dependencies for all files in project
%.d: $(program_SRCS)
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@

clean_list += ${program_SRCS:.c=.d}

$(program_NAME): $(program_OBJS)
    indent -linux -brf $(program_SRCS)
    splint $(program_SRCS)
    $(LINK.c) $(program_OBJS) -o $(program_NAME)

ifneq "$(MAKECMDGOALS)" "clean"
# Include the list of dependancies generated for each object file
-include ${program_SRCS:.c=.d}
endif

Это делает две вещи:

  1. Если любой из файлов, от которых зависит foo.c, изменится, то foo.o будет переделан без необходимости переделывать другие файлы в проекте.
  2. Сам файл dep имеет те же зависимости, что и объектный файл, так что если любой из dep изменяется, то сам файл dep также регенерируется, прежде чем будут проверены dep объектного файла.
7
ответ дан 7 December 2019 в 05:23
поделиться

Я думаю, что это ожидаемое поведение для gcc -M , где обычно вы делаете что-то вроде этого:

FOO_SOURCES= \
    src/foo.c \
    src/bar.c

FOO_OBJECTS = $(FOO_SOURCES:.c=.o)
FOO_DEPS = $(FOO_OBJECTS:.o=.d)

(... много целей ...)

-include $(FOO_DEPS)

Примечание, -include not include , поскольку зависимости, очевидно, не будут существовать, пока не будет запущена хотя бы одна сборка. В любом случае зависимости создаются для каждого модуля.

Также обратите внимание, что gcc -M не всегда работает так, как вы ожидаете, в основном в зависимости от того, какую версию gcc вы используете.

Я думаю, что вам нужно что-то под названием makedep , которое делает то, что вы хотите, без использования sed в make-файле.

1
ответ дан 7 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: