makefile 编译程序,经常会遇到需要编译不同的子模块,需要先编译好子模块,再编译自己的应用的情况。
子模块分布在不同的目录(可能直接就是不同的组成员写的),这时候需要顶层makefile进入子模块目录执行makefile编译。
- 进入不同的目录,不需要使用 cd 进入对应目录,可以使用
会自动进入相关的目录执行寻找makefile,执行make,进行编译,编译完之后,退出到当前目录。
- 要希望从顶层 makefile 传递变量到下层的makefile,可以使用
export variable
参考网址,http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Variables_002fRecursion.html#Variables_002fRecursion
举例说明,比如,现在有项目代码,顶层是自己的程序,包含下属两个子模块, eXosip2 目录,存放eXosip2库文件;sdp目录存放sdp分析文件。
顶层的makefile编译时,需要先编译出 eXosip2 与 sdp 静态库,再进行链接编译 自己的应用
目录视图如下,
| makefile
|----eXosip2
| |__ makefile
|----sdp
| |__ makefile
makefile
CROSS_COMPILE= CC = $(CROSS_COMPILE)gcc CFLAG += -Wall -W -g -Os -o STRIP = $(CROSS_COMPILE)strip SRC := $(wildcard *.c) OBJ := $(SRC:%.c=%.o) all: eXosip SDP $(OBJ) $(CC) -shared $(CFLAG) $(TARGET) $(OBJ) $(LIBS) $(INCLUDE) @$(STRIP) --strip-unneeded $(TARGET) $(MAKE) install export CROSS_COMPILE eXosip: $(MAKE) -C SIP/eXosip SDP: $(MAKE) -C sdp $(OBJ): %.o:%.c $(CC) -c $< $(CFLAG) $@ $(INCLUDE) install: cp -rf include/ ../ rm -rf ../lib mkdir ../lib cp $(TARGET) ../lib clean: rm -rf $(OBJ) rm -rf SIP/eXosip/*.o rm -rf sdp/*.o rm -rf ../include rm -rf ../lib
简析,
$(MAKE) -C SIP/eXosip是进入 eXosip 目录,执行 eXosip 目录下的 makefile
export CROSS_COMPILE往底层makefile(eXosip、sdp目录的makefile),传递 CROSS_COMPILE 变量的值。
当然传递变量值的方法并不单有这种方式,还可以设置环境变量等。