我想创建一个通用的Makefile,为每个可执行文件使用不同的编译器标志构建几个可执行文件,而不使用shell命令。可执行文件名应该由源文件和唯一的post固定名称组成。如果需要,它还应该为每个源文件生成一个程序集或预处理器文件。对于目标BIN_BDG_FILES, "$<"(exercise-1.1.0.c)始终是列表(exercise-1.1.0.c exercise-1.1.1.c exercise-1.2.0.c exercise-1.2.1.c)中的第一个项目。我尝试使用filter-out函数修改SRC_FILES,但没有成功。我的目的是从每个Target的列表中删除第一项,以便第一项对应于正确的目标。我不确定这是正确的方法。欢迎您的评论。
。这是我尝试使用内置的make结构。
$(BIN_DBG_FILES): $(SRC_FILES)
$(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@
echo SRC_FILES := $(filter-out $<, $(SRC_FILES))
Makefile
SHELL = bash
SRC_FILES = $(wildcard *.c)
BIN_FILES = $(patsubst %.c,%,$(SRC_FILES))
BIN_DBG_FILES = $(patsubst %.c,%-dbg,$(SRC_FILES))
SRC_PRE = $(patsubst %.c,%-pre,$(SRC_FILES))
CC = gcc
WARNINGS := -Wall
CFLAGS = -O2 -std=c99 $(WARNINGS)
DBG_CFLAGS = -g -O -std=c99 $(WARNINGS)
PRE_FLAG = -E
IFLAGS = -I.
all: $(BIN_FILES) $(BIN_DBG_FILES) MK-BASH
$(BIN_DBG_FILES): $(SRC_FILES)
$(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@
MK-BASH::
for src in $(SRC_FILES); do
echo $(CC) $(DBG_CFLAGS) $(IFLAGS) $$src -o $${src%.c}-dbg;
$(CC) $(DBG_CFLAGS) $(IFLAGS) $$src -o $${src%.c}-dbg;
$(CC) $(DBG_CFLAGS) $(IFLAGS) $$src -o $${src%.c}-dbg;
$(CC) $(PRE_FLAG) $$src > $${src%.c}-pre;
done
clean:
rm -f $(BIN_FILES) *-dbg *-pre
这是执行make命令的输出。
目标BIN_FILES的输出。
gcc -O2 -std=c99 -Wall exercise-1.1.0.c -o exercise-1.1.0
gcc -O2 -std=c99 -Wall exercise-1.1.1.c -o exercise-1.1.1
gcc -O2 -std=c99 -Wall exercise-1.2.0.c -o exercise-1.2.0
gcc -O2 -std=c99 -Wall exercise-1.2.1.c -o exercise-1.2.1
这是target BIN_DBG_FILES的输出,它使用列表中的第一个源文件来构建所有目标。它应该使用适当的文件(exercise-1.1.1.c)来构建每个目标文件(exercise-1.1.1-dbg)。
gcc -g -O -std=c99 -Wall -I. **exercise-1.1.0.c** -o exercise-1.1.0-dbg
gcc -g -O -std=c99 -Wall -I. **exercise-1.1.0.c** -o exercise-1.1.1-dbg
gcc -g -O -std=c99 -Wall -I. **exercise-1.1.0.c** -o exercise-1.2.0-dbg
gcc -g -O -std=c99 -Wall -I. **exercise-1.1.0.c** -o exercise-1.2.1-dbg
这是目标MK-BASH使用shell命令的输出。
for src in exercise-1.1.0.c exercise-1.1.1.c exercise-1.2.0.c exercise-1.2.1.c; do
echo gcc -g -O -std=c99 -Wall -I. $src -o ${src%.c}-dbg;
gcc -g -O -std=c99 -Wall -I. $src -o ${src%.c}-dbg;
gcc -g -O -std=c99 -Wall -I. $src -o ${src%.c}-dbg;
gcc -E $src > ${src%.c}-pre;
done
输出:gcc -g -O -std=c99 -Wall -I. exercise-1.1.0.c -o exercise-1.1.0-dbg
gcc -g -O -std=c99 -Wall -I. exercise-1.1.1.c -o exercise-1.1.1-dbg
gcc -g -O -std=c99 -Wall -I. exercise-1.2.0.c -o exercise-1.2.0-dbg
gcc -g -O -std=c99 -Wall -I. exercise-1.2.1.c -o exercise-1.2.1-dbg
使用模式规则:
DBG: $(BIN_DBG_FILES)
%-dbg: %.c
@echo $(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@