文章目的
写makefile时,指定输出目录后,结果导致了,不管依赖文件是否改变,只要执行make命令就会执行编译的过程,有点疑
惑,所以就做个小实验,看下什么问题导致的,具体原因已经在makefile文件中解释。顺便也做了一下伪目标的实验,问题
的描述和解决在makefile注释中已经描述。这篇博客的目的就是记录一下这2个实验的测试结果,方便以后查阅。
测试目录
|---Makefile
|---mian.c
测试的Makefile
OUT_DIR=out
TARGET = test
#.PHONY:$(OUT_DIR)
#.PHONY:FORCE
all: $(OUT_DIR) check_dir $(TARGET)
@echo "...all..."
#如果没有添加".PHONY:$(OUT_DIR)",创建一次之后就不会再执行,原因,第一次创建了out目录,每次执行前都会检测一次,out是是否存在,如果存在就不会执行
$(OUT_DIR):
@echo "....create $@...."
@mkdir -p $@
#check_dir这个没有同名的文件或目录就会认为是伪目标,每次都会执行
#也就是说伪目标有2种方式创建,一种是显示申明:"PHONY: target_name"
#还有一种是隐士的,make如果检测到目标没有文件或目录与之对应就认为这个是伪目标
#第2种是我自己的理解
check_dir:
@echo "create $(OUT_DIR)/out1"
@mkdir -p $(OUT_DIR)/out1
#这样写的问题,不管main.c是否跟新,都会被执行。原因:目标是test ,没有带路径,所以每次找到都是在当前目录下查找,而每次查找test,都没有查找到,所以每次都会执行
#为了验证这个说法,加一句cp -rf $(OUT_DIR)/$@ ./ ,即复制目标到当前的目录下,然后就不会每次都执行了,只用mian.c改动 才会执行,验证了上面说法是正确的
$(TARGET):main.c
@echo "...$@.."
gcc $^ -o $(OUT_DIR)/$@
cp -rf $(OUT_DIR)/$@ ./
.PHONY:clean
clean:
rm -rf $(OUT_DIR) $(TARGET)