我有一个包含许多.c和.s文件的项目。为每个规则编写单独的规则是一件麻烦事,我以前为.c文件所做的就是这个。
$(OBJ_DIR)/%.o : %.c %.h
*recipe*
虽然这对于只有c源文件的项目很有效,但它不适用于带有汇编文件的项目。
我已经阅读了gnu.org上关于make的文档,并且无法在不使用模式的情况下找出在先决条件中引用目标名称的词干甚至整个目标名称的方法。我想沿着这些方向做点什么。
$(C_OBJ_FILES) : %.c %.h # Where % WOULD be the stem of the target name
$(AS_OBJ_FILES) : %.s # Where % WOULD be......
我目前有针对从汇编源编译的对象和使用c源编译的对象的单独目录。虽然这有效,但我希望将它们放在同一目录中。我还考虑创建一个隐藏的符号链接,指向我可以用来区分汇编和c源文件的对象目录,但同样,这并没有解决我的问题。
编辑:我不是在寻找可以避免引用目标名称的工作,因为能够在先决条件中引用它将有助于我的Makefile的其他几个部分。如果这绝对不可能,那么这样说,那就回答我的问题。
答案 0 :(得分:1)
您正在寻找的可能是static pattern rules:
C_OBJ_FILES = $(patsubst %.c,$(OBJ_DIR)/%.o,$(wildcard *.c))
AS_OBJ_FILES = $(patsubst %.s,$(OBJ_DIR)/%.o,$(wildcard *.s))
# static pattern rule for C files
$(C_OBJ_FILES) : $(OBJ_DIR)/%.o : %.c %.h
<recipe>
# static pattern rule for assembly files
$(AS_OBJ_FILES) : $(OBJ_DIR)/%.o : %.s
<recipe>
在您的食谱中,您可以使用$@
,$<
和$*
;它们将分别扩展为目标(目标文件),第一个先决条件(C或汇编源文件)和词干(C或汇编源文件的基本名称)。例如:
# static pattern rule for C files
$(C_OBJ_FILES) : $(OBJ_DIR)/%.o : %.c %.h
@echo '[CC] $*' && \
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
答案 1 :(得分:0)
标准方法是:
all: x.o y.o z.o
%.o: %.s
*recipe*
%.o: %.c
*recipe*
然后makedepend可以填写传递deps,例如C头。它不是一个麻烦&#34;麻烦&#34; to&#34;写出单独的规则&#34;,你只需让程序自动完成。
您对&#34;避免引用目标名称的评论&#34; ($@
)在make
上下文中只是奇怪的。你让它听起来像你根本不在Makefile中表达DAG,你宁愿写一个冗长重复的Bourne脚本来描述你的构建过程。我鼓励您接受制作patterns,它们是表达问题的自然方式,并且只需几行代码即可帮助您描述您的要求。