0
点赞
收藏
分享

微信扫一扫

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 "\033[36;1m ## Make Command List : \033[0m"
all:
info:

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

$ make
echo -e "\033[36;1m ## Make Command List : \033[0m"
## Make Command List :

不打印执行命令

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

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

include Rules.mk
.PHONY: help all info
help:
@echo -e "\033[36;1m ## Make Command List : \033[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 = /a\CFLAGS += -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 = /a\CFLAGS += -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 = /a\LDFLAGS += ${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



举报

相关推荐

0 条评论