makefile - 是否可以创建一个对不同文件重复操作的目标?
问题描述
我正在尝试构建一个简化 C 分配编译的 Makefile。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 在除图像之外的所有其他命令上都可以正常工作。
如果你们中的任何人可以提供帮助,那将意味着很多!
解决方案
您的定义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
根据此规则查找或生成输入。
推荐阅读
- react-native - 如何在 React Native Elements 库的 Overlay 组件的子组件上启用 onPress?
- spring - Activiti TimerBoundaryEvent 立即超时
- java - 在 Java 中比较不同格式的 2 个日期?
- javascript - 当我遍历整个项目数组时,如何仅显示一次标题?
- angular - 如何让 ngx-mask npm 包用于在 Angular 中屏蔽电话号码?
- stackdriver - 来自有效负载(Stackdrive)的 GCP 日志记录有效负载
- swift - VoiceOver 不会宣布 NSAccessibility 通知
- jupyter-notebook - Jupyter Notebook - 未使用 Numba 和 Dask 定义的全局名称
- azure-active-directory - 为什么 MSAL 返回的 JWT 令牌的 amr 字段有时会有 wia 或 mfa?
- c# - 通过多个语句过滤数据表