微信公众号「编程学习基地」
文章目录
- 导入外部资源
- 自定义编译规则
- 不打印执行命令
- 执行本地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