make - это удаление файлов, созданных по моему собственному правилу (неявному).
У меня есть make-файл, который работает, как и ожидалось, и выглядит следующим образом:
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)
Этот make-файл создает файлы assert.d assert.as assert.so.s assert.ao и assert.so.o и не удаляет ни один из них:
CC -M build/tmp/base/assert/assert.d
CC build/tmp/base/assert/assert.a.s
AS build/tmp/base/assert/assert.a.o
CC build/tmp/base/assert/assert.so.s
AS build/tmp/base/assert/assert.so.o
Затем у меня есть другой make-файл, где я должен работать с подкаталогами, и мне пришлось обойти проблему:% не справляется так хорошо. Makefile выглядит следующим образом:
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)
Однако по какой-то причине make решает, что промежуточные файлы здесь не важны, и удаляет их:
CC -M build/tmp/base/socket/tcp/client.d
CC build/tmp/base/socket/tcp/client.a.s
AS build/tmp/base/socket/tcp/client.a.o
CC build/tmp/base/socket/tcp/client.so.s
AS build/tmp/base/socket/tcp/client.so.o
rm /media/user/DataNTFS/Alex-dev/git/libalx/build/tmp/base/socket/tcp/client.a.s /media/user/DataNTFS/Alex-dev/git/libalx/build/tmp/base/socket/tcp/client.so.s
Я нашел this . Но я не вижу разницы между двумя make-файлами. Он должен удалить файлы либо в обоих, либо ни в одном из них, насколько я вижу. Почему он удаляет файлы только во втором make-файле?
Раскомментирование .PRECIOUS, кажется, препятствует удалению, но я не уверен, что скрываю что-то плохое с ним.