Makefile学习笔记10|makefile获取shell结果实现目录创建判断
希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。
这里是目录
本节研究一下在makefile中如何执行shell脚本并得到其运行结果,进而改写、优化前面的makefile。可以将前面默认TARGET:=test改成默认TARGET为目录的名称。通过前面的学习,我们知道makefile分为目标、依赖、代码三个部分。代码部分就可以执行shell脚本。本节的侧重点是如何得到shell脚本的执行结果。通常情况下,得到shell脚本的执行结果有三个方案。一是将shell脚本的执行结果重定向到文件中,再读取文件内容。显然,这种方案有些麻烦,并不是最佳选择。二是使用makefile自带的函数。下面我们来学习相关的函数。
shell函数
先创建一个独立的makefile,测试一下shell函数的用法。
# test.mk
LDIR=$(shell pwd)
LSS=$(shell ls)
test:
@echo $(LDIR)
@echo $(LSS)
make一下(make -f test.mk)就能看到当前路径与该路径下的所有文件的文件名被打印出来了。有一个问题我们必须搞懂,那就是shell是在何时被执行的呢?是在给变量赋值时(LSS=$(shell ls))呢?还是在使用变量时(@echo $(LSS))呢?下面我们改写test.mk做个实验来探究一番。
# test.mk
LDIR=$(shell pwd)
LSS=$(shell ls)
TMP=$(shell echo 111>222)
test:
@echo $(LDIR)
@echo $(LSS)
如果shell是在给变量赋值时执行,则应该生成一个名为222的文件。make一下(make -f test.mk)后发现并没有生成名为222的文件。由此可知,shell是在使用变量时执行的,我们可以把这个赋值看做是#define宏定义,在执行时替换。
应用
下面我们做一个关于makefile中shell的应用。应用的功能是判断当前目录下是否存在名为out的文件夹,如果不存在则创建该文件夹,如果存在则不做任何事。
# app.mk
OUT:=out
INIT=$(shell if [ ! -d $(OUT) ]; then mkdir $(OUT); fi;)
test:
@echo $(INIT)
优化makefile头文件
下面我们把今天学到的知识应用到上一节的makefile头文件上,将默认TARGET:=test改成默认TARGET为目录的名称。
# ../makefile.mk
# 给TARGET一个默认值
ifndef TARGET
TARGET:=$(notdir $(shell pwd))
endif
# 这里的CXXFLAGS根据需要修改。其他变量同理。
CXXFLAGS:=-I../../include
LDFLAGS:=-L../xcom -L../xthread
LDLIBS:=-lpthread
SRCS:=$(wildcard *.cpp *.cc *.c)
OBJS:=$(patsubst %.cpp,%.o,$(SRCS))
OBJS:=$(patsubst %.cc,%.o,$(OBJS))
OBJS:=$(patsubst %.c,%.o,$(OBJS))
$(TARGET):$(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)
clean:
$(RM) $(OBJS) $(TARGET)
.PHONY: clean
都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ