我不完全知道.def
文件的使用方式以及它们的用途,尽管我希望在创建它们的对应对象后不删除与.def
文件同名的源文件文件。反正有这样做吗?
更具体地说,我正在bash-4.1上工作,我看到许多.def
文件,例如builtins/suspend.def
,执行make
后,suspend.o
是使用{ {1}},在发布make之前不存在,但是在compile命令之后也被删除。如何停止make删除这些源文件?
答案 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)
,可能是mkbuiltins
或mkbuiltins.exe
。
根据上下文,我可以猜测,mkbuiltins
将根据.c
文件创建一个相应的.def
文件。
再次从Makefile
中可以看到,mkbuiltins
是使用mkbuiltins.c
从config.h
构建的。检查源代码或在bash
相关论坛中询问mkbuiltins
到底会做什么。