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


0 0
原创粉丝点击