Makefile学习笔记10|makefile获取shell结果实现目录创建判断

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

  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值