我有一个带有许多.c和.s文件的项目。为每个人写出单个规则是麻烦,我以前对.c文件的限制。
$(OBJ_DIR)/%.o : %.c %.h
*recipe*
虽然对于只有C源文件的项目来说,它可以正常工作,但它将无法与带有汇编文件的项目一起使用。
我已经阅读了gnu.org上的文档,并且无法找到一种在不使用模式的情况下在先决条件中引用目标名称词干甚至整个目标名称的方法。我想沿着这些线做一些事情。
$(C_OBJ_FILES) : %.c %.h # Where % WOULD be the stem of the target name
$(AS_OBJ_FILES) : %.s # Where % WOULD be......
我目前有单独的目录,用于从汇编源和用C源编译的对象编译的对象。在这种情况下,我想将它们放在同一目录中。我还考虑了创建一个隐藏的符号链接,该链接指向我可以用来区分汇编和C源文件的对象目录,但这再次无法解决我的问题。
编辑:我不是在寻找避免引用目标名称的工作,因为能够在先决条件中引用它会帮助我的makefiles的其他几个部分。如果这绝对是不可能的,请这样说,这会回答我的问题。
您要寻找的是静态模式规则:
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 $@
标准方法是:
all: x.o y.o z.o
%.o: %.s
*recipe*
%.o: %.c
*recipe*
,然后依赖性可以填充诸如C标题之类的及传递深度。"写出单个规则"不是"麻烦",您只需让程序自动执行。
在make
上下文中,您对"避免引用目标名称"($@
)的评论只是奇怪的。您听起来好像您宁愿根本不愿意表达dag,而宁愿写一个乏味的重复的伯恩脚本来描述您的构建过程。我鼓励您拥抱制作模式,它们是表达问题的自然方式,并将帮助您用几行代码来描述您的要求。