子目录makefile分析(代码片段)

四季帆 四季帆     2022-12-04     330

关键词:

1. 前言

        鸿蒙暂时支持以下几种文件系统,以fat 文件系统为例,看看fat 文件系统是如何被编译到鸿蒙系统中,进而支持fat 文件系统的。

        

2. fat目录下的Makfile文件

include $(LITEOSTOPDIR)/config.mk         #包含顶层目录下的config.mk,即liteos_a/config.mk

MODULE_NAME := $(notdir $(shell pwd))     #打印当前路径然后去掉目录信息,即剩下fat

LOCAL_SRCS := $(wildcard os_adapt/*.c)    #获取工作目录下os_adapt/下的所有.c文件
LOCAL_SRCS += $(wildcard $(LITEOSTHIRDPARTY)/FatFs/source/*.c)  #获取OpenHarmony/third_party/FatFs/source/下的所有.c文件

LOCAL_INCLUDE := \\
    -I $(LITEOSTHIRDPARTY)/FatFs/source \\
    -I $(LITEOSTOPDIR)/fs/fat/virpart/include     #指定包含头文件的路径

LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)     #本地编译选项

include $(MODULE)                         #即包含liteos_a/tools/build/mk/module.mk

3. config.mk

        这个makefile中就是一些配置项,没什么东西。

-include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk

TOP_LD_PATH      = $(LITEOSTOPDIR)
SCRIPTS_PATH     = $(LITEOS_SCRIPTPATH)
LITEOS_MK_PATH   = $(MK_PATH)
LITEOS_SUBDIRS   = $(LIB_SUBDIRS)
LIB_BIGODIR      = $(LITEOS_LIB_BIGODIR)

##### liteos tables -u ldflags #####
-include $(LITEOS_MK_PATH)/liteos_tables_ldflags.mk

LITEOS_COPTS   := $(LITEOS_COPTS_DEBUG) $(LITEOS_COPTS_BASE)  \\
                  $(LITEOS_COPTS_EXTRA) $(LITEOS_CORE_COPTS)
LITEOS_CXXOPTS  := $(LITEOS_CXXOPTS_BASE)
LITEOS_INCLUDE  := $(LITEOS_KERNEL_INCLUDE)  $(LITEOS_EXTKERNEL_INCLUDE) \\
                   $(LITEOS_COMPAT_INCLUDE)  $(LITEOS_FS_INCLUDE) \\
                   $(LITEOS_NET_INCLUDE)     $(LITEOS_LIB_INCLUDE) \\
                   $(LITEOS_DRIVERS_INCLUDE) $(LOSCFG_TOOLS_DEBUG_INCLUDE) \\
                   $(LITEOS_PLATFORM_INCLUDE) $(LITEOS_DFX_INCLUDE) \\
                   $(LITEOS_SECURITY_INCLUDE)
LITEOS_LIBDEP   := $(LITEOS_BASELIB)
LITEOS_ASFLAGS  := $(LITEOS_ASOPTS)      $(LITEOS_INCLUDE)
LITEOS_CFLAGS   := $(LITEOS_COPTS)       $(LITEOS_CMACRO) \\
                   $(LITEOS_CMACRO_TEST) $(LITEOS_IMAGE_MACRO) \\
                   $(LITEOS_INCLUDE)
LITEOS_CXXFLAGS := $(LITEOS_CXXOPTS)     $(LITEOS_CXXMACRO) \\
                   $(LITEOS_CMACRO)      $(LITEOS_CXXINCLUDE)
LITEOS_LDFLAGS  := $(LITEOS_LD_OPTS)     $(LITEOS_LD_PATH) \\
                   $(LITEOS_LD_SCRIPT)

4. module.mk

        这个Makefile文件中会出现第一个目标all,下面通过8个步骤的分析来描述如何将fat/目录下的.c文件编译为目标文件和库文件。

#3.LIBA即$(OUT)/lib/libfat.a
LIBSO :=
LIBA := $(OUT)/lib/lib$(MODULE_NAME).a    
#2.LIB即LIBA和LIBSO
LIB := $(LIBA) $(LIBSO)   

#6.把所有.c后缀的文件替换为.o后缀
LOCAL_COBJS := $(patsubst %.c,$(OBJOUT)/%.o,$(LOCAL_CSRCS))   
LOCAL_CPPOBJS := $(patsubst %.cpp,$(OBJOUT)/%.o,$(LOCAL_CPPSRCS))
LOCAL_ASMOBJS := $(patsubst %.S,$(OBJOUT)/%.o,$(LOCAL_ASMSRCS))
LOCAL_ASMOBJS2 := $(patsubst %.s,$(OBJOUT)/%.o,$(LOCAL_ASMSRCS2))
LOCAL_CCOBJS := $(patsubst %.cc,$(OBJOUT)/%.o,$(LOCAL_CCSRCS))

#5.LOCAL_OBJS依赖LOCAL_COBJS等
LOCAL_OBJS := $(LOCAL_COBJS) $(LOCAL_CPPOBJS) $(LOCAL_ASMOBJS) $(LOCAL_ASMOBJS2)$(LOCAL_CCOBJS)
LOCAL_CGCH := $(patsubst %.h,%.h.gch,$(LOCAL_CHS))
LOCAL_CPPGCH := $(patsubst %.h,%.h.gch,$(LOCAL_CPPHS))

#1.目标all依赖LIB
all : $(LIB)          

#7.将当前路径下的所有.c文件编译为.o文件
$(LOCAL_COBJS): $(OBJOUT)/%.o: %.c   
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(CC) $(LITEOS_CFLAGS) $(LOCAL_FLAGS) $(LOCAL_CFLAGS) -c $< -o $@

$(LOCAL_CPPOBJS): $(OBJOUT)/%.o: %.cpp
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(GPP) $(LITEOS_CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -c $< -o $@

$(LOCAL_ASMOBJS): $(OBJOUT)/%.o: %.S
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(CC) $(LITEOS_CFLAGS) $(LOCAL_FLAGS) $(LOCAL_ASFLAGS) -c $< -o $@

$(LOCAL_ASMOBJS2): $(OBJOUT)/%.o: %.s
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(AS) $(LITEOS_ASFLAGS) $(LOCAL_FLAGS) $(LOCAL_ASFLAGS) -c $< -o $@

$(LOCAL_CCOBJS): $(OBJOUT)/%.o: %.cc
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(GPP) $(LITEOS_CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -c $< -o $@

$(LOCAL_CGCH): %.h.gch : %.h
	$(HIDE)$(CC) $(LITEOS_CFLAGS) $(LOCAL_FLAGS) $(LOCAL_CFLAGS) $> $^

$(LOCAL_CPPGCH): %.h.gch : %.h
	$(HIDE)$(GPP) $(LITEOS_CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -x c++-header $> $^

LOCAL_GCH := $(LOCAL_CGCH) $(LOCAL_CPPGCH)

$(LOCAL_OBJS): $(LOCAL_GCH)
#4.生成LIBA需要依赖LOCAL_OBJS
$(LIBA): $(LOCAL_OBJS)          
	$(HIDE)$(OBJ_MKDIR)

ifeq ($(OS), Linux)
	$(HIDE)$(AR) $(ARFLAGS) $@ $(LOCAL_OBJS)
else
#8.将当前目录下的.o文件打包为libfat.so
ifeq ($(LOCAL_MODULES),)        
	$(HIDE)$(AR) $(ARFLAGS) $@ $(LOCAL_OBJS)
endif

clean:
	$(HIDE)$(RM) $(LIB) $(OBJOUT) $(LOCAL_GCH) *.bak *~

.PHONY: all clean

顶层makefile分析(代码片段)

1.顶层目录下的Makefile        OpenHarmony/kernel/liteos_a/Makefile-include$(LITEOSTOPDIR)/tools/build/config.mk#包含kernel/liteos_a/tools/build/config.mkLITEOS_TARGET=liteosLITEOS_PLATFORM_BASE=$(LITE 查看详情

linux系统移植:u-boot顶层makefile分析(上)(代码片段)

...这两个二、传递变量到子make主目录的Makefile文件可以调用子目录中的Makefile文件,进行编译,主目录调用方式如下:$(MAKE)-Csubdir$(MAKE)就是调用“make”命令,-C指定子目录主Makefile可以使用“export”来导出要传递给... 查看详情

项目通用makefile的编写(包含makefile.build文件分析)(代码片段)

1、前言;下面分析的工程和Makefile是图片解码播放器项目的,具体可参考博客:;2、工程文件夹目录结构.├──bin ——存放生成的可执行程序├──build ——存放Makefile、Makefile.build文件├──doc ——项目说... 查看详情

linux作业使用make命令和分析makefile文件(代码片段)

使用make命令和分析makefile文件  diction是一个经典的Unix小工具,用来检测使用不当的英文短语。  请前往http://www.gnu.org/software/diction/下载diction源码包下载地址(diction源码包:http://ftp.gnu.org/gnu/diction/,diction-0.7... 查看详情

makefile学习笔记系列4:makefile模板化(代码片段)

...ps://blog.csdn.net/u010312436/article/details/52461906中已经实现具有子目录层次结构的makefile写法,即主目录Makefile调用到每个子目录中的Makefile编译相应子目录的代码。但是每增加一个子目录又得为这个子目录添加一个为该子目录编译... 查看详情

linux系统移植:kernel顶层makefile(下)(代码片段)

文章目录Linux系统移植:Kernel顶层Makefile(下)一、makedefconfig过程二、Makefile.build脚本分析三、make过程四、built-in.o文件编译生成过程五、makezImage过程Linux系统移植:Kernel顶层Makefile(下)继续分析Linux内核... 查看详情

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

文章目录linux顶层Makefile分析make过程分析子文件夹编译Makefile.build编译出子文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)&... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层makefile分析(代码片段)

前言本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Ma... 查看详情

makefile步步为营(代码片段)

Makefile步步为营本目录主要包含Makefile一步步递进学习的示例代码makefile代码实例:https://www.lanzous.com/i9m9npistep0:Makefile小实验进行Makefile小实验,体验Makefile的功能。目录中的Makefile是不严谨的编写方式。目录中的Makefile_PHONY是严谨... 查看详情

linux系统移植:u-boot顶层makefile分析(下)(代码片段)

目录Linux系统移植:U-Boot顶层Makefile分析(下)一、调用scripts/Kbuild.include二、导出交叉编译工具变量设置三、导出其他变量四、makexxx_config过程五、make过程Linux系统移植:U-Boot顶层Makefile分析(下)继续沿着... 查看详情

makefile学习笔记系列4:makefile模板化(代码片段)

...ps://blog.csdn.net/u010312436/article/details/52461906中已经实现具有子目录层次结构的makefile写法,即主目录Makefile调用到每个子目录中的Makefile编译相应子目录的代码。但是每增加一个子目录又得为这个子目录添加一个为该子目录编译... 查看详情

makefile(代码片段)

...bsp;    make-Cmake_test2/ 执行某个目录下的Makefile        -Idir指定被包含的Makefile所在目录,引用某些文件的目录,例如说是 CFLAGS=-c-Wall-Iinclude,表示引用的引用了这个文件里面的 查看详情

bsp开发之ubootuboot常用命令以及代码分析(代码片段)

...197定制UBOOT命令UBOOT代码分析(通用UBOOT2016.01代码学习)顶层Makefile分析UBOOT启动过程代码分析第一阶段第二阶段打印测试命令行处理UBOOT代码分析(RTL8197定制uboot代码学习)顶层Makefile分 查看详情

多个文件目录下makefile的写法(代码片段)

...件,多个目录,这时候编译文件的任务量比较大,需要写Makefile。关于Makefile的详细内容可以参考网上流传非常广泛的《跟我一起写Makefile》http://blog.csdn.net/haoel/article/details/2886/,作者是个大牛,非常佩服。2、简单测试  测试... 查看详情

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

文章目录linux顶层Makefile分析make过程分析子文件夹编译Makefile.build编译出子文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)&... 查看详情

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

文章目录linux顶层Makefile分析make过程分析子文件夹编译Makefile.build编译出子文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)&... 查看详情

makefile(08)_打造专业的编译环境(代码片段)

20.打造专业的编译环境(上)_模块Makefile设计20.0.实验材料项目架构:其中各个文件的内容请自己填写。20.1.大型项目的目录结构(无第三方库)20.2.项目架构设计分析项目被划分为不同的多个模块:每个模块用一个文件夹进行管理,... 查看详情

u-boot顶层makefile介绍(*)(代码片段)

参考:U-Boot顶层Makefile介绍作者:一只青木呀发布时间:2020-10-2216:22:17网址:https://blog.csdn.net/weixin_45309916/article/details/109218569目录1、准备好uboot源码2、分析顶层Makefile2.1、版本号2.2、MAKEFLAGS变量2.3、 查看详情