I m 编印Lex和Yacc。 为了汇编我的<代码>main,首先需要打上文件ytab.h
。 然而,我不想将这一档案列入<代码>$的变数中,因为汇编者不喜欢把该文档列入main
。
是否有办法使这一规则/对应办法取决于y.tab.h
,但将其排除在$^/code>之外?
如果不是的话,(如果这个问题是一个XY问题的话),是否有更好的办法来安排这一文件,以实现这一目标?
我在此作如下陈述:
targets := ccpy
################################### Options ####################################
cc := gcc
cFlags := -c -O3
cFlagsLenient := $(cFlags) -w
cFlagsHard := $(cFlags) -Wall -pedantic
cFlagsDebug := -c -W -Wall -pedantic -g -Og
ldFlags := -lm -ly -ll
ldFlagsDebug := -g $(ldFlags)
################################### Folders ####################################
binDir := ./bin
debugDir := ./debug
objDir := ./obj
srcDir := ./src
testDir := ./test
################################ File categories ###############################
mains := $(targets:%=$(objDir)/%.o)
srcL := $(wildcard $(srcDir)/*.l)
srcY := $(wildcard $(srcDir)/*.y)
outL := $(srcL:$(srcDir)/%.l=$(srcDir)/%.c)
outY := $(srcY:$(srcDir)/%.y=$(srcDir)/%.c)
objL := $(outL:$(srcDir)/%.c=$(objDir)/%.o)
objY := $(outY:$(srcDir)/%.c=$(objDir)/%.o)
cleanY := $(outY) $(srcY:$(srcDir)/%.y=$(srcDir)/%.h) $(srcDir)/y.output $(srcdir)/y.gv
srcC := $(filter-out $(outL) $(outY), $(wildcard $(srcDir)/*.c))
objC := $(srcC:$(srcDir)/%.c=$(objDir)/%.o)
obj := $(objC) $(objL) $(objY)
objDebug := $(obj:$(objDir)/%.o=$(debugDir)/%.do)
srcTest := $(wildcard $(testDir)/*.c)
tests := $(srcTest:$(testDir)/%.c=$(binDir)/%)
#################################### Recipes ###################################
# Basic
all : $(targets)
again : clean all
debug: $(targets:%=%.db)
test : $(tests)
objects: $(obj)
# Check Variables
info:
$(info mains : $(mains))
$(info srcC : $(srcC))
$(info objC : $(objC))
$(info srcL : $(srcL))
$(info outL : $(outL))
$(info objL : $(objL))
$(info srcY : $(srcY))
$(info outY : $(outY))
$(info objY : $(objY))
$(info obj : $(obj))
$(info objDebug : $(objDebug))
$(info srcTest : $(srcTest))
$(info tests : $(tests))
# Final Executables
$(targets): % : $(objDir)/%.o $(obj)
$(cc) -o $@ $^ $(ldFlags)
# Objects directly compiled from C
$(objC): $(objDir)/%.o : $(srcDir)/%.c
$(cc) $(cFlagsHard) $^ -o $@
# Objects made by Lex and Yacc
$(objL) $(objY): $(objDir)/%.o : $(srcDir)/%.c
$(cc) $(cFlagsLenient) $^ -o $@
# Files made by Lex
$(outL): $(srcDir)/%.c : $(srcDir)/%.l $(outY)
lex -o $@ $<
# Files made by Yacc
$(outY): $(srcDir)/%.c : $(srcDir)/%.y
yacc -v -d -Wcounterexamples --file-prefix="$(srcDir)/y" $^
# Debug executables (outdated)
$(targets:%=%.db): $(objDebug)
$(cc) -o $@ $^ $(ldFlagsDebug)
# Debug objects (outdated)
$(objDebug): $(debugDir)/%.do : $(srcDir)/%.c
$(cc) $(cFlagsDebug) $^ -o $@
# Automated testing
$(tests): $(binDir)/%_test : $(testDir)/%_test.c $(filter-out $(mains), $(obj))
$(cc) -o $@ $^ $(ldFlags)
$@
clean:
rm -rf $(objDir)/*.o $(debugDir)/*.do $(targets) $(tests) $(cleanY) $(outL)