数码相册——电子书编写通用的Makefile
硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统参考资料:《嵌入式Linux应用开发手册》、《嵌入式Linux应用开发手册第2版》、《gcc中文手册》开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
数码相册——电子书编写通用的Makefile
一、前言二、设计思路1、Makefile的分布2、Makefile的使用与修改2.1 顶层目录2.2 各子目录
三、编写1、顶层目录`Makefile`文件:`Makefile.build`文件:
2、各子目录2.1 `display`目录Makefile2.2 `draw`目录Makefile2.3 `encoding`目录Makefile2.4 `fonts`目录Makefile
一、前言
对于之前的电子书,需要设计一个比较通用的Makefile
目的:当我们修改或在某个目录下添加文件时,修改Makefile时可以方便操作;Makefile可以只预处理编译汇编修改的文件与使用这个文件的文件,之后才进行整体的链接。
二、设计思路
1、Makefile的分布
分为如下3部分:
顶层目录的Makefile:定义obj-y来指定根目录下要编进程序去的文件、子目录外,主要是定义工具链、编译参数、链接参数。顶层目录的Makefile.build:把某个目录及它的所有子目录中、需要编进程序去的文件都编译出来,打包为built-in.o。各级子目录的Makefile:把当前目录下的.c文件编进程序里。
2、Makefile的使用与修改
2.1 顶层目录
把顶层Makefile,Makefile.build放入程序的顶层目录修改顶层Makefile 2.1 修改工具链 2.2 修改编译选项、链接选项 2.3 修改obj-y决定顶层目录下哪些文件、哪些子目录被编进程序 2.4 修改TARGET,这是用来指定编译出来的程序的名字
2.2 各子目录
在各个子目录下都新建一个Makefile,形式为: 其中subdir1/:代表当前目录下的子目录
obj
-y
+= file1
.o
obj
-y
+= file2
.o
obj
-y
+= subdir1
/
obj
-y
+= subdir2
/
三、编写
1、顶层目录
Makefile文件:
CROSS_COMPILE
= arm-linux-
AS
= $(CROSS_COMPILE)as
LD
= $(CROSS_COMPILE)ld
CC
= $(CROSS_COMPILE)gcc
CPP
= $(CC) -E
AR
= $(CROSS_COMPILE)ar
NM
= $(CROSS_COMPILE)nm
STRIP
= $(CROSS_COMPILE)strip
OBJCOPY
= $(CROSS_COMPILE)objcopy
OBJDUMP
= $(CROSS_COMPILE)objdump
export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP
CFLAGS :
= -Wall -O2 -g
CFLAGS +
= -I
$(shell pwd)/include
LDFLAGS :
= -lm -lfreetype
export CFLAGS LDFLAGS
TOPDIR :
= $(shell pwd)
export TOPDIR
TARGET :
= show_file
obj-y +
= main.o
obj-y +
= display/
obj-y +
= draw/
obj-y +
= encoding/
obj-y +
= fonts/
all
:
make -C ./ -f
$(TOPDIR)/Makefile.build
$(CC) $(LDFLAGS) -o
$(TARGET) built-in.o
built-in.o:
make -C ./ -f Makefile.build
clean
:
rm -f
$(shell find -name "*.o")
rm -f
$(TARGET)
distclean:
rm -f
$(shell find -name "*.o")
rm -f
$(shell find -name "*.d")
rm -f
$(TARGET)
Makefile.build文件:
PHONY :
= __build
__build:
obj-y :
=
subdir-y :
=
include Makefile
__subdir-y :
= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y +
= $(__subdir-y)
subdir_objs :
= $(foreach f,$(subdir-y),
$(f)/built-in.o
)
cur_ojbs :
= $(filter-out %/, $(obj-y))
dep_files :
= $(foreach f,$(cur_ojbs),.
$(f).d
)
dep_files :
= $(wildcard $(dep_files))
ifneq
($(dep_files),
)
include
$(dep_files)
endif
PHONY +
= $(subdir-y)
__build
: $(subdir-y) built-in.o
$(subdir-y):
make -C
$@ -f
$(TOPDIR)/Makefile.build
built-in.o
: $(cur_ojbs) $(subdir_objs)
$(LD) -r -o
$@ $^
dep_files
= .$@.d
%.o
: %.c
$(CC) $(CFLAGS) -Wp,-MD,
$(dep_files) -c -o
$@ $
<
.PHONY
: $(PHONY)
2、各子目录
2.1 display目录Makefile
obj-y +
= disp_manager.o
obj-y +
= fb.o
2.2 draw目录Makefile
obj-y +
= draw.o
2.3 encoding目录Makefile
obj-y +
= ascii.o
obj-y +
= encoding_manager.o
obj-y +
= utf-8.o
obj-y +
= utf-16be.o
obj-y +
= utf-16le.o
2.4 fonts目录Makefile
obj-y +
= ascii.o
obj-y +
= fonts_manager.o
obj-y +
= freetype.o
obj-y +
= gbk.o