标签:
NuttX 没有使用 Autoconf、 Automake、 CMake、 SCons 等自己主动化编译工具。它的 Makefile 文件全然由手工编写。比那些自己主动化编译工具所使用的编译文件更easy阅读。更easy理解软件的编译过程。
正应了那句话:试图用一种方法使事情变得简单,结果却使事情变得更复杂。
` |<--.config
|
| |<--.config
| |<--tools/Config.mk
|<--Makefile.unix-|
Makefile-| | |<--.config
| |<--Make.defs-|<--tools/Config.mk
| |<--arch/arm/src/armv7-m/Toolchain.defs
|
|<--Makefile.win-(略)能够看出,《nuttx 配置系统》中所生成的 .config 文件被包括在 Makefile 文件里。
distclean
除了完毕 “clean” 的工作之外,还包含移除全部配置和上下文的文件。本质是将文件夹结构还原为其原始的、未配置的状态。
apps_clean
仅对用户应用程序文件夹运行 clean 操作。
apps_distclean
仅对用户应用程序文件夹运行 distclean 操作。 apps/.config 文件被保留,所以这不是一个全然的 distclean。但多于配置复位。
export
export 目标将打包 NuttX 库和头文件到可输出包。
注意事项:(1) 须要对 KERNEL 构建做一些扩展。
(2) tools/mkexport.sh 中的逻辑仅仅支持 GCC,比如,显式地假定静态库生成器为“ar”。
download
这是一个助手目标,它将重建 NuttX 并将其下载到目标系统,仅仅需一步。
此目标的操作全然依赖于用户 Make.defs 文件里的 DOWNLOAD 命令的实现。假设没有定义 DOWNLOAD 命令。它将产生一个错误。
基本配置步骤包含在 include/nuttx 文件夹中创建 config.h 和 version.h 头文件,建立链接到配置文件夹的符号链接。
clean_context
这是 distclean 目标的一部分。它移除由 context 目标创建的全部头文件和符号链接。
` |<--pass1dep-|<----------------------------------------╮
|<--pass1deps-| |<--tools/mkdeps$(HOSTEXEEXT) |
| | | |
| ╭--╯ |<--$(USERLIBS)(平面构建时为空) |
| | |
| | |<--pass2dep-|<---------------------------------------|
|<---pass2deps-| |<--tools/mkdeps$(HOSTEXEEXT) |
| | | | |
| | | |<--$(NUTTXLIBS)(与配置有关)<--╮ |
| | | | |
| | | ╭-----------------------------------╯ |
| | | | |
| | | |<--lib/libsched$(LIBEXT)<--sched/libsched$(LIBEXT)<--------|
| | | |<--lib/libc$(LIBEXT)<--libc/libc$(LIBEXT)<-----------------|
| | | |<--lib/libmm$(LIBEXT)<--mm/libmm$(LIBEXT)<-----------------|
all<--$(BIN)-| | | |<--lib/libarch$(LIBEXT)<--$(ARCH_SRC)/libarch$(LIBEXT)<----|
| | | |<--lib/libcxx$(LIBEXT)<--libxx/libcxx$(LIBEXT)<------------|
| | | |<--lib/libapps$(LIBEXT)<--$(APPDIR)/libapps$(LIBEXT)<------|
| | | |<--lib/libnet$(LIBEXT)<--net/libnet$(LIBEXT)<--------------|
| | | |<--lib/libfs$(LIBEXT)<--fs/libfs$(LIBEXT)<-----------------|
| | | |<--lib/libdrivers$(LIBEXT)<--drivers/libdrivers$(LIBEXT)<--|
| | | |<--lib/libbinfmt$(LIBEXT)<--binfmt/libbinfmt$(LIBEXT)<-----|
| | | |
| | ╰---------╮ |
| | | |
| ╰--------╮ | |
| | | |
|<--pass1<--╯ | |
| | |
|<--pass2<------╯ |
|
╭---------------------------------------------------------------------------╯
|
| |<--check_context
| |
| |<--include/nuttx/config.h-|<--$(TOPDIR)/.config
| | |<--tools/mkconfig$(HOSTEXEEXT)
| |
| |<--include/nuttx/version.h-|<--$(TOPDIR)/.version
| | |<--tools/mkversion$(HOSTEXEEXT)
| |
|<--context-|<--include/math.h<--include/nuttx/math.h
|<--include/float.h<--include/nuttx/float.h
|<--include/stdarg.h<--include/nuttx/stdarg.h
|
| |<--include/arch<-Make.defs
| |
| |<--include/arch/board-|<--include/arch<--Make.defs
| | |<--Make.defs
| |
|<--dirlinks-|<--include/arch/chip-|<--include/arch<--Make.defs
| |<--Make.defs
|
|<--$(ARCH_SRC)/board<--Make.defs
|<--$(ARCH_SRC)/chip<--Make.defs
|<--include/apps<--Make.defs
$(ARCH_SRC)/chip:
将 nuttx/arch/arm/src/stm32 文件夹链接到 nuttx/arch/arm/src/chip 文件夹。
可是由于在安装 buildroot 时已经运行过一次 make context,并且运行 make clean 也不会删除 context 目标所生成的文件,所以这一步没做不论什么事。
pass1dep: context tools/mkdeps$(HOSTEXEEXT)
$(Q) for dir in $(USERDEPDIRS) ; do $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" depend ; done平面构建是指将 NuttX 编译成单个二进制文件,构建的全部组件位于同样的地址空间,全部组件都能够訪问全部其他组件。平面构建时 $(USERDEPDIRS) 为空,它也没做不论什么事。
这样整个 pass1deps 目标就完毕了。
pass2dep: context tools/mkdeps$(HOSTEXEEXT)
$(Q) for dir in $(KERNDEPDIRS) ; do $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" EXTRADEFINES=$(KDEFINE) depend; done依据 $(KERNDEPDIRS) 变量的值,在各级子文件夹下生成 Make.dep 和 .depend文件。
$(ARCH_SRC)/libarch$(LIBEXT): context
$(Q) $(MAKE) -C $(ARCH_SRC) TOPDIR="$(TOPDIR)" libarch$(LIBEXT)当中: $(ARCH_SRC) = nuttx/arch/arm/src。$(LIBEXT) = .a。传递的不是变量名,而是变量中的值。第2行的意思是先切换到文件夹 nuttx/arch/arm/src。再运行 make 命令,传递參数 TOPDIR。编译目标 libarch.a。这里的 make 调用的是文件夹 nuttx/arch/arm/src 中的 Makefile,编译的是该 Makefile 中的目标。在 nuttx/arch/arm/src/Makefile 中先定义
BIN = libarch$(LIBEXT),然后:$(BIN) $(KBIN): $(OBJS)
$(call ARCHIVE, $@, $(OBJS))当中:OBJS = $(AOBJS) $(COBJS),而lib/libarch$(LIBEXT): $(ARCH_SRC)/libarch$(LIBEXT)
$(Q) install $(ARCH_SRC)/libarch$(LIBEXT) lib/libarch$(LIBEXT)当中: install 是 Linux 命令。这里等同于复制。将 libarch.a 拷贝到 nuttx/lib 文件夹。pass1: pass1deps
ifeq ($(CONFIG_BUILD_2PASS),y)
$(Q) if [ -z "$(CONFIG_PASS1_BUILDIR)" ]; then echo "ERROR: CONFIG_PASS1_BUILDIR not defined"; exit 1; fi
$(Q) if [ ! -d "$(CONFIG_PASS1_BUILDIR)" ]; then echo "ERROR: CONFIG_PASS1_BUILDIR does not exist"; exit 1; fi
$(Q) if [ ! -f "$(CONFIG_PASS1_BUILDIR)/Makefile" ]; then echo "ERROR: No Makefile in CONFIG_PASS1_BUILDIR"; exit 1; fi
$(Q) $(MAKE) -C $(CONFIG_PASS1_BUILDIR) TOPDIR="$(TOPDIR)" LINKLIBS="$(LINKLIBS)" USERLIBS="$(USERLIBS)" "$(CONFIG_PASS1_TARGET)"
endif平面构建时不做不论什么事。
pass2: pass2deps
$(Q) $(MAKE) -C $(ARCH_SRC) TOPDIR="$(TOPDIR)" EXTRA_OBJS="$(EXTRA_OBJS)" LINKLIBS="$(LINKLIBS)" EXTRADEFINES=$(KDEFINE) $(BIN)
$(Q) if [ -w /tftpboot ] ; then cp -f $(BIN) /tftpboot/$(BIN).${CONFIG_ARCH}; fi
ifeq ($(CONFIG_RRLOAD_BINARY),y)
@echo "MK: $(BIN).rr"
$(Q) $(TOPDIR)/tools/mkimage.sh --Prefix $(CROSSDEV) $(BIN) $(BIN).rr
$(Q) if [ -w /tftpboot ] ; then cp -f $(BIN).rr /tftpboot/$(BIN).rr.$(CONFIG_ARCH); fi
endif
ifeq ($(CONFIG_INTELHEX_BINARY),y)
@echo "CP: $(BIN).hex"
$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex $(BIN) $(BIN).hex
endif
ifeq ($(CONFIG_MOTOROLA_SREC),y)
@echo "CP: $(BIN).srec"
$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O srec $(BIN) $(BIN).srec
endif
ifeq ($(CONFIG_RAW_BINARY),y)
@echo "CP: $(BIN).bin"
$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary $(BIN) $(BIN).bin
endif
@echo "DUMP: $(BIN).out"
$(Q) $(OBJDUMP) -x $(BIN) > $(HOME)/$(BIN).out
@echo "DUMP: $(BIN).S"
$(Q) $(OBJDUMP) -d -j .text -j .init_section -j .ARM.exidx -j .data -j .bss $(BIN) > $(HOME)/$(BIN).S
cp -f $(BIN) $(BIN).hex $(BIN).bin $(HOME)把静态库链接成 elf 格式的可运行文件。并转换成 .hex、 .bin 等其他格式的文件。最后5行是我加上去的。生成符号文件、反汇编文件,并把一些终于文件拷贝到 Linux 用户主文件夹。由《NuttX 安装脚本》中的下面几行实现:
if !(grep -q ‘ @echo "DUMP: $(BIN).out"‘ Makefile.unix); then
sed -i ‘/pass2:/,/^$/{
/^$/i\ @echo "DUMP: $(BIN).out"
/^$/i\ $(Q) $(OBJDUMP) -x $(BIN) > $(HOME)/$(BIN).out
/^$/i\ @echo "DUMP: $(BIN).S"
/^$/i\ $(Q) $(OBJDUMP) -d -j .text -j .init_section -j .ARM.exidx -j .data -j .bss $(BIN) > $(HOME)/$(BIN).S
/^$/i\ cp -f $(BIN) $(BIN).hex $(BIN).bin $(HOME)
}‘ Makefile.unix
fi由《NuttX 安装脚本》中的下面几行实现:
echo "nuttx配置" cd $BASEDIR/$TOPDIR/nuttx/tools ./configure.sh $TARGETCONFIG该 Makefile 片断提供架构和工具特定的构建选项。
它将在构建时被全部其他 Makefile 文件包括(一旦它被安装)。该 makefile 片断应定义:
版权声明:本文博主原创文章,博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4805008.html