一、介绍
在大型项目中,makefile调用makefile很常见,也很方便,这里给出调用方法
二、实例
1、代码树
app_top下,有顶层makefile和编译工具的设置文件Rules.make,负责整个应用的编译
common_modules下,有makefile,负责common_modules这个文件夹的编译
libmqtt下,有makefile,负责mqtt代码的编译
2、编译过程
在编译整个项目的时候,顶层makefile调用common_modules下makefile
common_modules下makefile调用libmqtt下的makefile
3、makefile实现
1、工具链的定义Rules.mak
#################################################
## Make tools
#################################################
ARM_TOOLS_PATH = mipsel-linux-
CC = $(ARM_TOOLS_PATH)gcc
AS = $(ARM_TOOLS_PATH)as
LD = $(ARM_TOOLS_PATH)ld
AR = $(ARM_TOOLS_PATH)ar
STRIP = $(ARM_TOOLS_PATH)strip
RANLIB = $(ARM_TOOLS_PATH)ranlib
MAKE = make
2、顶层makfile
#################################################################
#
# This file automatically generated - DO NOT EDIT!
#
#################################################################
include Rules.mak
COMM_MODULE_PATH = common_modules
APP_MODULE_PATH = app
NM_MODULE_PATH = net_manage
APP_PATH = build
dep:
$(MAKE) dep -C $(COMM_MODULE_PATH)
$(MAKE) dep -C $(APP_PATH)
#=========================================================================
#-------------------------------------------------------------------------
# make all
#-------------------------------------------------------------------------
all:common_modules app
$(RALINK_ROOTDIR)/mkromfs_mg6001c.sh
#==========================================================================
#--------------------------------------------------------------------------
# make clean
#--------------------------------------------------------------------------
clean:
$(MAKE) clean -C $(COMM_MODULE_PATH)
$(MAKE) clean -C $(APP_PATH)
#==================================================================
#------------------------------------------------------------------
#
#------------------------------------------------------------------
.PHONY:common_modules
common_modules:
$(MAKE) all -C $(COMM_MODULE_PATH)
.PHONY:app
app:
$(MAKE) all -C $(APP_PATH)
3、common_modules下makefile
include ./../Rules.mak
MAKE=make
TARGET_PATH = target
CLI_PATH = cli
MQTT_PATH = libmqtt
dep:
$(MAKE) dep -C $(TARGET_PATH)
$(MAKE) dep -C $(CLI_PATH)
clean:
$(MAKE) clean -C $(TARGET_PATH)
$(MAKE) clean -C $(CLI_PATH)
$(MAKE) clean -C $(MQTT_PATH)
all:mqtt target cli
.PHONY:mqtt
mqtt:
$(MAKE) all -C $(MQTT_PATH)
.PHONY:target
target:
$(MAKE) all -C $(TARGET_PATH)
.PHONY:cli
cli:
$(MAKE) all -C $(CLI_PATH)
4、libmqtt下的makefile实现
#build tools
include ../../Rules.mak
VERSION = V1.0
#target
LIB_TARGET = mqtt_fun.a
#add define
DEBUG = -DMQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h
#add build options
CFLAGS += -O -w -lpthread -lm
#add include files path
INCLUES += -I ./paho.mqtt.embedded-c/MQTTClient-C/src/linux
INCLUES += -I ./paho.mqtt.embedded-c/MQTTPacket/src
INCLUES += -I ./paho.mqtt.embedded-c/MQTTClient-C/src
INCLUES += -I ./cJSON
INCLUES += -I ./http
INCLUES += -I ./mqttCOM
#add src files path
VPATH += ./paho.mqtt.embedded-c/MQTTClient-C/src/linux
VPATH += ./paho.mqtt.embedded-c/MQTTPacket/src
VPATH += ./cJSON
VPATH += ./http
VPATH += ./mqttCOM
#add lib files path
#LIBS +=
#LIB_PATH += -L .
#obj files
OBJS = MQTTClient.o mqtt_top.o mqtt_scheduler.o cJSON.o mqtt_fun_alarm.o \
mqtt_fun_device_status.o mqtt_fun_device_tag.o mqtt_fun_log.o mqtt_fun_ota.o mqtt_fun_set_para.o \
mqtt_fun_vpn.o mqtt_interface.o MQTTLinux.o MQTTFormat.o MQTTPacket.o \
MQTTDeserializePublish.o MQTTConnectClient.o MQTTSubscribeClient.o MQTTSerializePublish.o \
MQTTConnectServer.o MQTTSubscribeServer.o MQTTUnsubscribeServer.o MQTTUnsubscribeClient.o
#build rules
.PHONY:all
all:$(OBJS)
cp ./paho.mqtt.embedded-c/MQTTClient-C/src/MQTTClient.c .
sed -e 's/""/"MQTTLinux.h"/g' ./paho.mqtt.embedded-c/MQTTClient-C/src/MQTTClient.h > MQTTClient.h
@rm -rf ../../lib/mqtt_fun.a
@rm -rf build
@mkdir -p build
$(AR) -rc $(LIB_TARGET) $^
@mv *.o build
@mv *.a build
@cp build/mqtt_fun.a ../../lib/
%.o:%.c
$(CC) $(INCLUES) -c $^ -o $@ $(CFLAGS) $(DEBUG)
clean:
rm -rf mqtt_fun.a *.o MQTTClient.h
rm -rf ../../lib/mqtt_fun.a
echo "rm -rf mqtt_fun.a *.o"
5、编译操作
在命令行进入顶层目录
make all