您的位置:首页 > 其它

工程中编写自己的makefile---8 编写Arm开发板的makefile

2017-06-05 16:37 232 查看

1 编写开发板的程序的makefile

基于以上的学习,下面编写一个基于Hi3520D开发板的程序

工程目录结构如下
.
├── Components
│ ├──Common
│ │ ├── xx_inc.h
│ │ ├── xx_type.h
│ ├──HAL
│ │ ├── Common
│ │ │ ├── xx_inc_hal.h
│ │ ├── Include
│ │ │ ├── xx_alarm_in.h
│ │ │ ├── xx_alarm_out.h
│ │ │ ├── xx_tm7705.h
│ │ ├── Source
│ │ │ ├── xx_alarm_in.c
│ │ │ ├── xx_alarm_out.c
│ │ │ ├── xx_tm7705.c
│ │ └── Makefile
│ ├──MCU
│ │ ├── Common
│ │ │ ├── xx_inc_mcu.h
│ │ ├── Include
│ │ │ ├── hi35xx_gpio.h
│ │ │ ├── xx_uart.h
│ │ ├── Source
│ │ │ ├── hi35xx_gpio.c
│ │ │ ├── xx_uart.c
│ │ └── Makefile
│ ├──Protocal
│ │ ├── Common
│ │ │ ├── xx_inc_ip.h
│ │ ├── Include
│ │ │ ├── gk_protocal.h
│ │ │ ├── xx_crc.h
│ │ │ ├── xx_protocal.h
│ │ ├── Source
│ │ │ ├── gk_protocal.c
│ │ │ ├── xx_crc.c
│ │ │ ├── xx_protocal.c
│ │ └── Makefile
│ ├──Services
│ │ ├── Common
│ │ │ ├── xx_inc_ip.h
│ │ ├── Include
│ │ │ ├── xx_dbug.h
│ │ │ ├── xx_inifile.h
│ │ │ ├── xx_pthread_mutex.h
│ │ │ ├── xx_socket.h
│ │ │ ├── xx_waiter.h
│ │ ├── Source
│ │ │ ├── xx_dbug.c
│ │ │ ├── xx_inifile.c
│ │ │ ├── xx_pthread_mutex.c
│ │ │ ├── xx_socket.c
│ │ │ ├── xx_waiter.c
│ │ └── Makefile
├── Project
│ ├── main.h
│ ├── main.c
│ ├── Makefile(主)
│ ├──Iot_hornet
│ │ ├── iot_intfc.h
│ │ ├── iot_main.h
│ │ ├── iot_intfc.c
│ │ ├── iot_main.c
│ │ └──Makefile
│ ├──wlan_select
│ │ ├── wlan_main.h
│ │ ├── wlan_main.c
│ │ └── Makefile
├── Object(存放所有目标文件(.o文件)的文件夹)

1.1 编写子makefile

相对来说,子makefiled都是相同,

所做的工作就是把子makefile同目录下的所有文件下的.c源文件全部便宜为相应的.o目标文件,然后把所有的.o文件cp到Object目录下;

#$(shell ls -d */) 命令打印当前目录下的所有文件夹

DIRS := $(shell ls -d*/) ./

FILES := $(foreachdirs, $(DIRS), $(wildcard $(dirs)*.c))

OBJS := $(patsubst%.c, %.o, $(FILES))

all:$(OBJS)$(OBJSDIR)

#$(OBJS):%.o:%.c

# $(CC) -c $< -o $@ $(CFLAGS)

#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令

$(OBJSDIR):ALWAYSMAKE

cp $(OBJS) $(OBJSDIR)

.PHONY:clean

clean:

$(RM) $(OBJS)

.PHONY:ALWAYSMAKE

ALWAYSMAKE:

1.2 编写主makefile

export WORKDIR :=$(shell pwd)/..

export OBJSDIR :=$(WORKDIR)/Object

export LIBS :=-lpthread -lmpi -ltde -laec -ljpeg -lanr -lresampler -lVoiceEngine

export MPPLIBS :=-L/opt/Hi3520D_SDK_V1.0.5.0/mpp/lib

export CC :=arm-hisiv100nptl-linux-gcc

#头文件路径

export CFLAGS := \

-I$(WORKDIR)/Components/Common\

-I$(WORKDIR)/Components/HAL/Common\

-I$(WORKDIR)/Components/HAL/Include\

-I$(WORKDIR)/Components/MCU/Common\

-I$(WORKDIR)/Components/MCU/Include\

-I$(WORKDIR)/Components/Protocal/Common\

-I$(WORKDIR)/Components/Protocal/Include\

-I$(WORKDIR)/Components/Services/Common\

-I$(WORKDIR)/Components/Services/Include\

-I$(WORKDIR)/Project/Iot_hornet\

-I$(WORKDIR)/Project/wlan_select\

-I$(WORKDIR)/Project\

-I/opt/Hi3520D_SDK_V1.0.5.0/mpp/include\

-O0 -Wall -g3

RM := rm -f

OBJS := main.o

TARGET := xxproject

$(TARGET):$(OBJS)$(OBJSDIR)

$(MAKE) -C$(WORKDIR)/Components/Protocal/

$(MAKE) -C$(WORKDIR)/Components/Services/

$(MAKE) -C $(WORKDIR)/Components/HAL/

$(MAKE) -C $(WORKDIR)/Components/MCU/

$(MAKE) -C $(WORKDIR)/Project/wlan_select/

$(MAKE) -C$(WORKDIR)/Project/Iot_hornet/

$(CC) $(MPPLIBS) -o $(TARGET)$(OBJSDIR)/*.o $(CFLAGS) $(LIBS)

#$(OBJS):%.o:%.c

# $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)

#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令

$(OBJSDIR):ALWAYSMAKE

cp $(OBJS) $(OBJSDIR)

.PHONY:clean

clean:

$(MAKE) clean -C$(WORKDIR)/Components/Protocal/

$(MAKE) clean -C$(WORKDIR)/Components/Services/

$(MAKE) clean -C$(WORKDIR)/Components/HAL/

$(MAKE) clean -C$(WORKDIR)/Components/MCU/

$(MAKE) clean -C $(WORKDIR)/Project/wlan_select/

$(MAKE) clean -C$(WORKDIR)/Project/Iot_hornet/

$(RM) $(OBJS) $(TARGET)

$(RM) $(OBJSDIR)/*.o

.PHONY:ALWAYSMAKE

ALWAYSMAKE:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: