mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-20 07:03:33 +08:00
Manually fixup merge botches via direct comparison with NuttX r5447.
This commit is contained in:
@@ -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
@@ -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}"
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user