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

时间:2014-06-01 04:29:18

标签: makefile

我想创建一个通用的Makefile,它为每个可执行文件使用不同的编译器标志构建几个可执行文件,而不使用shell命令。可执行文件名应由源文件和唯一的固定名称组成。如果需要,它还应该为每个源文件生成一个程序集或预处理器文件。 对于目标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))

生成文件

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

这是目标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

这是使用shell命令从目标MK-BASH输出的。

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

1 个答案:

答案 0 :(得分:0)

使用模式规则:

DBG: $(BIN_DBG_FILES)

%-dbg: %.c
    @echo $(CC) $(DBG_CFLAGS) $(IFLAGS) $< -o $@