Makefile结构如下:
顶级目录:
Makefile
Makefile.bulid
子目录:
Makefile
我的源码文件目录结构如下:
./(根目录)
main.c
Makefile
Makefile.build
display/
disp_manager.c
fb.c
crt.c
Makefile
draw/
draw.c
Makefile
encoding/
ascii.c
encoding_manager.c
utf-16be.c
utf-16le.c
utf-8.c
Makefile
fonts/
ascii.c
fonts_manager.c
freetype.c
gbk.c
Makefile
#顶级目录Makefile
CROSS_COMPILE =
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 -I /usr/include/freetype2
LDFLAGS := -lm -lfreetype -lvga -lvgagl
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
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)
包括内容:定义工具链、编译参数、 链接参数,以及obj-y指定了根目录下要编进去的文件和子目录。这里对变量不解释了,直接从all开始。
all是一个伪目标,没有依赖文件,其下面的命令会直接执行;
make -C ./ -f $(TOPDIR)/Makefile.build
-C指定了文件当前所在文件夹的目录,然后调用$(TOPDIR)/目录下(也就是顶级目录下)的Makefile.build执行编译工作。
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o
gcc -链接参数 -o 目标文件名 依赖文件名
清除就不多解释了,简单的shell命令和变量替换。
明天解释最麻烦的Makefile.build,这个是Makefile的核心。