【问题标题】:An unexpected rm occur after makemake 后出现意外的 rm
【发布时间】:2017-08-07 09:27:56
【问题描述】:

这是我的 makefile 的主要部分:

#openmp
ifeq($(BLITTZ_CC), icc)
    OPENMP_OPTIONS := -fopenmp
else
    OPENMP_OPTIONS := -fopenmp
endif

#compiler options
CXXFLAGS := -WALL -Wno-unused-parameter $(OPTIMIZE_OPTIONS) $(OPENMP_OPTIONS) $(MODE)

SRC_LIST := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_LIST := $(patsubst %.cpp, $(BUILD_DIR)/%.o, $(notdir $(SRC_LIST)))
TARGET := main
BIN_TARGET := $(BIN_DIR)/$(TARGET)

$(BIN_TARGET): $(OBJ_LIST)
    $(BLITZ_CC) -o $@ $(OBJ_LIST) $(CXXFLAGS)

$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.s
    $(BLITZ_CC) -o $@ -c $< $(CXXFLAGS)

$(BUILD_DIR)/%.s: $(SRC_DIR)/%.cpp
    $(BLITZ_CC) -o $@ -S $(CXXFLAGS) $<

#inc test
test:
    echo $(SRC_LIST)
    echo $(OBJ_LIST)
    echo $(BIN_TARGET)

#clean
clean:
    find $(BUILD_DIR) -name *.o -exec rm rf {} \;
    find $(BUILD_DIR) -name *.s -exec rm rf {} \;
    rm $(BIN_DIR)/*

这是make之后发生的事情:

为什么rm *.s 会出现在这里?我需要汇编文件,我不想删除它们。

【问题讨论】:

  • 发布源代码和构建日志在问题内。不要发布图片。
  • 也许从makefile中删除相关的rm命令?
  • 您的 Makefile 中是否缺少默认目标?更多详情请见this reply
  • 我眼力不够看你截图,但是.s文件都是.c源生成.o文件中的中间文件;所以make 将在之后将它们全部删除,除非您专门发出命令来制作.s 文件。您可以使用.PRECIOUS: %.s 将它们保留在最新版本的 gmake 中

标签: c linux


【解决方案1】:

因为您已通过 chained rules 从您的 .cpp 文件创建您的 .o 文件,make 将您的 .s 文件标记为 中间文件 并删除在构建你的目标之后:

[...] 在make 之前不存在的中间文件在make 之后也不存在。

您需要将您的文件标记为secondary files

.SECONDARY: $(OBJ_LIST:.o=.s)

当一个文件是次要的,make不会仅仅因为它不存在就创建它,但是make不会自动删除这个文件。

或者您可以将您的文件模式标记为precious

.PRECIOUS: %.s

您可以列出隐式规则的目标模式(例如“%.o”)作为特殊目标.PRECIOUS 的先决条件,以保留目标模式与该文件名匹配的隐式规则生成的中间文件; [...]

【讨论】:

    【解决方案2】:

    find $(BUILD_DIR) -name *.s -exec rm rf {} \; 将获取所有 .s 文件并执行 rm rf 如果您想保留 .s 文件,请删除该行

    【讨论】:

    • 好吧,如果只有 *.s 文件位于 BUILD_DIR 下(当前工作目录中没有),这就是该行将执行的操作。否则它是错误的——*.s 如果在工作目录中存在任何与之匹配的文件,shell 将扩展它。 OP 可能想要 '*.s'
    • 顺便说一句,\; 真的很傻——每个找到的文件都运行一次rm+ 会更合适,将多个文件名传递给单个 rm 调用。在删除文件而不是目录时,-rf(或实际存在于 OP 代码中的 bug-not-a-flag rf)没有很好的借口。
    • 此行在clean 规则中,与操作的经历无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多