makefile进阶

makefile进阶,第1张

makefile进阶

来源:微信公众号「编程学习基地」

文章目录

导入外部资源自定义编译规则

不打印执行命令 执行本地shell文件MakeFile传参CMake传参

导入外部资源

通过 include 导入外部资源

例如新建 Rules.mk 文件,文件如下

Project_Root_Dir = $(CURDIR)

新建 makefile 文件,通过 include 导入外部资源

include Rules.mk
.PHONY: help all info
自定义编译规则

通过伪目标自定义编译规则

include Rules.mk
.PHONY: help all info
help:
	echo -e "33[36;1m ## Make Command List : 33[0m"
all: 
info:

当执行 make 的时候由于没有目标,将会执行第一个伪目标

$ make
echo -e "33[36;1m ## Make Command List : 33[0m"
 ## Make Command List : 
不打印执行命令

在执行 makefile 命令是往往会打印很多没必要的信息

通过添加 @ 符号过滤掉执行命令

include Rules.mk
.PHONY: help all info
help:
	@echo -e "33[36;1m ## Make Command List : 33[0m"
all: 
info:

当执行 make 命令时,忽略打印执行命令

$ make
 ## Make Command List : 
执行本地shell文件

往往 makefile 需要外部执行一些 *** 作或者划分模块,需要在伪目标中执行 shell 命令。

find /home/ubuntu/makefile -name "*.sh" -exec echo {} ;

该命令通过查找某目录下的shell文件并输出该shell文件

同样我们可以执行该shell文件

find /home/ubuntu/makefile -name "*.sh" -exec sh {} ;

当然也可以先给文件添加可执行权限再执行

find /home/ubuntu/makefile -name "*.sh" -exec chmod +x {} ; -exec sh {} ;
MakeFile传参

在编译libevent-2.0.22-stable的时候发现搜索库路径不是主makefile的指定路径

需要给目标makefile进行传参

sed -i '/CFLAGS = /aCFLAGS += -I${DE_Bin}/include' $(DE_Root_Dir)/$(libevent_name)/Makefile

其中

DE_Bin = /home/dengzr/DA/bsrDA_PlatAll/env/bin/linux-x64/

DE_Root_Dir = /home/dengzr/DA/bsrDA_PlatAll/env/

在执行主makefile的时候执行的命令为

sed -i '/CFLAGS = /aCFLAGS += -I/home/dengzr/DA/bsrDA_PlatAll/env/bin/linux-x64/include' /home/dengzr/DA/bsrDA_PlatAll/env/libevent-2.0.22-stable/Makefile

需要指定搜索库路径

LDFLAGS参数

gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置

sed -i '/LDFLAGS = /aLDFLAGS += ${DE_Bin}/lib/libssl.a ${DE_Bin}/lib/libcrypto.a' $(DE_Root_Dir)/$(libevent_name)/Makefile
CMake传参
cmake ../ -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${DE_Bin} 
	-DCMAKE_INSTALL_LIBDIR=lib 
	-DCMAKE_FIND_ROOT_PATH=${DE_Bin} 
	-DZLIB_INCLUDE_DIR=${DE_Bin}/include 
	-DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX} 
	-Dprotobuf_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release

DE_Bin = /home/dengzr/DA/bsrDA_PlatAll/env/bin/linux-x64

libcurl编译

libcurl_conf_a:
	cd $(DE_Root_Dir)/$(libcurl_name); 
	mkdir -p build; cd build; 
	cmake ../ -DCMAKE_INSTALL_PREFIX=${DE_Bin} 
				-DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX} 
				-DCMAKE_C_FLAGS="${CMAKE_C_FLAGS} -fPIC -fvisibility=default" -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -fPIC -fvisibility=default" 
				-DCMAKE_FIND_ROOT_PATH=${DE_Bin} 
				-DBUILD_SHARED_LIBS=OFF 
				-DBUILD_TESTING=OFF 
				-DVISIBILITY_INLINES_HIDDEN=OFF 
				-DCURL_DISABLE_LDAP=ON -DCURL_DISABLE_LDAPS=ON
	
	# 匹配 'ifdef CURL_STATICLIB' 下一行进行替换 CURL_EXTERN = CURL_EXTERN __attribute__ ((visibility("default")))
	sed -i '/ifdef CURL_STATICLIB/{n;s/CURL_EXTERN/CURL_EXTERN __attribute__ ((visibility("default")))/;}' $(DE_Root_Dir)/$(libcurl_name)/include/curl/curl.h

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5704420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存