Makefile 自定义函数 和 foreach的使用。
最近在做项目时,用到了一些开源的组件,这些组件中需要第三方库,每个版本对应的第三方库可能不一样,所以使用源码编译安装时,第一次需要去下载这些包,但是下载比较慢,需要改造Makefile。
Makefile 定义函数来实现这个改造
函数格式
define EXTERNAL_TAR
...
endef
调用
deps: $(call EXTERNAL_TAR)
因为需要递归解压包,使用了foreach(里面的是临时变量)进行遍历:
代码
EXTERNAL_JSON=external/cJSON/
EXTERNAL_ZLIB=external/zlib/
EXTERNAL_SQLITE=external/sqlite/
EXTERNAL_OPENSSL=external/openssl/
EXTERNAL_LIBYAML=external/libyaml/
EXTERNAL_CURL=external/curl/
EXTERNAL_AUDIT=external/audit-userspace/
EXTERNAL_LIBFFI=external/libffi/
EXTERNAL_CPYTHON=external/cpython/
EXTERNAL_MSGPACK=external/msgpack/
EXTERNAL_PROCPS=external/procps/
EXTERNAL_LIBDB=external/libdb/build_unix/
EXTERNAL_DB=external/libdb/
TAR := tar -zxf
EXTERNAL_RES := cJSON $(CPYTHON) curl libdb libffi libyaml openssl procps sqlite zlib audit-userspace msgpack
define EXTERNAL_TAR
$(foreach n, $(EXTERNAL_RES), $(TAR) external/$(n).tar.gz -C external; )
endef
deps:
ifeq ($(wildcard external/*/*),)
$(call EXTERNAL_TAR)
endif
clean-deps-libs:
rm -rf $(EXTERNAL_ZLIB) $(EXTERNAL_JSON) ${EXTERNAL_OPENSSL} ${EXTERNAL_LIBYAML} ${EXTERNAL_CURL} ${EXTERNAL_PROCPS} $(EXTERNAL_SQLITE) ${EXTERNAL_AUDIT} ${EXTERNAL_LIBFFI} $(EXTERNAL_MSGPACK) ${EXTERNAL_DB} ${EXTERNAL_CPYTHON}
代码目录结构
make deps :
make clean-deps-libs