未加星标

Shell应用(10):支持开源库编译的Makefile

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

脚本实现

由于很多应用项目依赖诸多第三方开源库,这些开源库各有不同的核心目录、库目标和输出位置,这里的核心目录是指仅产生so库的工程目录,库目标是指仅产生so库的make目标。为了统一支持它们,使用了一些技巧,详见示例脚本如下

1
Shell应用(10):支持开源库编译的Makefile

.PHONY:allcleanlibcore

2
Shell应用(10):支持开源库编译的Makefile
3
Shell应用(10):支持开源库编译的Makefile
thirdlib = openssl - 1.0 .1u ? build_sslACE_wrappers / acejsonncurses - 6.0 ??

lib

4
Shell应用(10):支持开源库编译的Makefile
coremod =

main

5
Shell应用(10):支持开源库编译的Makefile
6
Shell应用(10):支持开源库编译的Makefile
dir = `echo$@|awk - F? ' {print$$1}'`
7
Shell应用(10):支持开源库编译的Makefile
aim = `echo$@|awk - F? ' {print$$2}'`
8
Shell应用(10):支持开源库编译的Makefile
out = `echo$@|awk - F? ' {print$$3}'`
9
Shell应用(10):支持开源库编译的Makefile
10
Shell应用(10):支持开源库编译的Makefile
copy =\ cp - Pf ${dir} / ${out} /* .so *

output

11
Shell应用(10):支持开源库编译的Makefile
12
Shell应用(10):支持开源库编译的Makefile

defineMAKE_SUBDIR

13
Shell应用(10):支持开源库编译的Makefile
echo " ${dir},${aim},${out} " ; \
14
Shell应用(10):支持开源库编译的Makefile
if [ " $(MAKECMDGOALS) " ! = " clean " ]; then \
15
Shell应用(10):支持开源库编译的Makefile
$(MAKE) ${aim} - C ${dir} ; \
16
Shell应用(10):支持开源库编译的Makefile
if [ " $$is_cp " - eq " 1 " ]; then \
17
Shell应用(10):支持开源库编译的Makefile
$(copy); \
18
Shell应用(10):支持开源库编译的Makefile
fi \
19
Shell应用(10):支持开源库编译的Makefile
else \
20
Shell应用(10):支持开源库编译的Makefile
$(MAKE) clean - C${dir}; \
21
Shell应用(10):支持开源库编译的Makefile

fi

22
Shell应用(10):支持开源库编译的Makefile

endef

23
Shell应用(10):支持开源库编译的Makefile
24
Shell应用(10):支持开源库编译的Makefile

all:libcore

25
Shell应用(10):支持开源库编译的Makefile
26
Shell应用(10):支持开源库编译的Makefile

lib:$(thirdlib)

27
Shell应用(10):支持开源库编译的Makefile
28
Shell应用(10):支持开源库编译的Makefile

$(thirdlib)::

29
Shell应用(10):支持开源库编译的Makefile
@ is_cp = 1

;$(MAKE_SUBDIR)

30
Shell应用(10):支持开源库编译的Makefile
31
Shell应用(10):支持开源库编译的Makefile

core:$(coremod)

32
Shell应用(10):支持开源库编译的Makefile
33
Shell应用(10):支持开源库编译的Makefile

$(coremod)::

34
Shell应用(10):支持开源库编译的Makefile
@ is_cp = 0

;$(MAKE_SUBDIR)

35
Shell应用(10):支持开源库编译的Makefile
36
Shell应用(10):支持开源库编译的Makefile
clean:$(thirdlib)$(coremod)

脚本特点

1)使用?作为分隔符,所分隔的3个域分别为核心目录、库目标、输出位置,这里的核心目录是指仅产生so库文件的工程目录,库目标是指编译输出so库文件的make目标;使用awk来获取各域,分别为dir、aim和out;

在运行过程中,值dir一定非空,而aim为空则表示库目标为库Makefile的默认目标,out为空表示输出位置即为dir目录。

2)copy为命令变量,功能为每当一个库编译完成后,将输出的so库拷贝到output下,并保持软链接;对于有的开源库,需在编译前,使用对应的选项来调用configure,使其生成so库。

3)为了重用代码,定义了MAKE_SUBDIR命令包,参数变量为is_cp,当is_cp为1时,表示当前编译的是库,否则是主程序。

4)thirdlib和coremod为依赖文件,使用了双冒号规则,这样一来,只要在thirdlib中加入新的依赖库,指定核心目录、库目标和输出位置即可,其它地方不用改。

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: 开源UBSU变量
分页:12
转载请注明
本文标题:Shell应用(10):支持开源库编译的Makefile
本站链接:http://www.codesec.net/view/485573.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(26)