如何正确设置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_FILE
和 BISON_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
你好,我有一些小程序,它们中的每一个都将被单独编译和运行。
我正计划使用目标特定变量来制作不同的程序,因为它会被目标的先决条件递归继承。因此我可以保留编译目标的依赖结构,并充分利用重复的命令。
以下是当前的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_FILE
和 BISON_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