这段代码在 pmoncfg 工具的 makefile 中是什么意思?

What does this code mean in the makefile of pmoncfg tool?

BISON?= bison -y
PROG=   pmoncfg
SRCS=   files.c gram.y hash.c main.c mkheaders.c mkioconf.c mkmakefile.c 
OBJS=   files.o hash.o main.o mkheaders.o mkioconf.o mkmakefile.o pack.o       
CFLAGS+=-I${.CURDIR} -I. -DYY_SKIP_YYWRAP
LEX=flex
CLEANFILES=gram.c scan.c gram.h pmoncfg.cat8
MAN=    pmoncfg.8
.y.c:
    ${BISON} -d -o $@ $< 
${PROG}: ${OBJS}
    ${CC} -o $@ ${OBJS} ${LIBS}
install:
    cp ${PROG} ${DESTDIR}/bin
clean:
    ${RM} -rf ${OBJS} ${CLEANFILES} ${PROG}

".y.c: ${BISON} -d -o $@ $<" 这行是什么意思?当前文件夹中没有 .y 文件。还有 MAN 和 LEX 变量,makefile 没有使用它,either.Why 声明它们?

根据最新的隐式规则,我可以只写“${PROG}: ${OBJS} ${CC} -o $@ ${OBJS} ${LIBS}”吗?

这里的混乱来源似乎是由于 一些 目标依赖隐式规则。查看 https://github.com/kisom/pmon/tree/master/tools/pmoncfg,文件 pmoncfg.8 是手册页源(因此将通过隐式规则生成 pmoncfg.cat8)并且 scan.l 是 Lex 文件(因此 scan.c 将使用 flex 生成,因为标准隐式规则将程序参数化以在变量 LEX 中使用)。与你写的相反,有一个文件 gram.y 用于使用 bison.

生成 gram.c

make的工作是找到可以从其他文件生成的文件。像 .y.c 这样的模式规则意味着如果需要 .c 文件但缺少,但是有相应的 .y 文件,这里是如何生成所需的 .c 文件。如果文件已经存在(并且比它所依赖的文件新),什么都不做。如果一个文件已经存在并且没有任何东西可以生成它,显然不需要做任何事情(如果它丢失并且没有关于如何生成它的规则,make 会发出错误信号)。