SylixOS Makefile分析
来源:互联网 发布:域名记录类型 编辑:程序博客网 时间:2024/05/18 02:29
RealCoder在生产SylixOS工程时会生成Makefile,为了保持SylixOS构建系统的灵活性,生成的Makefile文件是允许用户手动修改的。当需要在工程中添加或删除文件时,必须手动修改Makefile文件。本节主要分析SylixOS Makefile文件,便于用户在使用过程中修改定制SylixOS的构建功能。
1.1 SylixOS目录结构
Makefile和目录结构息息相关,这里先介绍一下SylixOS系统中几种典型的目录结构。
1. 应用程序和BSP目录结构
SylixOS应用程序工程、共享库工程、内核模块工程和BSP工程的源码目录结构类似,所以这里一起介绍。由图 0‑1和图 0‑2可以看到,工程的Makefile位于源码根目录。
SylixOS应用程序工程、共享库工程、内核模块工程目录结构如下:
SylixOSBSP工程目录结构如下:
2. SylixOS Base工程目录结构
SylixOS Base将多个子工程打包成一个统一管理的大工程,每个子工程为SylixOS Base工程更目录下的一个子文件夹,其中包含子工程的Makefile文件,SylixOS Base工程本身也具备Makefile文件。Base工程目录结构如下:
可以从SylixOS Base工程中提取子工程作为一个单独构建,也可以添加新的子工程到SylixOS Base工程中,只需要做以下两步操作:
l 拷贝工程源码文件夹。
l 修改SylixOS Base工程Makefile文件。
SylixOS Base工程Makefile文件内容如下:
#This file is generated by RealCoder.
all:
make-C libsylixos
make-C libcextern
clean:
make-C libsylixos clean
make-C libcextern clean
可见SylixOS Base工程Makefile文件结构很简单,只是依次调用各个子工程Makefile实现构建,如需添加和删除子工程,只需在这个结构基础上添加或删除对应条目。
1.2 config.mk文件
所有RealCoder生成的工程都包含一个config.mk文件,config.mk文件由RealCoder生成,其中包含了SylixOS构建系统的基础设置,如:工具链、Base工程路径等设置。在使用RealCoder编译SylixOS时,config.mk文件必须采用RealCoder图形界面修改,如果使用其它开发环境,则可手动修改。下面实例介绍config.mk文件配置。
#***************************************************************************
# SylixOS Base Project path
#***************************************************************************
SYLIXOS_BASE_PATH =D:/sylixos/book/source/sylixos-base
#***************************************************************************#Toolchain prefix
#***************************************************************************
TOOLCHAIN_PREFIX = arm-sylixos-eabi-
#***************************************************************************#Debug options (debug or release)
#***************************************************************************
DEBUG_LEVEL = debug
变量解析:
l 变量SYLIXOS_BASE_PATH变量是Base工程路径,如果是Base工程本身,则默认设置为“..”。
l 变量TOOLCHAIN_PREFIX是工具链前缀。
l 变量DEBUG_LEVEL是调试模式设置。
1.1.3 Makefile文件
SylixOS Makefile文件由RealCoder在创建工程时生成,允许手动修改。本节介绍其结构,由于Makefile内容庞大,本节只介绍其中关键配置信息。
1. config.mk文件定位
前面介绍过SylixOS Base工程由多个子工程组成,而这些子工程也可以作为单独的工程构建。所以在子工程跟目录和Base工程跟目录都存在config.mk文件。当调用子工程Makefile时,Makefile首先搜索上级目录中的config.mk文件,如果没有再搜索同级目录的config.mk文件,搜索源码如下:
#***************************************************************************
# include config.mk
#***************************************************************************
CONFIG_MK_EXIST = $(shell if [ -f ../config.mk ]; thenecho exist; else echo notexist; fi;)
ifeq ($(CONFIG_MK_EXIST), exist)
include ../config.mk
else
CONFIG_MK_EXIST = $(shell if [ -f config.mk ]; thenecho exist; else echo notexist; fi;)
ifeq ($(CONFIG_MK_EXIST), exist)
include config.mk
else
CONFIG_MK_EXIST =
endif
endif
#***************************************************************************
# check configure
#***************************************************************************
check_defined = \
$(foreach1,$1,$(__check_defined))
__check_defined = \
$(if $(value$1),, \
$(errorUndefined $1$(if $(value 2), ($(strip $2)))))
$(call check_defined, CONFIG_MK_EXIST, Pleaseconfigure this project in RealCoder or create a config.mk file!)
$(call check_defined, SYLIXOS_BASE_PATH, SylixOS baseproject path)
$(call check_defined, TOOLCHAIN_PREFIX, the prefixname of toolchain)
$(call check_defined, DEBUG_LEVEL, debug level(debugor release))
2. 处理器型号设置
下面代码设置处理器型号。
#***************************************************************************
# configure area you can set the following config toyou own system
# FPUFLAGS (-mfloat-abi=softfp -mfpu=vfpv3 ...)
# CPUFLAGS (-mcpu=arm920t ...)
# NOTICE: libsylixos, BSP and other kernel modulesprojects CAN NOT use vfp!
#***************************************************************************
FPUFLAGS =
CPUFLAGS = -mcpu=arm920t
变量解析:
l 变量FPUFLAGS是浮点处理器设置,其值根据编译器而异。默认情况下FPUFLAGS配置只对应用程序和共享库工程生效。
l 变量CPUFLAGS是处理器型号,其值根据编译器而异。
3. 源文件列表
应用程序工程、共享库工程和内核模块工程源文件列表实例如下:
#***************************************************************************
# src(s) file
#***************************************************************************
SRCS = \
app.c
变量解析:
l 变量SRCS源文件路径列表,路径以Makefile所在目录为当前目录。SRCS一般用于添加文件到工程。
内核和BSP源文件被分类为多个列表,当需要添加文件时,可根据文件所实现的功能将文件添加到对应的源文件列表。下面实例以一个BSP的文件列表为列说明源文件列表一种典型的分类方法。
#***************************************************************************
# bsp src(s) file
#***************************************************************************
BSP_SRCS = \
SylixOS/bsp/bspInit.c \
SylixOS/bsp/bspLib.c \
#***************************************************************************
# drivers src(s) file
#***************************************************************************
DRV_SRCS = \
SylixOS/driver/dma/samsungdma.c \
SylixOS/driver/gpio/s3c2440_gpio.c \
#***************************************************************************
# user src(s) file
#***************************************************************************
USR_SRCS = \
SylixOS/user/main.c
SylixOS构建系统自动编译源文件列表中的文件,其实现代码如下:
#***************************************************************************
# bsp2440.test objects
#***************************************************************************
OBJS = $(addprefix $(OBJPATH)/, $(addsuffix .o,$(basename $(SRCS))))
DEPS = $(addprefix $(DEPPATH)/, $(addsuffix .d,$(basename $(SRCS))))
上面代码将源文件列表中的后缀名替换成.o和.d并保存到目标文件列表变量OBJS和DEPS中。
4. 头文件路径
下面代码设置头文件路径。
#***************************************************************************
# include path
#***************************************************************************
INCDIR =-I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS"
INCDIR +=-I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include"
INCDIR += -I"$(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include/inet"
变量解析:
l 变量INCDIR是头文件路径列表。
5. 预定义宏
下面代码设置编译器预定义宏。
#***************************************************************************
# compiler preprocess
#***************************************************************************
DSYMBOL =-DSYLIXOS
变量解析:
l 变量DSYMBOL是预定义宏列表。
6. 共享库
下面代码设置应用程序依赖的共享库及共享库路径。
#***************************************************************************
# depend dynamic library
#***************************************************************************
DEPEND_DLL = -lvpmpdm -lsubfun
#***************************************************************************
# depend dynamic library search path
#***************************************************************************
DEPEND_DLL_PATH =-L"$(SYLIXOS_BASE_PATH)/libsylixos/$(OUTDIR)"
DEPEND_DLL_PATH +=-L"C:\Users\Administrator\workspace\subfun\Debug"
变量解析:
l 变量DEPEND_DLL是与定义宏列表。
l 变量DEPEND_DLL_PATH是共享库路径列表。
7. 编译器参数
SylixOS默认编译器参数设置如下:
#***************************************************************************
# compiler optimize
#***************************************************************************
ifeq ($(DEBUG_LEVEL), debug)
OPTIMIZE = -O0 -g3 -gdwarf-2
else
OPTIMIZE = -O2 -g1 -gdwarf-2 # Do NOT use -O3 and -Os
endif # -Os is not align for function
#***************************************************************************
# depends and compiler parameter (cplusplus in kernelMUST NOT use exceptions and rtti)
#***************************************************************************
DEPENDFLAG =-MM
CXX_EXCEPT =-fno-exceptions -fno-rtti
COMMONFLAGS = $(CPUFLAGS) $(OPTIMIZE) -Wall-fmessage-length=0 -fsigned-char -fno-short-enums
ASFLAGS = -xassembler-with-cpp $(DSYMBOL) $(INCDIR) $(COMMONFLAGS) -c
CFLAGS =$(DSYMBOL) $(INCDIR) $(COMMONFLAGS) -c
CXXFLAGS =$(DSYMBOL) $(INCDIR) $(CXX_EXCEPT) $(COMMONFLAGS) -c
ARFLAGS = -r
#***************************************************************************
# define some useful variable
#***************************************************************************
DEPEND = $(CC) $(DEPENDFLAG) $(CFLAGS)
DEPEND.d = $(subst -g ,,$(DEPEND))
COMPILE.S = $(AS) $(ASFLAGS)
COMPILE_VFP.S = $(AS) $(ASFLAGS) $(FPUFLAGS)
COMPILE.c = $(CC) $(CFLAGS)
COMPILE.cxx = $(CXX) $(CXXFLAGS)
编译器参数由前面设置的变量组合而成,一般情况下无需手动修改。
8. 目标文件名称
不同类型的工程生成不一样的目标,SylixOS内核工程固定生成以下目标文件:
l libsylixos.a是内核库文件。
l libvpmpdm.so、libvpmpdm.a是进程补丁库文件。
l xinput.ko、xsiipc.ko是内核自带的驱动模块文件。
l symbol.c、symbol.h是内核符号表源码文件,用于系统内核符号表构建。
应用程序工程目标文件设置如下:
#***************************************************************************
# target
#***************************************************************************
EXE = $(OUTPATH)/app
变量解析:
l 变量EXE是可执行ELF文件
共享库工程目标文件设置如下:
#***************************************************************************
# target
#***************************************************************************
LIB = $(OUTPATH)/libsubfun.a
DLL = $(OUTPATH)/libsubfun.so
变量解析:
l 变量LIB是静态链接库文件。
l 变量DLL是共享库文件。
BSP工程目标文件设置如下:
#***************************************************************************
# target
#***************************************************************************
O_IMG = $(OUTPATH)/bsp2440.test.elf
O_BIN = $(OUTPATH)/bsp2440.test.bin
O_SIZ = $(OUTPATH)/bsp2440.test.siz
变量解析:
l 变量O_IMG是ELF可执行文件。
l 变量O_BIN是二进制镜像文件。
l 变量O_SIZ是一个文本文件,记录ELF中的部分地址和大小信息。
内核模块工程目标文件设置如下:
#***************************************************************************
# target
#***************************************************************************
MOD = $(OUTPATH)/ko.test.ko
变量解析:
l 变量MOD是内核模块文件。
9. BSP链接脚本
#***************************************************************************
# load script
#***************************************************************************
LD_SCRIPT = SylixOSBSP.ld
变量解析:
l 变量LD_SCRIPT是链接脚本文件。
10. Makefile规则
SylixOS Makefile规则一般不用修改,几个重要的规则定义如下:
#***************************************************************************
# create depends files
#***************************************************************************
$(DEPPATH)/%.d: %.c
@echocreating $@
@if [ !-d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
@rm -f$@; \
echo -n'$@ $(addprefix $(OBJPATH)/, $(dir $<))' > $@; \
$(DEPEND.d)$< >> $@ || rm -f $@; exit;
$(DEPPATH)/%.d: %.cpp
@echocreating $@
@if [ !-d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
@rm -f$@; \
echo -n'$@ $(addprefix $(OBJPATH)/, $(dir $<))' > $@; \
$(DEPEND.d)$< >> $@ || rm -f $@; exit;
#***************************************************************************
# compile source files
#***************************************************************************
$(OBJPATH)/%.o: %.S
@if [ !-d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
$(COMPILE.S)$< -o $@
$(OBJPATH)/%.o: %.c
@if [ !-d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
$(COMPILE.c)$< -o $@
$(OBJPATH)/%.o: %.cpp
@if [ !-d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
$(COMPILE.cxx)$< -o $@
SylixOS官网:www.sylixos.com
SylixOS源码下载:git.sylixos.com
SylixOS百科:wiki.sylixos.com
- SylixOS Makefile分析
- SylixOS启动脚本分析
- SylixOS高精度时钟分析
- SylixOS 之epoll异常分析
- SylixOS周期定时抖动分析
- SylixOS 网卡驱动netdev_notify函数分析
- SylixOS中AHCI驱动框架分析
- SylixOS热插拔子系统分析(二)
- SylixOS线程创建的流程分析
- makefile分析
- makefile分析
- makefile 分析
- Makefile分析
- makefile 分析
- SylixOS 调试方法详解——静态代码分析
- [LWIP学习]--SylixOS AF_PACKET socket套接字分析
- [LWIP学习]--SylixOS AF_UNIX socket套接字分析
- SylixOS调试方式详解——性能分析
- iOS开发 -- delegate 设计模式
- 一些Java学习中应谨记的知识点
- 常见UI控件的使用-富文本、textview
- 总结一下手动安装autoconf、automake和libtool的经历
- NAND Flash 和 eMMC 的简要区别
- SylixOS Makefile分析
- Boosting算法简介
- 黑马程序员—多态,内部类
- Android的签名机制
- POJ 3190 Stall Reservations
- UITextField
- 为SQL增加自定义函数约束
- FreeBSD
- VI文本编辑器