使用不同标志创建多个可执行文件的通用makefile

使用不同标志创建多个可执行文件的通用makefile,makefile,Makefile,我想创建一个通用的Makefile,它为每个可执行文件使用不同的编译器标志构建多个可执行文件,而不使用shell命令。可执行文件名应由源文件和唯一的post固定名称组成。如果需要,它还应该为每个源文件生成一个程序集或预处理器文件。 对于目标BIN_BDG_文件,“$使用模式规则: DBG: $(BIN_DBG_FILES) %-dbg: %.c @echo $(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@ DBG:$(BIN\u DBG\u文件) %

我想创建一个通用的Makefile,它为每个可执行文件使用不同的编译器标志构建多个可执行文件,而不使用shell命令。可执行文件名应由源文件和唯一的post固定名称组成。如果需要,它还应该为每个源文件生成一个程序集或预处理器文件。 对于目标BIN_BDG_文件,“$使用模式规则:

DBG: $(BIN_DBG_FILES)

%-dbg: %.c
    @echo $(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@
DBG:$(BIN\u DBG\u文件)
%-dbg:%
@echo$(CC)$(DBG\U CFLAGS)$(IFLAGS)$<-o$@

你的问题是什么?你能解释一下“可执行文件名应该由源文件和唯一的post固定名称组成吗?”“?如果在带有Makefile文件的目录中有三个C源文件,file1.C、file2.C和file3.C,并且使用调试选项编译可执行文件,则可执行文件可以分别命名为file1 dbg、file2 dbg和file3 dbg。这是一个文件名。c将有一个可执行文件名{}。在本例中,如果后缀名为“-dbg”,则示例名称为filename-dbg。我的问题是如何为BIN_dbg_文件编写等效的目标规则,以便在不使用shell命令的情况下生成与目标规则MK-BASH相同的结果。BIN_BDG_文件的目标规则输出显示目标exercise-1.1-dbg、exercise-1.2.0-dbg和exercise-1.2.1-dbg都使用execise-1.1.0.c创建目标,这不是我的意图。如MK-BASH的目标规则输出所示,相应的目标应使用execise-1.1.1.c、execise-1.2.0.c和execise-1.2.1.c。目标规则MK-BASH的问题是,即使源文件未修改,它也始终编译目标。如果实现正确,我假设目标规则BIN_BDG_文件将具有与BIN_文件中使用的隐式目标规则相同的优点。这是一个只有在其先决条件被修改后才能重建的目标。我感谢您的帮助,这是我想要的解决这个问题的方法。谢谢
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  
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
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
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 $@