首页 > 解决方案 > 是否可以创建一个对不同文件重复操作的目标?

问题描述

我正在尝试构建一个简化 C 分配编译的 Makefile。Makefile 现在工作正常,但是,我想添加一个新目标来执行以前的目标并创建文件。

目标如下:

我知道如何转换单个文件(我有命令),但似乎无法弄清楚如何循环遍历每个文件,而无需将它们全部输入。

我已经尝试过做不同类型的目标,但不起作用(见评论目标)

# 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 在除图像之外的所有其他命令上都可以正常工作。

如果你们中的任何人可以提供帮助,那将意味着很多!

标签: makefile

解决方案


您的定义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);因此,如果您尝试 make $(FIGS)/ick.pdf,则意味着make需要$(FIGS)/$(FIGS)/ick.gv根据此规则查找或生成输入。


推荐阅读