防止make删除从.def文件生成的源文件

时间:2019-09-12 08:46:06

标签: c linux bash makefile

我不完全知道.def文件的使用方式以及它们的用途,尽管我希望在创建它们的对应对象后不删除与.def文件同名的源文件文件。反正有这样做吗?

更具体地说,我正在bash-4.1上工作,我看到许多.def文件,例如builtins/suspend.def,执行make后,suspend.o是使用{ {1}},在发布make之前不存在,但是在compile命令之后也被删除。如何停止make删除这些源文件?

1 个答案:

答案 0 :(得分:3)

Tar文件中的文件builtins/Makefile.in链接到您在以下问题中看到的对suspend的引用

DEFSRC =  $(srcdir)/alias.def $(srcdir)/bind.def $(srcdir)/break.def \
# ...
          $(srcdir)/source.def $(srcdir)/suspend.def $(srcdir)/test.def \
# ...

OFILES = builtins.o \
# ...
        pushd.o read.o return.o set.o setattr.o shift.o source.o \
        suspend.o test.o times.o trap.o type.o ulimit.o umask.o \
        wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o complete.o

Makefile.in包含以下模式规则:

# How to make a .o file from a .def file.
.def.o:
        $(RM) $@
        ./$(MKBUILTINS) $(DIRECTDEFINE) $<
        $(CC) -c $(CCFLAGS) $*.c || ( $(RM) $*.c ; exit 1 )
        $(RM) $*.c

# How to make a .c file from a .def file.
.def.c:
        $(RM) $@
        ./$(MKBUILTINS) $(DIRECTDEFINE) $<

# default rule for making a .o file from a .c file
.c.o:
        $(RM) $@
        $(CC) -c $(CCFLAGS) $<

由于仅存在文件suspend.def,而未明确提及文件suspend.c,因此对象suspend.o将由包含{p >

.def.o:

作为最后一个命令。

您可以删除或注释此行。
如果编译失败,该规则还将删除相应的 $(RM) $*.c 文件。如有必要,您也可以删除它。

请注意,此修改可能会更改后续构建的行为,因为.c将考虑现有的.c文件。

根据要求提供的其他信息:

make规则中可以看到,Makefile文件将使用来处理

.def

这将调用带有附加参数 ./$(MKBUILTINS) $(DIRECTDEFINE) $< 和相关性文件($(MKBUILTINS))(即匹配的$(DIRECTDEFINE))的附加参数-D $(srcdir)(定义为$<.def文件。 MKBUILTINS被定义为mkbuiltins$(EXEEXT),可能是mkbuiltinsmkbuiltins.exe

根据上下文,我可以猜测,mkbuiltins将根据.c文件创建一个相应的.def文件。

再次从Makefile中可以看到,mkbuiltins是使用mkbuiltins.cconfig.h构建的。检查源代码或在bash相关论坛中询问mkbuiltins到底会做什么。