Makefile 在这个“干净”的地方发生了什么?

Makefile 在这个“干净”的地方发生了什么?,makefile,Makefile,我正在学习更多关于makefile的知识,遇到了一个我不太理解的例子。“清洁”中发生了什么?它正在强制删除/obj中的所有对象文件,但之后我就丢失了。我知道它也会删除exe文件,但如何在代码中翻译 IDIR =../include CC=gcc CFLAGS=-I$(IDIR) ODIR=obj LDIR =../lib LIBS=-lm _DEPS = hellomake.h DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) _OBJ = hellomak

我正在学习更多关于makefile的知识,遇到了一个我不太理解的例子。“清洁”中发生了什么?它正在强制删除/obj中的所有对象文件,但之后我就丢失了。我知道它也会删除exe文件,但如何在代码中翻译

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

../hellomake: $(OBJ)
        gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
        rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
IDIR=../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR=../lib
LIBS=-lm
_DEPS=hellomake.h
部门=$(patsubst%,$(IDIR)/%,$(部门))
_OBJ=hellomake.o hellofunc.o
OBJ=$(patsubst%,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o:%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)
../hellomake:$(OBJ)
gcc-o$@$^$(CFLAGS)$(LIBS)
.假冒:干净
清洁:
rm-f$(ODIR)/*.o*~核心$(INCDIR)/*~
让我们看看这一行

rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
make
所做的第一件事是扩展
$(…)
变量,导致:

rm -f obj/*.o *~ core /*~
最后一部分可能是一个bug:
INCDIR
未定义,因此它扩展为零。你是说
$(IDIR)

第二件事是通过
/bin/sh-c…
运行结果行。shell扩展了通配符之类的内容

让我们假设
obj
中的对象文件是
hellomake.o
hellofunc.o
。然后
obj/*.o
变成
obj/hellofunc.o obj/hellomake.o

*~
匹配当前目录中以
~
结尾的所有文件。你为什么会有这样的档案?因为当您使用emacs编辑文件
foo
时,默认情况下它将保留一个。因此,这是为了删除emacs备份文件

core
是当您启用并且运行的程序崩溃(并且您没有使用systemd)时通常得到的。它可以用来调试崩溃

最后一个模式看起来像是要匹配
INCDIR
中的emacs备份文件,但由于该模式未设置,因此它尝试在根目录
/
中查找备份文件。通常,
/
中根本没有文件,更不用说emacs备份了

如果模式不匹配任何文件,则shell的默认行为是使其保持未展开状态。所以最后一部分(
/*~
)很可能保持原样。假设当前目录中也没有备份文件,因此
*~
也被单独保留:

rm -f obj/hellofunc.o obj/hellomake.o *~ core /*~
此行运行
rm
,将字符串数组作为参数传递给它:

{ "rm", "-f", "obj/hellofunc.o", "obj/hellomake.o", "*~", "core", "/*~" }
rm
(遵循约定)扫描其参数以
-
开头的字符串,并将其作为选项处理。在这种情况下,有一个选项,
f
f
(“force”)告诉
rm
不要询问您没有写入权限的文件;还是把它们删除吧。它还抑制了一些错误,例如,您通常会遇到的试图删除不存在的文件的错误。(特别是,您可能没有一个字面上称为
*~
的文件)

所以整件事都删除了

  • obj/
  • core
    在当前目录中
  • 当前目录中的emacs备份文件
  • /
    中的emacs备份文件(可能不存在,如果存在,您可能没有删除权限)
忽略任何错误。

让我们看看这行

rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
make
所做的第一件事是扩展
$(…)
变量,导致:

rm -f obj/*.o *~ core /*~
最后一部分可能是一个bug:
INCDIR
未定义,因此它扩展为零。你是说
$(IDIR)

第二件事是通过
/bin/sh-c…
运行结果行。shell扩展了通配符之类的内容

让我们假设
obj
中的对象文件是
hellomake.o
hellofunc.o
。然后
obj/*.o
变成
obj/hellofunc.o obj/hellomake.o

*~
匹配当前目录中以
~
结尾的所有文件。你为什么会有这样的档案?因为当您使用emacs编辑文件
foo
时,默认情况下它将保留一个。因此,这是为了删除emacs备份文件

core
是当您启用并且运行的程序崩溃(并且您没有使用systemd)时通常得到的。它可以用来调试崩溃

最后一个模式看起来像是要匹配
INCDIR
中的emacs备份文件,但由于该模式未设置,因此它尝试在根目录
/
中查找备份文件。通常,
/
中根本没有文件,更不用说emacs备份了

如果模式不匹配任何文件,则shell的默认行为是使其保持未展开状态。所以最后一部分(
/*~
)很可能保持原样。假设当前目录中也没有备份文件,因此
*~
也被单独保留:

rm -f obj/hellofunc.o obj/hellomake.o *~ core /*~
此行运行
rm
,将字符串数组作为参数传递给它:

{ "rm", "-f", "obj/hellofunc.o", "obj/hellomake.o", "*~", "core", "/*~" }
rm
(遵循约定)扫描其参数以
-
开头的字符串,并将其作为选项处理。在这种情况下,有一个选项,
f
f
(“force”)告诉
rm
不要询问您没有写入权限的文件;还是把它们删除吧。它还可以抑制错误,例如您在尝试删除不存在的文件时通常会遇到的错误。(特别是,您可能没有一个字面上称为
*~
的文件)

所以整件事都删除了

  • obj/
  • core
    在当前目录中
  • 当前目录中的emacs备份文件
  • /
    中的emacs备份文件(可能不存在,如果存在,您可能没有删除权限)

忽略任何错误。

看起来它不会删除
hellomake
$(INCDIR)
看起来应该是
$(IDIR)
,因为
INCDIR
没有定义任何