makefile";“删除中间文件”;只是有时候

makefile";“删除中间文件”;只是有时候,makefile,gnu-make,Makefile,Gnu Make,make正在删除使用我自己的规则(不是隐式规则)创建的文件 我有一个按预期工作的makefile,如下所示: OBJ = assert.o DEP = $(OBJ:.o=.d) ################################################################################ # target: dependencies # action PHONY := all all: $(subst .a.o,.a.

make正在删除使用我自己的规则(不是隐式规则)创建的文件

我有一个按预期工作的makefile,如下所示:


OBJ     = assert.o

DEP     = $(OBJ:.o=.d)

################################################################################
# target: dependencies
#   action

PHONY := all
all: $(subst .a.o,.a.o ,$(join $(OBJ:.o=.a.o),$(OBJ:.o=.so.o)))
    @:


%.d: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC -M   build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$*.a.s" -MT"$*.so.s" -M $< -MF $@
%.a.s: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_A) -S $< -o $@
%.so.s: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_SO) -S $< -o $@
%.o: %.s
    @echo   "   AS  build/tmp/base/assert/$@"
    $(Q)$(AS) $< -o $@

include $(DEP)


PHONY += clean
clean:
    $(Q)rm -f *.o *.s

################################################################################
# Declare the contents of the .PHONY variable as phony.
.PHONY: $(PHONY)
OBJ     = $(CURDIR)/tcp/client.o

DEP     = $(OBJ:.o=.d)
BOTH_OBJ    = $(subst .a.o,.a.o ,$(join $(OBJ:.o=.a.o),$(OBJ:.o=.so.o)))
#BOTH_ASM   = $(BOTH_OBJ:.o=.s)

################################################################################
# target: dependencies
#   action

PHONY := all
all: $(BOTH_OBJ)
    @:


$(CURDIR)/%.d: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC -M   build/tmp/base/socket/$*.d"
    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$*.a.s" -MT"$*.so.s" -M $< -MF $@
$(CURDIR)/%.a.s: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/socket/$*.a.s"
    $(Q)$(CC) $(CFLAGS_A) -S $< -o $@
$(CURDIR)/%.so.s: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/socket/$*.so.s"
    $(Q)$(CC) $(CFLAGS_SO) -S $< -o $@
$(CURDIR)/%.o: $(CURDIR)/%.s
    @echo   "   AS  build/tmp/base/socket/$*.o"
    $(Q)$(AS) $< -o $@

include $(DEP)


PHONY += clean
clean:
    $(Q)rm -rf *.o *.s

################################################################################
# Declare the contents of the PHONY variable as phony.
.PHONY: $(PHONY)


#.PRECIOUS: $(BOTH_ASM)
然后我有另一个makefile,我必须处理子目录,我必须解决一个问题:%s不能很好地处理。生成文件如下所示:


OBJ     = assert.o

DEP     = $(OBJ:.o=.d)

################################################################################
# target: dependencies
#   action

PHONY := all
all: $(subst .a.o,.a.o ,$(join $(OBJ:.o=.a.o),$(OBJ:.o=.so.o)))
    @:


%.d: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC -M   build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$*.a.s" -MT"$*.so.s" -M $< -MF $@
%.a.s: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_A) -S $< -o $@
%.so.s: $(SRC_DIR)/base/assert/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/assert/$@"
    $(Q)$(CC) $(CFLAGS_SO) -S $< -o $@
%.o: %.s
    @echo   "   AS  build/tmp/base/assert/$@"
    $(Q)$(AS) $< -o $@

include $(DEP)


PHONY += clean
clean:
    $(Q)rm -f *.o *.s

################################################################################
# Declare the contents of the .PHONY variable as phony.
.PHONY: $(PHONY)
OBJ     = $(CURDIR)/tcp/client.o

DEP     = $(OBJ:.o=.d)
BOTH_OBJ    = $(subst .a.o,.a.o ,$(join $(OBJ:.o=.a.o),$(OBJ:.o=.so.o)))
#BOTH_ASM   = $(BOTH_OBJ:.o=.s)

################################################################################
# target: dependencies
#   action

PHONY := all
all: $(BOTH_OBJ)
    @:


$(CURDIR)/%.d: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC -M   build/tmp/base/socket/$*.d"
    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$*.a.s" -MT"$*.so.s" -M $< -MF $@
$(CURDIR)/%.a.s: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/socket/$*.a.s"
    $(Q)$(CC) $(CFLAGS_A) -S $< -o $@
$(CURDIR)/%.so.s: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC  build/tmp/base/socket/$*.so.s"
    $(Q)$(CC) $(CFLAGS_SO) -S $< -o $@
$(CURDIR)/%.o: $(CURDIR)/%.s
    @echo   "   AS  build/tmp/base/socket/$*.o"
    $(Q)$(AS) $< -o $@

include $(DEP)


PHONY += clean
clean:
    $(Q)rm -rf *.o *.s

################################################################################
# Declare the contents of the PHONY variable as phony.
.PHONY: $(PHONY)


#.PRECIOUS: $(BOTH_ASM)
我找到了。但是我看不出这两个makefile之间有什么区别。它应该删除两个文件中的文件,或者在我看来没有。为什么只删除第二个makefile中的文件


取消注释.PRECIOUS似乎会阻止删除,但我不确定是否隐藏了不好的内容。

我忘记在由
gcc
生成的依赖项文件的目标名称中添加
$(CURDIR)/

这条线解决了以下问题:

    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$(CURDIR)/$*.a.s" -MT"$(CURDIR)/$*.so.s" -M $< -MF $@
$(Q)$(CC)$(CFLAGS_A)-MG-MT“$@”-MT“$(CURDIR)/$*.A.s”-MT“$(CURDIR)/$*.so.s”-M$<-MF$@
因此,完整规则如下:

$(CURDIR)/%.d: $(SRC_DIR)/base/socket/%.c
    $(Q)mkdir -p        $(@D)/
    @echo   "   CC -M   build/tmp/base/socket/$*.d"
    $(Q)$(CC) $(CFLAGS_A) -MG -MT"$@" -MT"$(CURDIR)/$*.a.s" -MT"$(CURDIR)/$*.so.s" -M $< -MF $@
$(CURDIR)/%.d:$(SRC_DIR)/base/socket/%.c
$(Q)mkdir-p$(@D)/
@echo“CC-M build/tmp/base/socket/$*.d”
$(Q)$(CC)$(CFLAGS_A)-MG-MT“$@”-MT“$(CURDIR)/$*.A.s”-MT“$(CURDIR)/$*.so.s”-M$<-MF$@

我还不完全清楚:你是说这一更正解决了你的问题吗?@JohnBollinger确实如此。s文件不再被删除,我也不太懂汇编,但它们看起来很不错。我还没有链接,但我猜结果库是有效的。之前没有删除它们的原因是依赖项(通过
include$(DEP)包含)
列出了目标中的文件,因此它们不被视为中间文件。当路径错误时失败的原因是,包含的文件列出了错误的目标,因此makefile中的文件被视为中间文件。即使您没有看到此问题,您最终也会意识到make没有重建目标ts应该在什么时候,因为依赖项是错误的。旁白:我将添加.d文件作为.s文件的依赖项:如果是头(例如:…/tcp/client.h)意外地删除了它确实需要的
#include
,我希望编译在此中断。为此,我需要重新编译.s,这只能在.d是.s的依赖项时进行(包含的.d内容不足以检测到不再使用头)。