liteOS-研究ノート-04Liteos-コンパイルシステム-4-1_サブディレクトリのコンパイル方法

プロセスを説明するための例として、コンパイルファイルシステムを取り上げます。コアはサブシステムのメイクファイルです。
まず、config.mkファイルで定義されている一般的なコンパイルオプションとマクロ定義
、次にローカルソースファイルのヘッダーファイルとコンパイルオプションを
定義し最後に、結果を生成するファイルと生成方法を定義します。

ステップ1:

Openharmony_CommentByLine \ kernel_liteos_a_note \ fs \ fat \ makefile

以下のmakefileの1〜4には、コンパイルされたファイルシステムのソースファイルのパス、ヘッダーファイルのパス、およびコンパイルオプションが含まれています。

################################################################
# 5. $(LITEOSTOPDIR):表示内核顶层目录(OpenharmonyFor6ull_Weidongshan\kernel\liteos_a)里面的config.mk
include $(LITEOSTOPDIR)/config.mk

################################################################
# 1. $(shell pwd)表示:当前目录 Openharmony_CommentByLine\kernel_liteos_a_note\fs\fat
# $(notdir $(shell pwd))表示:去掉前缀即fat
MODULE_NAME := $(notdir $(shell pwd)) 

################################################################
# 2. LOCAL_SRCS表示:本地源文件,
# 当前目录下os_adapt文件夹下面所有的*.c文件即fat_shellcmd.c和fatfs.c
LOCAL_SRCS := $(wildcard os_adapt/*.c)
# 还包含了另外的路径下(third_party\FatFs\source)的*.c
LOCAL_SRCS += $(wildcard $(LITEOSTHIRDPARTY)/FatFs/source/*.c)
################################################################
# 3. LOCAL_INCLUDE 表示:本地源文件对应的头文件
LOCAL_INCLUDE := \
    -I $(LITEOSTHIRDPARTY)/FatFs/source \
    -I $(LITEOSTOPDIR)/fs/fat/virpart/include

################################################################
# 4. LOCAL_FLAGS 表示:本地编译选项
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)

################################################################
# 6.如何链接
# $(MODULE)表示路径:kernel\liteos_a\tools\build\mk\module.mk
include $(MODULE)

ステップ2:上記5.は一般的なコンパイルオプションを定義します

ソースファイルは次のとおりです

OpenharmonyFor6ull_Weidongshan \ kernel \ liteos_a \ config.mk

############### this is a makefile that you can config it ###############
-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)


ステップ3:上記6.はコンパイルプロセスを定義します

ソースファイルは次のとおりです

kernel \ liteos_a \ tools \ build \ mk \ module.mk

ifeq ($(OS), Linux)
OBJOUT := $(BUILD)$(dir $(subst $(LITEOSTOPDIR),,$(shell pwd)))$(MODULE_NAME)
LOCAL_PWD := $(shell pwd)
else
TEMPLITEOSTOPDIR:=$(shell cygpath -u $(LITEOSTOPDIR))
OBJOUT := $(BUILD)$(dir $(subst $(TEMPLITEOSTOPDIR),,$(shell pwd)))$(MODULE_NAME)
LOCAL_PWD := $(shell cygpath -m $(shell pwd))
endif

ifeq ($(LOCAL_SO), y)
LIBSO := $(OUT)/lib/lib$(MODULE_NAME).so
LIBA := $(OUT)/lib/lib$(MODULE_NAME).a
else
LIBSO :=
# 3.$(LIBA)表示:$(OUT)/lib/libfat.a
# MODULE_NAME在文件\fs\fat\makefile中已经定义好
LIBA := $(OUT)/lib/lib$(MODULE_NAME).a
endif

# 2.核心结果的依赖
LIB := $(LIBA) $(LIBSO)

# create a separate list of objects per source type

LOCAL_CSRCS := $(filter %.c,$(LOCAL_SRCS))
LOCAL_CPPSRCS := $(filter %.cpp,$(LOCAL_SRCS))
LOCAL_ASMSRCS := $(filter %.S,$(LOCAL_SRCS))
LOCAL_ASMSRCS2 := $(filter %.s,$(LOCAL_SRCS))
LOCAL_CCSRCS := $(filter %.cc,$(LOCAL_SRCS))
#7.
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))

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))
#$(info LOCAL_SRCS = $(LOCAL_SRCS))
#$(info LOCAL_CSRCS = $(LOCAL_CSRCS))
#$(info LOCAL_CPPSRCS = $(LOCAL_CPPSRCS))
#$(info LOCAL_ASMSRCS = $(LOCAL_ASMSRCS))
#$(info LOCAL_ASMSRCS2 = $(LOCAL_ASMSRCS2))
#$(info LOCAL_CCSRCS = $(LOCAL_CCSRCS))

#$(info LOCAL_OBJS = $(LOCAL_OBJS))
#$(info LOCAL_COBJS = $(LOCAL_COBJS))
#$(info LOCAL_CPPOBJS = $(LOCAL_CPPOBJS))
#$(info LOCAL_ASMOBJS = $(LOCAL_ASMOBJS))
#$(info LOCAL_ASMOBJS2 = $(LOCAL_ASMOBJS2))
#$(info LOCAL_CCOBJS = $(LOCAL_CCOBJS))

# 1.all:编译核心结果
all : $(LIB)
# 8.
$(LOCAL_COBJS): $(OBJOUT)/%.o: %.c
	$(HIDE)$(OBJ_MKDIR)
	$(HIDE)$(CC) $(LITEOS_CFLAGS) $(LOCAL_FLAGS) $(LOCAL_CFLAGS) -c $< -o $@ #$(LITEOS_CFLAGS):全局的编译选项;$(LOCAL_FLAGS) 本地的编译选项

$(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)
# 6.
$(LOCAL_OBJS): $(LOCAL_GCH)
# 4.继续追踪核心的依赖
$(LIBA): $(LOCAL_OBJS)
	$(HIDE)$(OBJ_MKDIR)

ifeq ($(OS), Linux)
	$(HIDE)$(AR) $(ARFLAGS) $@ $(LOCAL_OBJS)
else
ifeq ($(LOCAL_MODULES),)
# 5.把$(LOCAL_OBJS)文件打包成libfs.a文件
	$(HIDE)$(AR) $(ARFLAGS) $@ $(LOCAL_OBJS)
else
	$(HIDE)for i in $(LOCAL_MODULES); do \
		pushd $(OBJOUT)/$$i 1>/dev/null; \
		$(AR) $(ARFLAGS) $@ *.o;\
		popd 1>/dev/null;\
	done
endif
endif

ifeq ($(LOCAL_SO), y)
$(LIBSO): $(LOCAL_OBJS)
	$(HIDE)$(CC) $(LITEOS_CFLAGS) -fPIC -shared $^ -o $@
endif

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

.PHONY: all clean

# clear some variables we set here
LOCAL_CSRCS :=
LOCAL_CPPSRCS :=
LOCAL_ASMSRCS :=
LOCAL_COBJS :=
LOCAL_CPPOBJS :=
LOCAL_ASMOBJS :=
LOCAL_ASMOBJS2 :=

# LOCAL_OBJS is passed back
#LOCAL_OBJS :=

$(LOCAL_OBJS)ファイルとは何ですか?「#7」を参照してください。
上記のコードで$(LOCAL_OBJS)ファイルをコンパイルするにはどうすればよいですか?上記のコードの「#8」を参照してください

おすすめ

転載: blog.csdn.net/xiaoaojianghu09/article/details/110405040