GNU make: как предотвратить '-include file.ext' от выполнения правила, целью которого является 'file.ext'? - PullRequest
0 голосов
/ 01 июня 2019

Просто, чтобы посмотреть терминологию, это структура make-файла 'rule':

target:   dependencies ...
          commands
          ...

Это make-файл, который я написал:

CC = mpicc
SHAREDLIB = libfmd.so
CFLAGS = -fPIC -Wall -Wno-unused-result -O3 -fopenmp
LFLAGS = -lm -fopenmp -lgsl -lgslcblas

OBJS = $(patsubst %.c,%.o,$(wildcard *.c))

.PHONY: all shared clean
all: shared
shared: $(SHAREDLIB)
$(SHAREDLIB): depend.mk $(OBJS)
    $(CC) $(OBJS) -shared -o $@ $(LFLAGS)
depend.mk: *.c *.h
    $(CC) -MM *.c > depend.mk
-include depend.mk
clean:
    rm -f *.o libfmd.so depend.mk

Когда папка чистая, и я ввожу make clean, отображаются следующие строки:

mpicc -MM *.c > depend.mk
rm -f *.o libfmd.so depend.mk

Мне кажется, что -include depend.mk в дополнение к включению depend.mk выполняет правило, что depend.mk является его целью. Я бы хотел остановить это поведение.

Ответы [ 2 ]

1 голос
/ 01 июня 2019
depend.mk: *.c *.h
    $(CC) -MM *.c > depend.mk

К вашему сведению, это неправильно, так как make не поддерживает подстановочные знаки оболочки в строке правила.Хотя в строке рецептов, которая может работать, поскольку она расширяется самой оболочкой.

Я бы хотел остановить это поведение

зависимость.является обязательным условием для цели по умолчанию, поэтому она в любом случае является целью.

Кроме того, предварительная обработка в depen.mk является медленной для больших проектов, поэтому имеет смысл либо переключиться на написанные вручную зависимости, либо использовать рекомендованныеспособ генерировать их, как предложил @MadScientist.

1 голос
/ 01 июня 2019

Вы правы. См. Как восстанавливаются файлы Makefile в документации.

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

Вопрос в том, почему вы хотите этого избежать? Возможно, если бы вы объяснили поведение, которое вы на самом деле ищете на более высоком уровне, мы могли бы помочь. Поскольку у вас есть это здесь, возможно, что файлы .o могут быть созданы без создания какого-либо файла depen.mk, тогда компиляция завершится неудачно, вы измените файл заголовка, чтобы исправить это, но так как файл зависимость.mk не существует, когда вы -run сделать, чтобы исходные файлы не были перестроены должным образом.

Если вы хотите получить точную обработку зависимостей C / C ++ с помощью GCC, вы можете взглянуть на Генерация автозависимостей .

...