Можно ли создать цель, которая повторяет действие для разных файлов? - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь создать Makefile, который упрощает компиляцию для C-назначения. На данный момент Makefile работает нормально, однако я хотел бы добавить новую цель, которая выполняет предыдущую цель и создает файлы.

Цель состоит в следующем:

  • Скомпилируйте данную программу (figures.c)
  • Выполните его (это создаст кучу .gv файлов)
  • Преобразование каждого файла .gv в .pdf файл

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

Я уже пытался сделать другой тип цели, но не работает (см. Закомментированную цель)

# COMPILATION

CC=gcc
CFLAGS=-Wall -ansi -pedantic

# DOSSIERS

SOURCEDOC=sourcedoc
DOC=doc
SRC=src
INC=inc
OBJ=build
FIGS=images

FILES=$(wildcard $(FIGS)/*.gv)

.PHONY: clean doc archive author all

.SILENT : clean


#                  Targets

all : clean test images

test : $(OBJ)/Test_arbre.o $(OBJ)/aux.o $(OBJ)/Affichage.o $(OBJ)/ArbreBinaire.o $(OBJ)/arbres.o
    $(CC) $^ -o $@ $(CFLAGS)

figures : $(OBJ)/figures.o $(OBJ)/Affichage.o $(OBJ)/ArbreBinaire.o $(OBJ)/aux.o $(OBJ)/arbres.o
    $(CC) $^ -o $@ $(CFLAGS)

%.pdf: $(FIGS)/%.gv
    dot -Tpdf -o $(FIGS)/$@ $^

#$(FILES): $(FIGS)/%.pdf : $(FIGS)/%.gv
#   dot -Tpdf -o $@ $^

images : figures $(FILES)

#=========== Objets ===========

$(OBJ)/arbres.o : $(INC)/arbres.h $(INC)/aux.h $(INC)/Affichage.h $(INC)/ArbreBinaire.h

$(OBJ)/Affichage.o : $(INC)/Affichage.h $(INC)/ArbreBinaire.h

$(OBJ)/exemple*_arbre.o : $(INC)/Affichage.h $(INC)/ArbreBinaire.h

$(OBJ)/aux.o : $(INC)/aux.h

$(OBJ)/figures.o : $(INC)/Affichage.h $(INC)/ArbreBinaire.h $(INC)/arbres.h

$(OBJ)/Test_arbre.o : $(INC)/arbres.h $(INC)/ArbreBinaire.h $(INC)/Affichage.h


#                  Dummy rule

$(OBJ)/%.o : $(SRC)/%.c
    @mkdir -p $(@D)
    @$(CC) $< $(CFLAGS) -I $(INC)/ -c -o $@


#                 Miscellaneous

clean:
    rm -f *~ */*~
    rm -rf __pycache__ src/__pycache__
    rm -rf $(DOC)
    rm -f $(PROJECT)_$(AUTHOR12)_$(AUTHOR22).zip
    rm -f conf.py-e
    rm -rf $(OBJ)
    rm -f $(FIGS)/*.pdf $(FIGS)/*.gv
    rm -f test

Текущий Makefile отлично работает со всеми другими командами, кроме изображений.

Если бы кто-нибудь из вас мог помочь, это бы много значило!

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Если вы абсолютно не можете предсказать, какие файлы будут созданы на шаге (2) (и ограничены использованием $(wildcard ...)), вы все равно должны выполнить его после завершения (2).

Это ужасно, но я не могу придумать лучшей альтернативы, чем использование "рекурсивного создания".Я имею в виду что-то вроде этого:

...
.PHONY: images pdf
images: figures
    # use figures to generate all .gv files
    #@figures --create-all-gv-files
    # invoke make recursively
    @$(MAKE) --no-print-directory pdf

# ensure $(wildcard ...) is invoked only if needed
ifeq ($(MAKECMDGOALS),pdf)
    PDF_FILES:=$(patsubst %.gv,%.pdf,$(wildcard $(FIGS)/*.gv))
endif

pdf: $(PDF_FILES)
%.pdf: %.gv
    dot -Tpdf -o $@ $<
1 голос
/ 31 марта 2019

Ваше определение FILES должно отображать файлы *.gv в соответствующие файлы *.pdf;

FILES=$(patsubst %.gv,%.pdf,$(wildcard $(FIGS)/*.gv))

Правило, которое говорит, как генерировать PDF, должно учитывать имя каталога;

%.pdf: %.gv
    dot -Tpdf -o $@ $^

Теперь, если make попытается создать $(FIGS)/ick.pdf, вход будет $(FIGS)/ick.gv - шаблон говорит о замене расширения .gv расширением .pdf, а остальныеимя файла остается неизменным, так же, как вы хотели бы.Правило типа

%.pdf: $(FIGS)/%.gv  # error, don't use

гласит, что вам нужно найти исходный файл в подкаталоге $(FIGS);так что если вы попытались сделать $(FIGS)/ick.pdf, это значит, что make потребуется найти или сгенерировать $(FIGS)/$(FIGS)/ick.gv в качестве ввода в соответствии с этим правилом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...