Manually fixup merge botches via direct comparison with NuttX r5447.

This commit is contained in:
px4dev
2013-01-11 02:14:43 -08:00
parent 48c5d63319
commit f127495caa
428 changed files with 13932 additions and 3888 deletions
+2 -2
View File
@@ -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
+62 -30
View File
@@ -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}"
+178
View File
@@ -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
+4 -4
View File
@@ -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
+3
View File
@@ -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;
+1 -1
View File
@@ -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");
+173
View File
@@ -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
+721
View File
@@ -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;
}
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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 */