diff options
author | px4dev <px4@purgatory.org> | 2013-01-11 02:14:43 -0800 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2013-01-11 02:14:43 -0800 |
commit | f127495caa2d45a1b1fff3be7a9d3756259d23e2 (patch) | |
tree | 91daf599eae326f2207d0fbd9ede34b51eca1812 /nuttx/tools | |
parent | 48c5d63319be3b8da7c4cd598d2a31dceae842a7 (diff) | |
download | px4-firmware-f127495caa2d45a1b1fff3be7a9d3756259d23e2.tar.gz px4-firmware-f127495caa2d45a1b1fff3be7a9d3756259d23e2.tar.bz2 px4-firmware-f127495caa2d45a1b1fff3be7a9d3756259d23e2.zip |
Manually fixup merge botches via direct comparison with NuttX r5447.
Diffstat (limited to 'nuttx/tools')
-rw-r--r-- | nuttx/tools/Makefile.export | 4 | ||||
-rwxr-xr-x | nuttx/tools/configure.sh | 92 | ||||
-rw-r--r-- | nuttx/tools/define.bat | 178 | ||||
-rwxr-xr-x | nuttx/tools/define.sh | 8 | ||||
-rwxr-xr-x | nuttx/tools/incdir.sh | 3 | ||||
-rw-r--r-- | nuttx/tools/mkconfig.c | 2 | ||||
-rw-r--r-- | nuttx/tools/mkdeps.bat | 173 | ||||
-rw-r--r-- | nuttx/tools/mkdeps.c | 721 | ||||
-rwxr-xr-x | nuttx/tools/mkdeps.sh | 2 | ||||
-rwxr-xr-x | nuttx/tools/mkromfsimg.sh | 2 | ||||
-rw-r--r-- | nuttx/tools/mksymtab.c | 2 |
11 files changed, 1147 insertions, 40 deletions
diff --git a/nuttx/tools/Makefile.export b/nuttx/tools/Makefile.export index e3629a480..002cb526b 100644 --- a/nuttx/tools/Makefile.export +++ b/nuttx/tools/Makefile.export @@ -67,7 +67,7 @@ endif @echo "ARCHCFLAGS=\"$(ARCHCFLAGS) $(ARCHCPUFLAGS)\"" >> $(EXPORTDIR)/makeinfo.sh @echo "ARCHCXXFLAGS=\"$(ARCHCXXFLAGS) $(ARCHCPUFLAGS)\"" >> $(EXPORTDIR)/makeinfo.sh @echo "CROSSDEV=\"$(CROSSDEV)\"" >> $(EXPORTDIR)/makeinfo.sh - @chmod 755 $(EXPORTDIR)/makeinfo.sh + $(Q) chmod 755 $(EXPORTDIR)/makeinfo.sh clean: - @rm -f $(EXPORTDIR)/makeinfo.sh + $(Q) rm -f $(EXPORTDIR)/makeinfo.sh diff --git a/nuttx/tools/configure.sh b/nuttx/tools/configure.sh index 3b68fe3f6..ffa997178 100755 --- a/nuttx/tools/configure.sh +++ b/nuttx/tools/configure.sh @@ -100,32 +100,54 @@ if [ ! -d "${configpath}" ]; then exit 3 fi -if [ ! -r "${configpath}/Make.defs" ]; then - echo "File \"${configpath}/Make.defs\" does not exist" +src_makedefs="${configpath}/Make.defs" +dest_makedefs="${TOPDIR}/Make.defs" + +if [ ! -r "${src_makedefs}" ]; then + echo "File \"${src_makedefs}\" does not exist" exit 4 fi -if [ ! -r "${configpath}/setenv.sh" ]; then - echo "File \"${configpath}/setenv.sh\" does not exist" - exit 5 +src_setenv="${configpath}/setenv.sh" +unset have_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 -if [ ! -r "${configpath}/defconfig" ]; then - echo "File \"${configpath}/defconfig\" does not exist" +src_config="${configpath}/defconfig" +tmp_config="${TOPDIR}/.configX" +dest_config="${TOPDIR}/.config" + +if [ ! -r "${src_config}" ]; then + echo "File \"${src_config}\" does not exist" exit 6 fi # Extract values needed from the defconfig file. We need: # (1) The CONFIG_NUTTX_NEWCONFIG setting to know if this is a "new" style -# configuration, and -# (2) The CONFIG_APPS_DIR to see if there is a configured location for the -# application directory. +# configuration, +# (2) 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). +# (3) 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. -newconfig=`grep CONFIG_NUTTX_NEWCONFIG= "${configpath}/defconfig" | cut -d'=' -f2` +newconfig=`grep CONFIG_NUTTX_NEWCONFIG= "${src_config}" | cut -d'=' -f2` +winnative=`grep CONFIG_WINDOWS_NATIVE= "${src_config}" | cut -d'=' -f2` defappdir=y if [ -z "${appdir}" ]; then - quoted=`grep "^CONFIG_APPS_DIR=" "${configpath}/defconfig" | cut -d'=' -f2` + quoted=`grep "^CONFIG_APPS_DIR=" "${src_config}" | cut -d'=' -f2` if [ ! -z "${appdir}" ]; then appdir=`echo ${quoted} | sed -e "s/\"//g"` defappdir=n @@ -157,34 +179,45 @@ if [ -z "${appdir}" ]; then fi fi +# For checking the apps dir path, we need a POSIX version of the relative path. + +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}/${appdir}" ]; then - echo "Directory \"${TOPDIR}/${appdir}\" does not exist" +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 -install -C "${configpath}/Make.defs" "${TOPDIR}/." || \ - { echo "Failed to copy ${configpath}/Make.defs" ; exit 7 ; } -install -C "${configpath}/setenv.sh" "${TOPDIR}/." || \ - { echo "Failed to copy ${configpath}/setenv.sh" ; exit 8 ; } -chmod 755 "${TOPDIR}/setenv.sh" -install -C "${configpath}/defconfig" "${TOPDIR}/.configX" || \ - { echo "Failed to copy ${configpath}/defconfig" ; exit 9 ; } +install "${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 "${src_config}" "${tmp_config}" || \ + { echo "Failed to copy \"${src_config}\"" ; exit 9 ; } # 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 - sed -i -e "/^CONFIG_APPS_DIR/d" "${TOPDIR}/.configX" - echo "" >> "${TOPDIR}/.configX" - echo "# Application configuration" >> "${TOPDIR}/.configX" - echo "" >> "${TOPDIR}/.configX" - echo "CONFIG_APPS_DIR=\"$appdir\"" >> "${TOPDIR}/.configX" + sed -i -e "/^CONFIG_APPS_DIR/d" "${tmp_config}" + echo "" >> "${tmp_config}" + echo "# Application configuration" >> "${tmp_config}" + echo "" >> "${tmp_config}" + if [ "X${winnative}" = "Xy" ]; then + echo "CONFIG_APPS_DIR=\"$winappdir\"" >> "${tmp_config}" + else + echo "CONFIG_APPS_DIR=\"$posappdir\"" >> "${tmp_config}" + fi fi # Copy appconfig file. The appconfig file will be copied to ${appdir}/.config @@ -195,7 +228,7 @@ if [ ! -z "${appdir}" -a "X${newconfig}" != "Xy" ]; then if [ ! -r "${configpath}/appconfig" ]; then echo "NOTE: No readable appconfig file found in ${configpath}" else - install -C "${configpath}/appconfig" "${TOPDIR}/${appdir}/.config" || \ + install "${configpath}/appconfig" "${TOPDIR}/${posappdir}/.config" || \ { echo "Failed to copy ${configpath}/appconfig" ; exit 10 ; } fi fi @@ -203,6 +236,5 @@ fi # install the final .configX only if it differs from any existing # .config file. -install -C "${TOPDIR}/.configX" "${TOPDIR}/.config" -rm -f "${TOPDIR}/.configX" - +install "${tmp_config}" "${dest_config}" +rm -f "${tmp_config}" diff --git a/nuttx/tools/define.bat b/nuttx/tools/define.bat new file mode 100644 index 000000000..13d29ac31 --- /dev/null +++ b/nuttx/tools/define.bat @@ -0,0 +1,178 @@ +@echo off + +rem tools/define.bat +rem +rem Copyright (C) 2012 Gregory Nutt. All rights reserved. +rem Author: Gregory Nutt <gnutt@nuttx.org> +rem +rem Redistribution and use in source and binary forms, with or without +rem modification, are permitted provided that the following conditions +rem are met: +rem +rem 1. Redistributions of source code must retain the above copyright +rem notice, this list of conditions and the following disclaimer. +rem 2. Redistributions in binary form must reproduce the above copyright +rem notice, this list of conditions and the following disclaimer in +rem the documentation and/or other materials provided with the +rem distribution. +rem 3. Neither the name NuttX nor the names of its contributors may be +rem used to endorse or promote products derived from this software +rem without specific prior written permission. +rem +rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +rem FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +rem COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +rem INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +rem BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +rem OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +rem AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +rem LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +rem ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +rem POSSIBILITY OF SUCH DAMAGE. + +rem Handle command line options +rem [-h] <compiler-path> <def1> [-val <val1>] [<def2> [-val <val2>] [<def3> [-val <val3>] ...]] +rem [-w] [-d] ignored for compatibility with define.sh + +set progname=%0 + +:ArgLoop +if "%1"=="-d" goto :NextArg +if "%1"=="-w" goto :NextArg +if "%1"=="-h" goto :ShowUsage + +goto :CheckCompilerPath + +:NextArg +shift +goto :ArgLoop + +:CheckCompilerPath + +if "%1"=="" ( + echo Missing compiler path + goto :ShowUsage +) + +set ccpath=%1 +shift + +set compiler= +for /F %%i in ("%ccpath%") do set compiler=%%~ni + +if "%1"=="" ( + echo Missing definition list + goto :ShowUsage +) + +rem Check for some well known, non-GCC Windows native tools that require +rem a special output format as well as special paths + +:GetFormat +set fmt=std +if "%compiler%"=="ez8cc" goto :SetZdsFormt +if "%compiler%"=="zneocc" goto :SetZdsFormt +if "%compiler%"=="ez80cc" goto :SetZdsFormt +goto :ProcessDefinitions + +:SetZdsFormt +set fmt=zds + +rem Now process each directory in the directory list + +:ProcessDefinitions +set response= + +:DefinitionLoop +if "%1"=="" goto :Done + +set varname=%1 +shift + +rem Handle the output depending on if there is a value for the variable or not + +if "%1"=="-val" goto :GetValue + +rem Handle the output using the selected format + +:NoValue +if "%fmt%"=="zds" goto :NoValueZDS + +:NoValueStandard +rem Treat the first definition differently + +if "%response%"=="" ( + set response=-D%varname% + goto :DefinitionLoop +) + +set response=%response% -D%varname% +goto :DefinitionLoop + +:NoValueZDS +rem Treat the first definition differently + +if "%response%"=="" ( + set response=-define:%varname% + goto :DefinitionLoop +) + +set response=%response% -define:%varname% +goto :DefinitionLoop + +rem Get value following the variable name + +:GetValue +shift +set varvalue=%1 +shift + +rem Handle the output using the selected format + +if "%fmt%"=="zds" goto :ValueZDS + +:ValueStandard +rem Treat the first definition differently + +if "%response%"=="" ( + set response=-D%varname%=%varvalue% + goto :DefinitionLoop +) + +set response=%response% -D%varname%=%varvalue% +goto :DefinitionLoop + +:ValueZds +rem Treat the first definition differently + +if "%response%"=="" ( + set response=-define:%varname%=%varvalue% + goto :DefinitionLoop +) + +set response=%response% -define:%varname%=%varvalue% +goto :DefinitionLoop + +:Done +echo %response% +goto :End + +:ShowUsage +echo %progname% is a tool for flexible generation of command line pre-processor +echo definitions arguments for a variety of diffent ccpaths in a variety of +echo compilation environments" +echo USAGE:%progname% [-h] ^<compiler-path^> [-val ^<^val1^>] [^<def2^> [-val ^<val2^>] [^<def3^> [-val ^<val3^>] ...]] +echo Where:" +echo ^<compiler-path^> +echo The full path to your ccpath +echo ^<def1^> ^<def2^> ^<def3^> ... +echo A list of pre-preprocesser variable names to be defined. +echo [-val ^<val1^>] [-val ^<val2^>] [-val ^<val3^>] ... +echo optional values to be assigned to each pre-processor variable. +echo If not supplied, the variable will be defined with no explicit value. +echo -h +echo Show this text and exit + +:End diff --git a/nuttx/tools/define.sh b/nuttx/tools/define.sh index c53cb92a8..dc982cc64 100755 --- a/nuttx/tools/define.sh +++ b/nuttx/tools/define.sh @@ -1,7 +1,7 @@ #!/bin/bash # tools/define.sh # -# Copyright (C) 2011 Gregory Nutt. All rights reserved. +# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. # Author: Gregory Nutt <gnutt@nuttx.org> # # Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ progname=$0 wintool=n -usage="USAGE: $progname [-w] [-d] [-l] [-h] <compiler-path> <def1>[=val1] [<def2>[=val2] [<def3>[=val3] ...]]" +usage="USAGE: $progname [-w] [-d] [-h] <compiler-path> <def1>[=val1] [<def2>[=val2] [<def3>[=val3] ...]]" advice="Try '$progname -h' for more information" while [ ! -z "$1" ]; do @@ -60,7 +60,7 @@ while [ ! -z "$1" ]; do echo " <compiler-path>" echo " The full path to your compiler" echo " <def1> <def2> [<def3> ..." - echo " A list of pre-preprocesser variable names to be defind." + echo " A list of pre-preprocesser variable names to be defined." echo " [=val1] [=val2] [=val3]" echo " optional values to be assigned to each pre-processor variable." echo " If not supplied, the variable will be defined with no explicit value." @@ -164,7 +164,7 @@ else fmt=std fi -# Now process each directory in the directory list +# Now process each definition in the definition list unset response for vardef in $varlist; do diff --git a/nuttx/tools/incdir.sh b/nuttx/tools/incdir.sh index eaae082b9..145bfe9bb 100755 --- a/nuttx/tools/incdir.sh +++ b/nuttx/tools/incdir.sh @@ -70,6 +70,9 @@ while [ ! -z "$1" ]; do echo " header file paths." echo " -d" echo " Enable script debug" + echo " -h" + echo " Shows this help text and exits." + exit 0 ;; * ) break; diff --git a/nuttx/tools/mkconfig.c b/nuttx/tools/mkconfig.c index 2d2fff5c5..3e55f5097 100644 --- a/nuttx/tools/mkconfig.c +++ b/nuttx/tools/mkconfig.c @@ -116,7 +116,7 @@ int main(int argc, char **argv, char **envp) printf(" * configured (at present, NXFLAT is the only supported binary.\n"); printf(" * format).\n"); printf(" */\n\n"); - printf("#if !defined(CONFIG_NXFLAT)\n"); + printf("#if !defined(CONFIG_NXFLAT) && !defined(CONFIG_ELF)\n"); printf("# undef CONFIG_BINFMT_DISABLE\n"); printf("# define CONFIG_BINFMT_DISABLE 1\n"); printf("#endif\n\n"); diff --git a/nuttx/tools/mkdeps.bat b/nuttx/tools/mkdeps.bat new file mode 100644 index 000000000..23aab0b71 --- /dev/null +++ b/nuttx/tools/mkdeps.bat @@ -0,0 +1,173 @@ +@echo off + +rem tools/mkdeps.sh +rem +rem Copyright (C) 2012 Gregory Nutt. All rights reserved. +rem Author: Gregory Nutt <gnutt@nuttx.org> +rem +rem Redistribution and use in source and binary forms, with or without +rem modification, are permitted provided that the following conditions +rem are met: +rem +rem 1. Redistributions of source code must retain the above copyright +rem notice, this list of conditions and the following disclaimer. +rem 2. Redistributions in binary form must reproduce the above copyright +rem notice, this list of conditions and the following disclaimer in +rem the documentation and/or other materials provided with the +rem distribution. +rem 3. Neither the name NuttX nor the names of its contributors may be +rem used to endorse or promote products derived from this software +rem without specific prior written permission. +rem +rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +rem FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +rem COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +rem INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +rem BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +rem OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +rem AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +rem LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +rem ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +rem POSSIBILITY OF SUCH DAMAGE. + +rem Accumulate CFLAGS up to "--" + +set cc= +set cflags= +set altpath= +set files= +set args= +set debug=n + +:Loop +if "%1"=="" goto Continue + +if "%1"=="--" ( + set cc=%cflags% + set cflags=%args% + set args= + goto NextParm +) + +if "%1"=="--dep-path" ( + if "%args%"=="" ( + set altpath=%altpath% %2 + ) else ( + set args=%args% %2 + ) + shift + goto NextParm +) + +if "%1"=="--dep-debug" ( +rem @echo on + set debug=y + goto NextParm +) + +if "%1"=="--help" goto Usage + +if "%args%"=="" ( + set args=%1 +) else ( + set args=%args% %1 +) + +:NextParm +shift +goto Loop +:Continue + +set files=%args% + +if "%debug%"=="y" ( + echo cc=%cc% + echo cflags=%cflags% + echo files=%files% + echo altpath=%altpath% +) + +rem Now check if we have everything + +if "%cc%"=="" ( + echo ERROR: No compiler specified + goto Usage +) + +if "%files%"=="" ( + rem Don't report an error -- this happens normally in some configurations + echo # No files specified for dependency generataion + goto End +) + +rem Then get the dependencies for each file + +if "%altpath%"=="" goto NoPaths +for %%G in (%files%) do ( + set fullpath= + set file=%%G + call :Checkpaths + if "%debug%"=="y" echo %file%: fullpath=%fullpath% + if "%fullpath%"=="" goto :NoFile + if "%debug%"=="y" echo CMD: %cc% -M %cflags% %fullpath% + %cc% -M %cflags% %fullpath% || goto DepFail +) +goto :End + +:NoPaths +for %%G in (%files%) do ( + set fullpath= + set file=%%G + call :CheckFile %%G +) +goto :End + +:CheckFile +if "%debug%"=="y" echo Checkfile: Checking %file% +if not exist %file% goto :NoFile +set fullpath=%file% + if "%debug%"=="y" echo CMD: %cc% -M %cflags% %fullpath% +%cc% -M %cflags% %fullpath% || goto DepFail +goto :EOF + +:CheckPaths +for %%H in (%altpath%) do ( + set tmppath=%%H\%file% + if "%debug%"=="y" echo Checkfile: Checking %tmppath% + if exist %tmppath% ( + set fullpath=%tmppath% + goto :EOF + ) +) +goto :EOF + +:NoFile +echo ERROR: No readable file at %file% +goto Usage + +:DepFail +echo ERROR: Failed to created dependencies for %file% + +:Usage +echo Usage: mkdeps [OPTIONS] CC -- CFLAGS -- file [file [file...]] +echo Where: +echo CC +echo A variable number of arguments that define how to execute the compiler +echo CFLAGS +echo The compiler compilation flags +echo file +echo One or more C files whose dependencies will be checked. Each file is expected +echo to reside in the current directory unless --dep-path is provided on the command line +echo And [OPTIONS] include: +echo --dep-debug +echo Enable script debug +echo --dep-path ^<path^> +echo Do not look in the current directory for the file. Instead, look in <path> to see +echo if the file resides there. --dep-path may be used multiple times to specify +echo multiple alternative location +echo --help +echo Shows this message and exits + +:End diff --git a/nuttx/tools/mkdeps.c b/nuttx/tools/mkdeps.c new file mode 100644 index 000000000..64d81cbd7 --- /dev/null +++ b/nuttx/tools/mkdeps.c @@ -0,0 +1,721 @@ +/**************************************************************************** + * tools/mkdeps.c + * + * Copyright (C) 2012 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <sys/stat.h> + +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> +#include <ctype.h> +#include <errno.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define MAX_BUFFER (4096) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +enum slashmode_e +{ + MODE_FSLASH = 0, + MODE_BSLASH = 1, + MODE_DBLBACK = 2 +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static char *g_cc = NULL; +static char *g_cflags = NULL; +static char *g_files = NULL; +static char *g_altpath = NULL; +static int g_debug = 0; +static bool g_winnative = false; +#ifdef HAVE_WINPATH +static bool g_winpath = false; +static char *g_topdir = NULL; +#endif + +static char g_command[MAX_BUFFER]; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + + /* MinGW does not seem to provide strtok_r */ + +#ifndef HAVE_STRTOK_R +static char *MY_strtok_r(char *str, const char *delim, char **saveptr) +{ + char *pbegin; + char *pend = NULL; + + /* Decide if we are starting a new string or continuing from + * the point we left off. + */ + + if (str) + { + pbegin = str; + } + else if (saveptr && *saveptr) + { + pbegin = *saveptr; + } + else + { + return NULL; + } + + /* Find the beginning of the next token */ + + for (; + *pbegin && strchr(delim, *pbegin) != NULL; + pbegin++); + + /* If we are at the end of the string with nothing + * but delimiters found, then return NULL. + */ + + if (!*pbegin) + { + return NULL; + } + + /* Find the end of the token */ + + for (pend = pbegin + 1; + *pend && strchr(delim, *pend) == NULL; + pend++); + + /* pend either points to the end of the string or to + * the first delimiter after the string. + */ + + if (*pend) + { + /* Turn the delimiter into a null terminator */ + + *pend++ = '\0'; + } + + /* Save the pointer where we left off and return the + * beginning of the token. + */ + + if (saveptr) + { + *saveptr = pend; + } + return pbegin; +} + +#define strtok_r MY_strtok_r +#endif + +static void append(char **base, char *str) +{ + char *oldbase; + char *newbase; + int alloclen; + + oldbase = *base; + if (!oldbase) + { + newbase = strdup(str); + if (!newbase) + { + fprintf(stderr, "ERROR: Failed to strdup %s\n", str); + exit(EXIT_FAILURE); + } + } + else + { + alloclen = strlen(oldbase) + strlen(str) + 2; + newbase = (char *)malloc(alloclen); + if (!newbase) + { + fprintf(stderr, "ERROR: Failed to allocate %d bytes\n", alloclen); + exit(EXIT_FAILURE); + } + + snprintf(newbase, alloclen, "%s %s\n", oldbase, str); + free(oldbase); + } + + *base = newbase; +} + +static void show_usage(const char *progname, const char *msg, int exitcode) +{ + if (msg) + { + fprintf(stderr, "\n"); + fprintf(stderr, "%s:\n", msg); + } + + fprintf(stderr, "\n"); + fprintf(stderr, "%s [OPTIONS] CC -- CFLAGS -- file [file [file...]]\n", + progname); + fprintf(stderr, "\n"); + fprintf(stderr, "Where:\n"); + fprintf(stderr, " CC\n"); + fprintf(stderr, " A variable number of arguments that define how to execute the compiler\n"); + fprintf(stderr, " CFLAGS\n"); + fprintf(stderr, " The compiler compilation flags\n"); + fprintf(stderr, " file\n"); + fprintf(stderr, " One or more C files whose dependencies will be checked. Each file is expected\n"); + fprintf(stderr, " to reside in the current directory unless --dep-path is provided on the command line\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "And [OPTIONS] include:\n"); + fprintf(stderr, " --dep-debug\n"); + fprintf(stderr, " Enable script debug\n"); + fprintf(stderr, " --dep-path <path>\n"); + fprintf(stderr, " Do not look in the current directory for the file. Instead, look in <path> to see\n"); + fprintf(stderr, " if the file resides there. --dep-path may be used multiple times to specify\n"); + fprintf(stderr, " multiple alternative location\n"); + fprintf(stderr, " --winnative\n"); + fprintf(stderr, " By default, a POSIX-style environment is assumed (e.g., Linux, Cygwin, etc.) This option is\n"); + fprintf(stderr, " inform the tool that is working in a pure Windows native environment.\n"); +#ifdef HAVE_WINPATH + fprintf(stderr, " --winpaths <TOPDIR>\n"); + fprintf(stderr, " This option is useful when using a Windows native toolchain in a POSIX environment (such\n"); + fprintf(stderr, " such as Cygwin). In this case, will CC generates dependency lists using Windows paths\n"); + fprintf(stderr, " (e.g., C:\\blablah\\blabla). This switch instructs the script to use 'cygpath' to convert\n"); + fprintf(stderr, " the Windows paths to Cygwin POSIXE paths.\n"); +#endif + fprintf(stderr, " --help\n"); + fprintf(stderr, " Shows this message and exits\n"); + exit(exitcode); +} + +static void parse_args(int argc, char **argv) +{ + char *args = NULL; + int argidx; + + /* Accumulate CFLAGS up to "--" */ + + for (argidx = 1; argidx < argc; argidx++) + { + if (strcmp(argv[argidx], "--") == 0) + { + g_cc = g_cflags; + g_cflags = args; + args = NULL; + } + else if (strcmp(argv[argidx], "--dep-debug") == 0) + { + g_debug++; + } + else if (strcmp(argv[argidx], "--dep-path") == 0) + { + argidx++; + if (argidx >= argc) + { + show_usage(argv[0], "ERROR: Missing argument to --dep-path", EXIT_FAILURE); + } + + if (args) + { + append(&args, argv[argidx]); + } + else + { + append(&g_altpath, argv[argidx]); + } + } + else if (strcmp(argv[argidx], "--winnative") == 0) + { + g_winnative = true; + } +#ifdef HAVE_WINPATH + else if (strcmp(argv[argidx], "--winpath") == 0) + { + g_winpath = true; + if (g_topdir) + { + free(g_topdir); + } + + argidx++; + if (argidx >= argc) + { + show_usage(argv[0], "ERROR: Missing argument to --winpath", EXIT_FAILURE); + } + + g_topdir = strdup(argv[argidx]); + } +#endif + else if (strcmp(argv[argidx], "--help") == 0) + { + show_usage(argv[0], NULL, EXIT_SUCCESS); + } + else + { + append(&args, argv[argidx]); + } + } + + /* The final thing accumulated is the list of files */ + + g_files = args; + + /* If no paths were specified, then look in the current directory only */ + + if (!g_altpath) + { + g_altpath = strdup("."); + } + + if (g_debug) + { + fprintf(stderr, "SELECTIONS\n"); + fprintf(stderr, " CC : [%s]\n", g_cc ? g_cc : "(None)"); + fprintf(stderr, " CFLAGS : [%s]\n", g_cflags ? g_cflags : "(None)"); + fprintf(stderr, " FILES : [%s]\n", g_files ? g_files : "(None)"); + fprintf(stderr, " PATHS : [%s]\n", g_altpath ? g_altpath : "(None)"); +#ifdef HAVE_WINPATH + fprintf(stderr, " Windows Paths : [%s]\n", g_winpath ? "TRUE" : "FALSE"); + if (g_winpath) + { + fprintf(stderr, " TOPDIR : [%s]\n", g_topdir); + } +#endif + fprintf(stderr, " Windows Native : [%s]\n", g_winnative ? "TRUE" : "FALSE"); + } + + /* Check for required paramters */ + + if (!g_cc) + { + show_usage(argv[0], "ERROR: No compiler specified", EXIT_FAILURE); + } + + if (!g_files) + { + /* Don't report an error -- this happens normally in some configurations */ + + printf("# No files specified for dependency generataion\n"); + exit(EXIT_SUCCESS); + } + +#ifdef HAVE_WINPATH + if (g_winnative && g_winpath) + { + show_usage(argv[0], "ERROR: Both --winnative and --winpapth makes no sense", EXIT_FAILURE); + } +#endif +} + +static void do_dependency(const char *file, char separator) +{ + static const char moption[] = " -M "; + struct stat buf; + char *alloc; + char *altpath; + char *path; + char *lasts; + int cmdlen; + int pathlen; + int filelen; + int totallen; + int ret; + + /* Copy the compiler into the command buffer */ + + cmdlen = strlen(g_cc); + if (cmdlen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Compiler string is too long [%d/%d]: %s\n", + cmdlen, MAX_BUFFER, g_cc); + exit(EXIT_FAILURE); + } + + strcpy(g_command, g_cc); + + /* Copy " -M " */ + + cmdlen += strlen(moption); + if (cmdlen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Option string is too long [%d/%d]: %s\n", + cmdlen, MAX_BUFFER, moption); + exit(EXIT_FAILURE); + } + + strcat(g_command, moption); + + /* Copy the CFLAGS into the command buffer */ + + cmdlen += strlen(g_cflags); + if (cmdlen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: CFLAG string is too long [%d/%d]: %s\n", + cmdlen, MAX_BUFFER, g_cflags); + exit(EXIT_FAILURE); + } + + strcat(g_command, g_cflags); + + /* Add a space */ + + g_command[cmdlen] = ' '; + cmdlen++; + g_command[cmdlen] = '\0'; + + /* Make a copy of g_altpath. We need to do this because at least the version + * of strtok_r above does modifie it. + */ + + alloc = strdup(g_altpath); + if (!alloc) + { + fprintf(stderr, "ERROR: Failed to strdup paths\n"); + exit(EXIT_FAILURE); + } + + altpath = alloc; + + /* Try each path. This loop will continue until each path has been tried + * (failure) or until stat() finds the file + */ + + while ((path = strtok_r(altpath, " ", &lasts)) != NULL) + { + /* Create a full path to the file */ + + pathlen = strlen(path); + totallen = cmdlen + pathlen; + if (totallen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Path is too long [%d/%d]: %s\n", + totallen, MAX_BUFFER, path); + exit(EXIT_FAILURE); + } + + strcpy(&g_command[cmdlen], path); + + if (g_command[totallen] != '\0') + { + fprintf(stderr, "ERROR: Missing NUL terminator\n"); + exit(EXIT_FAILURE); + } + + if (g_command[totallen-1] != separator) + { + g_command[totallen] = separator; + g_command[totallen+1] = '\0'; + pathlen++; + totallen++; + } + + filelen = strlen(file); + totallen += filelen; + if (totallen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Path+file is too long [%d/%d]\n", + totallen, MAX_BUFFER); + exit(EXIT_FAILURE); + } + + strcat(g_command, file); + + /* Check that a file actually exists at this path */ + + if (g_debug) + { + fprintf(stderr, "Trying path=%s file=%s fullpath=%s\n", + path, file, &g_command[cmdlen]); + } + + ret = stat(&g_command[cmdlen], &buf); + if (ret < 0) + { + altpath = NULL; + continue; + } + + if (!S_ISREG(buf.st_mode)) + { + fprintf(stderr, "ERROR: File %s exists but is not a regular file\n", + &g_command[cmdlen]); + exit(EXIT_FAILURE); + } + + /* Okay.. we have. Create the dependency. One a failure to start the + * compiler, system() will return -1; Otherwise, the returned value + * from the compiler is in WEXITSTATUS(ret). + */ + + ret = system(g_command); +#ifdef WEXITSTATUS + if (ret < 0 || WEXITSTATUS(ret) != 0) + { + if (ret < 0) + { + fprintf(stderr, "ERROR: system failed: %s\n", strerror(errno)); + } + else + { + fprintf(stderr, "ERROR: %s failed: %d\n", g_cc, WEXITSTATUS(ret)); + } + + fprintf(stderr, " command: %s\n", g_command); + exit(EXIT_FAILURE); + } +#else + if (ret < 0) + { + fprintf(stderr, "ERROR: system failed: %s\n", strerror(errno)); + fprintf(stderr, " command: %s\n", g_command); + exit(EXIT_FAILURE); + } +#endif + + /* We don't really know that the command succeeded... Let's assume that it did */ + + free(alloc); + return; + } + + printf("# ERROR: File \"%s\" not found at any location\n", file); + exit(EXIT_FAILURE); +} + +/* Convert a Cygwin path to a Windows path */ + +#ifdef HAVE_WINPATH +static char *cywin2windows(const char *str, const char *append, enum slashmode_e mode) +{ + static const char cygdrive[] = "/cydrive"; + const char *src = src; + char *dest; + char *newpath; + char *allocpath = NULL; + int srclen = strlen(str); + int alloclen = 0; + int drive = 0; + int lastchar; + + /* Skip any leading whitespace */ + + while (isspace(*str)) str++; + + /* Were we asked to append something? */ + + if (append) + { + char *tmp; + + alloclen = sizeof(str) + sizeof(append) + 1; + allocpath = (char *)malloc(alloclen); + if (!allocpath) + { + fprintf(stderr, "ERROR: Failed to allocate %d bytes\n", alloclen); + exit(EXIT_FAILURE); + } + + snprintf(allocpath, alloclen, "%s/%s", str, append); + } + + /* Looking for path of the form /cygdrive/c/bla/bla/bla */ + + if (strcasecmp(src, cygdrive) == 0) + { + int cygsize = sizeof(cygdrive); + if (src[cygsize] == '/') + { + cygsize++; + srclen -= cygsize; + src += cygsize; + + if (srclen <= 0) + { + fprintf(stderr, "ERROR: Unhandled path: \"%s\"\n", str); + exit(EXIT_FAILURE); + } + + drive = toupper(*src); + if (drive < 'A' || drive > 'Z') + { + fprintf(stderr, "ERROR: Drive charager: \"%s\"\n", str); + exit(EXIT_FAILURE); + } + + srclen--; + src++; + alloclen = 2; + } + } + + /* Determine the size of the new path */ + + alloclen += sizeof(src) + 1; + if (mode == MODE_DBLBACK) + { + const char *tmpptr; + for (tmpptr = src; *tmpptr; tmpptr++) + { + if (*tmpptr == '/') alloclen++; + } + } + + /* Allocate memory for the new path */ + + newpath = (char *)malloc(alloclen); + if (!newpath) + { + fprintf(stderr, "ERROR: Failed to allocate %d bytes\n", alloclen); + exit(EXIT_FAILURE); + } + + dest = newpath; + + /* Copy the drive character */ + + if (drive) + { + *dest++ = drive; + *dest++ = ':'; + } + + /* Copy each character from the source, making modifications for foward + * slashes as required. + */ + + lastchar = '\0'; + for (; *src; src++) + { + if (mode != MODE_FSLASH && *src == '/') + { + if (lastchar != '/') + { + *dest++ = '\\'; + if (mode == MODE_DBLBACK) + { + *dest++ = '\\'; + } + } + } + else + { + *dest++ = *src; + } + + lastchar = *src; + } + + *dest++ = '\0'; + if (allocpath) + { + free(allocpath); + } + return dest; +} +#endif + +#ifdef HAVE_WINPATH +static void do_winpath(char *file) +{ + /* The file is in POSIX format. CC expects Windows format to generate the + * dependencies, but GNU make expect the resulting dependencies to be back + * in POSIX format. What a mess! + */ + + char *path = cywin2windows(g_topdir, file, MODE_FSLASH); + + /* Then get the dependency and perform conversions on it to make it + * palatable to the Cygwin make. + */ +#warning "Missing logic" + + free(path); +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int main(int argc, char **argv, char **envp) +{ + char *lasts; + char *files; + char *file; + + /* Parse command line parameters */ + + parse_args(argc, argv); + + /* Then generate dependencies for each path on the command line. NOTE + * strtok_r will clobber the files list. But that is okay because we are + * only going to traverse it once. + */ + + files = g_files; + while ((file = strtok_r(files, " ", &lasts)) != NULL) + { + /* Check if we need to do path conversions for a Windows-natvie tool + * being using in a POSIX/Cygwin environment. + */ + +#ifdef HAVE_WINPATH + if (g_winpath) + { + do_winpath(file); + } + else +#endif + { + do_dependency(file, g_winnative ? '\\' : '/'); + } + + files = NULL; + } + + return EXIT_SUCCESS; +} diff --git a/nuttx/tools/mkdeps.sh b/nuttx/tools/mkdeps.sh index d8984e553..42397012b 100755 --- a/nuttx/tools/mkdeps.sh +++ b/nuttx/tools/mkdeps.sh @@ -2,7 +2,7 @@ ############################################################################ # tools/mkdeps.sh # -# Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. +# Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved. # Author: Gregory Nutt <gnutt@nuttx.org> # # Redistribution and use in source and binary forms, with or without diff --git a/nuttx/tools/mkromfsimg.sh b/nuttx/tools/mkromfsimg.sh index b77411980..8811f1953 100755 --- a/nuttx/tools/mkromfsimg.sh +++ b/nuttx/tools/mkromfsimg.sh @@ -233,7 +233,7 @@ mkdir -p $workingdir || { echo "Failed to created the new $workingdir"; exit 1; # Create the rcS file from the rcS.template if [ ! -r $rcstemplate ]; then - echo "$rcstemplete does not exist" + echo "$rcstemplate does not exist" rmdir $workingdir exit 1 fi diff --git a/nuttx/tools/mksymtab.c b/nuttx/tools/mksymtab.c index c5a46a92b..e401812c0 100644 --- a/nuttx/tools/mksymtab.c +++ b/nuttx/tools/mksymtab.c @@ -222,7 +222,7 @@ int main(int argc, char **argv, char **envp) fprintf(outstream, "/* %s: Auto-generated symbol table. Do not edit */\n\n", symtab); fprintf(outstream, "#include <nuttx/config.h>\n"); - fprintf(outstream, "#include <nuttx/symtab.h>\n\n"); + fprintf(outstream, "#include <nuttx/binfmt/symtab.h>\n\n"); /* Output all of the require header files */ |