如何正确设置makefile来编译不同的相关文件?

How to properly set makfile to compile different related files?

你好,我有一些小程序,它们中的每一个都将被单独编译和运行。

我正计划使用目标特定变量来制作不同的程序,因为它会被目标的先决条件递归继承。因此我可以保留编译目标的依赖结构,并充分利用重复的命令。

以下是当前的makefile:

# Variables =====================================================================================
PHONY           = 
# Main*****************************************
LEX_FILE    = wc.l
BISON_FILE  = yacc.y
BISON_OUT   = $(subst .y,,$(BISON_FILE)).tab.c $(subst .y,,$(BISON_FILE)).tab.h
LEX_OUT     = $(subst .l,,$(LEX_FILE)).yy.c
CFLAGS      = -g -lfl
# Flex ==========================================================================================
$(LEX_OUT):$(LEX_FILE) $(BISON_OUT)
    flex --outfile=$@ $<

PHONY += lex_clean
# Bison =========================================================================================
$(BISON_OUT):$(BISON_FILE)
    bison -d $<

PHONY += bison_clean
# Run ===========================================================================================
run.out:$(LEX_OUT) $(BISON_OUT)
    gcc $(CFLAGS) $(word 1,$^) $(word 2,$^) -o $@
run_lex.out:$(LEX_OUT)
    gcc $(CFLAGS) $(word 1,$^) -o $@
run:run.out
    ./$<
run_lex:run_lex.out
    ./$< $(BISON_OUT)

PHONY += run run_wc
# Clean =========================================================================================
clean:
    -rm *.out *.yy.c *.tab.h *.tab.c

PHONY += clean
# PHONY =========================================================================================
.PHONY: $(PHONY)

现在不同的只有 LEX_FILEBISON_FILE,其他的将基于这些文件。

构建过程基本相同,只是有些只构建flex或bision。

所以想请教下makefile有没有什么好的办法??

非常感谢!!

# $@  表示目标文件
# $^  表示所有的依赖文件
# $<  表示第一个依赖文件
# $?  表示比目标还要新的依赖文件列表
# Variables =====================================================================================
PHONY           = 
# Main*****************************************
proj        = main
ifeq ($(proj),wc)
    LEX_FILE = wc.l
else ifeq ($(proj),ab)
    LEX_FILE    = lex.l
    BISON_FILE  = yacc.y
else
    LEX_FILE    = lex.l
    BISON_FILE  = yacc.y
endif
BISON_OUT   = $(subst .y,,$(BISON_FILE)).tab.c $(subst .y,,$(BISON_FILE)).tab.h
LEX_OUT     = $(subst .l,,$(LEX_FILE)).yy.c
CFLAGS      = -g -lfl
# Flex ==========================================================================================
$(LEX_OUT):$(LEX_FILE) $(BISON_OUT)
    @echo $(BISON_FILE)
    @echo $(BISON_OUT)
    flex --outfile=$@ $<

# Bison =========================================================================================
$(BISON_OUT):$(BISON_FILE)
ifneq ($(BISON_FILE),)
    @echo $(BISON_FILE)
    bison -d $<
endif

# Run ===========================================================================================
$(proj).out:$(LEX_OUT) $(BISON_OUT)
ifneq ($(BISON_FILE),)
    gcc $(CFLAGS) $(word 1,$^) $(word 2,$^) -o $@
else
    gcc $(CFLAGS) $(word 1,$^) -o $@
endif

run:$(proj).out
    ./$<

PHONY += run run_wc
# Clean =========================================================================================
clean:
    -rm *.out *.yy.c *.tab.h *.tab.c *.s

PHONY += clean
# PHONY =========================================================================================
.PHONY: $(PHONY)

make proj=wc run

make proj=ab run