在使用Nuttx的过程中,第一步就是下载好源代码然后搭建编译环境,具体可以参考这篇外国小哥的博客CONFIGURE NuttX,具体的搭建过程就不详细叙述了,这次主要是记录下配置的过程。主要涉及的内容如下:
- nuttx/tools/configure.sh分析
- ${boardconfig}下的defconfig和Make.def
nuttx/tools/configure.sh
在明确开发板类型以后,我们采用上面超链接里面提到的步骤来配置:
- cd nuttx/nuttx-code/nuttx/tools
- ./configure.sh stm32f100rc_generic/nsh
到这里我们就直接去看看./configure.sh到底干了些什么。。。
先贴上脚本~
#!/bin/bash # configure.sh # # Copyright (C) 2007, 2008, 2011, 2015 Gregory Nutt. All rights reserved. # Author: Gregory Nutt <gnutt@nuttx.org> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # 3. Neither the name NuttX nor the names of its contributors may be # used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # WD=`pwd` TOPDIR="${WD}/.." #通过当前路径找到顶层目录 USAGE=" USAGE: ${0} [-d] [-a <app-dir>] <board-name>/<config-name> Where: <board-name> is the name of the board in the configs directory <config-name> is the name of the board configuration sub-directory <app-dir> is the path to the apps/ directory, relative to the nuttx directory " #上面这段是用来告诉我们如何使用这个脚本的(使用说明)
接着来分析,先补充点小知识:
./configure.sh stm32f100rc_generic/nsh
$0 ――――――――$1
就是说
$0=“./configure.sh”
$1=“stm32f100rc_generic/nsh”
好了继续贴:
# Parse command arguments unset boardconfig unset appdir while [ ! -z "$1" ]; do case "$1" in -d ) #“stm32f100rc_generic/nsh”如果为路径 set -x #设置代码执行过程中回显 ;; -h ) echo "$USAGE" #“stm32f100rc_generic/nsh”如果为软链接 exit 0 ;; -a ) #“stm32f100rc_generic/nsh”如果存在 shift appdir=$1 ;; *) #\$1是任何符号,哪怕是空 if [ ! -z "${boardconfig}" ]; then #如果${boardconfig}已经存在了 echo "" echo "<board/config> defined twice" echo "$USAGE" exit 1 fi boardconfig=$1 ;; esac shift done
执行完这一段脚本,其实就是处理传入的$1的参数,也就是目标板的配置路径,是否合法,并记录路径;
好,接着来执行下一段:
# Sanity checking if [ -z "${boardconfig}" ]; then #${boardconfig}如果为空,也就说我们在开始的时候没有传入参数,例如这样./configure.sh echo "" echo "Missing <board/config> argument" echo "$USAGE" exit 2 fi configpath=${TOPDIR}/configs/${boardconfig}#一旦有目标板的合法地址传进来,那么完整记录到configpath if [ ! -d "${configpath}" ]; then echo "Directory ${configpath} does not exist. Options are:" echo "" echo "Select one of the following options for <board-name>:" configlist=`find ${TOPDIR}/configs -name defconfig` for defconfig in $configlist; do config=`dirname $defconfig | sed -e "s,${TOPDIR}/configs/,,g"` echo " $config" done echo "" echo "$USAGE" exit 3 fi #接下来的操作就是重点了,先讲讲目的,我们配置目标开发的最终其实就是操作三个文件: #1、Make.defs #2、defconfig #3、setenv.sh #所以接下来说做的一切就是把目标板下面的这两个文件设置到我们顶层目录下。 src_makedefs="${configpath}/Make.defs" #目标板配置路径下的Make.defs dest_makedefs="${TOPDIR}/Make.defs" #主目录下的Make.defs #${src_makedefs}如果没有可读权限的话,那就拜拜了,直接exit。 if [ ! -r "${src_makedefs}" ]; then echo "File \"${src_makedefs}\" does not exist" exit 4 fi #${src_makedefs}可以读的话,就把setenv.sh的路径记下来吧~ src_setenv="${configpath}/setenv.sh" unset have_setenv #${src_setenv}通过读权限来是别是脚本还是批处理文件,然后记录下顶层的setenv.sh路径,保存在dest_setenv if [ -r "${src_setenv}" ]; then dest_setenv=${TOPDIR}/setenv.sh have_setenv=y else src_setenv="${configpath}/setenv.bat" if [ -r "${src_setenv}" ]; then dest_setenv=${TOPDIR}/setenv.bat have_setenv=y else unset src_setenv fi fi #接下来目标defconfig src_config="${configpath}/defconfig" dest_config="${TOPDIR}/.config" if [ ! -r "${src_config}" ]; then echo "File \"${src_config}\" does not exist" exit 6 fi
走玩上面这段脚本,我们基本上都能发现目的了,总结下,到目前为止都得到了哪些信息:
WD=`pwd` TOPDIR="${WD}/.." USAGE=" USAGE: ${0} [-d] [-a <app-dir>] <board-name>/<config-name> Where: <board-name> is the name of the board in the configs directory <config-name> is the name of the board configuration sub-directory <app-dir> is the path to the apps/ directory, relative to the nuttx directory " # Parse command arguments unset boardconfig unset appdir boardconfig=$1 # Sanity checking configpath=${TOPDIR}/configs/${boardconfig} src_makedefs="${configpath}/Make.defs" dest_makedefs="${TOPDIR}/Make.defs" src_setenv="${configpath}/setenv.sh" unset have_setenv dest_setenv=${TOPDIR}/setenv.sh have_setenv=y src_config="${configpath}/defconfig" dest_config="${TOPDIR}/.config"
好的继续往下,脚步不要停~~~~~~
# Extract values needed from the defconfig file. We need: # (1) The CONFIG_WINDOWS_NATIVE setting to know it this is target for a # native Windows (meaning that we want setenv.bat vs setenv.sh and we need # to use backslashes in the CONFIG_APPS_DIR setting). # (2) The CONFIG_APPS_DIR setting to see if there is a configured location for the # application directory. This can be overridden from the command line. winnative=`grep CONFIG_WINDOWS_NATIVE= "${src_config}" | cut -d'=' -f2` defappdir=y if [ -z "${appdir}" ]; then quoted=`grep "^CONFIG_APPS_DIR=" "${src_config}" | cut -d'=' -f2` if [ ! -z "${quoted}" ]; then appdir=`echo ${quoted} | sed -e "s/\"//g"` defappdir=n fi fi #啥意思有点看不懂,没事抓重点: #quoted=`grep "^CONFIG_APPS_DIR=" "${src_config}" | cut -d'=' -f2` #appdir=`echo ${quoted} | sed -e "s/\"//g"` #defappdir=n # Check for the apps/ directory in the usual place if appdir was not provided if [ -z "${appdir}" ]; then # Check for a version file unset CONFIG_VERSION_STRING if [ -x "${TOPDIR}/.version" ]; then . "${TOPDIR}/.version" fi # Check for an unversioned apps/ directory if [ -d "${TOPDIR}/../apps" ]; then appdir="../apps" else # Check for a versioned apps/ directory if [ -d "${TOPDIR}/../apps-${CONFIG_VERSION_STRING}" ]; then appdir="../apps-${CONFIG_VERSION_STRING}" fi fi fi
饶了一大圈最后就是要从”${configpath}/defconfig”找到看看有没有定义appdir的路径~~~
继续往下:
# For checking the apps dir path, we need a POSIX version of the relative path. #还是在设置关于appdir posappdir=`echo "${appdir}" | sed -e 's/\\\\/\\//g'` winappdir=`echo "${appdir}" | sed -e 's/\\//\\\\/g'` # If appsdir was provided (or discovered) then make sure that the apps/ # directory exists if [ ! -z "${appdir}" -a ! -d "${TOPDIR}/${posappdir}" ]; then echo "Directory \"${TOPDIR}/${posappdir}\" does not exist" exit 7 fi # Okay... Everything looks good. Setup the configuration #我来翻译,搞了大半天终于设置好了各种路径信息,来吧~挽起袖子直接干吧!!! #{code1} || {code2},啥意思{code1}执行正确了,后面就不用执行了,否则{code2}执行 #干啥呢,就是把${src_makedefs}复制到${dest_makedefs},再把权限改成644; install -m 644 "${src_makedefs}" "${dest_makedefs}" || \ { echo "Failed to copy \"${src_makedefs}\"" ; exit 7 ; } if [ "X${have_setenv}" = "Xy" ]; then install "${src_setenv}" "${dest_setenv}" || \ { echo "Failed to copy ${src_setenv}" ; exit 8 ; } chmod 755 "${dest_setenv}" fi install -m 644 "${src_config}" "${dest_config}" || \ { echo "Failed to copy \"${src_config}\"" ; exit 9 ; } #处理完Make.defs、setenv.sh、defconfig。大功告成,后面的就是提示信息了 # If we did not use the CONFIG_APPS_DIR that was in the defconfig config file, # then append the correct application information to the tail of the .config # file if [ "X${defappdir}" = "Xy" ]; then # In-place edit can mess up permissions on Windows # sed -i -e "/^CONFIG_APPS_DIR/d" "${dest_config}" sed -e "/^CONFIG_APPS_DIR/d" "${dest_config}" > "${dest_config}-temp" mv "${dest_config}-temp" "${dest_config}" echo "" >> "${dest_config}" echo "# Application configuration" >> "${dest_config}" echo "" >> "${dest_config}" if [ "X${winnative}" = "Xy" ]; then echo "CONFIG_APPS_DIR=\"$winappdir\"" >> "${dest_config}" else echo "CONFIG_APPS_DIR=\"$posappdir\"" >> "${dest_config}" fi fi
./configure 到这里就执行完了,所以能看出来的就是,主要是把目标板下的3个默认文件copy到顶层目录下的指定文件中去,接下在make的时候就能起作用啦。
文章来源: CONFIGURE NuttX过程分析