makefile 之多目录,多目标编译

时间:2022-09-01 11:18:42

makefile 编译程序,经常会遇到需要编译不同的子模块,需要先编译好子模块,再编译自己的应用的情况。

子模块分布在不同的目录(可能直接就是不同的组成员写的),这时候需要顶层makefile进入子模块目录执行makefile编译。

  • 进入不同的目录,不需要使用 cd 进入对应目录,可以使用
$(MAKE)  -C  XX(目录)

会自动进入相关的目录执行寻找makefile,执行make,进行编译,编译完之后,退出到当前目录。

  • 要希望从顶层 makefile 传递变量到下层的makefile,可以使用
variable = value

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 变量的值。

当然传递变量值的方法并不单有这种方式,还可以设置环境变量等。