From 5e9f367866ccbca32109ea4356c74539557993f5 Mon Sep 17 00:00:00 2001 From: patacongo Date: Tue, 13 Nov 2012 00:38:59 +0000 Subject: Add tools/mkdeps.bat and tools/mkdeps.c git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5342 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/tools/Makefile.host | 73 ++++-- nuttx/tools/README.txt | 20 +- nuttx/tools/mkdeps.bat | 173 +++++++++++++ nuttx/tools/mkdeps.c | 599 ++++++++++++++++++++++++++++++++++++++++++++++ nuttx/tools/mkdeps.sh | 2 +- 5 files changed, 850 insertions(+), 17 deletions(-) create mode 100644 nuttx/tools/mkdeps.bat create mode 100644 nuttx/tools/mkdeps.c (limited to 'nuttx/tools') diff --git a/nuttx/tools/Makefile.host b/nuttx/tools/Makefile.host index 66bea9937..d6a521272 100644 --- a/nuttx/tools/Makefile.host +++ b/nuttx/tools/Makefile.host @@ -33,43 +33,86 @@ # ############################################################################ -all: mkconfig mkversion mksyscall bdf-converter -default: mkconfig mksyscall +TOPDIR ?= ${shell pwd}/.. +-include $(TOPDIR)/Make.defs +include ${TOPDIR}/tools/Config.mk + +all: mkconfig$(EXEEXT) mkversion$(EXEEXT) mksyscall$(EXEEXT) bdf-converter$(EXEEXT) mksymtab$(EXEEXT) mkdeps$(EXEEXT) +default: mkconfig$(EXEEXT) mksyscall$(EXEEXT) mkdeps$(EXEEXT) + +ifdef EXEEXT +.PHONY: clean mkconfig mkversion mksyscall bdf-converter mksymtab mkdeps +else .PHONY: clean +endif -# Add CFLAGS=-g on the make command line build debug versions +# Add HOSTCFLAGS=-g on the make command line build debug versions -CFLAGS = -O2 -Wall -I. +HOSTCFLAGS ?= -O2 -Wall -I. +HOSTCC ?= gcc # mkconfig - Convert a .config file into a C config.h file -mkconfig: mkconfig.c cfgparser.c - $(Q) gcc $(CFLAGS) -o mkconfig mkconfig.c cfgparser.c +mkconfig$(EXEEXT): mkconfig.c cfgparser.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkconfig$(EXEEXT) mkconfig.c cfgparser.c + +ifdef EXEEXT +mkconfig: mkconfig$(EXEEXT) +endif # cmpconfig - Compare the contents of two configuration files cmpconfig: cmpconfig.c - $(Q) gcc $(CFLAGS) -o cmpconfig cmpconfig.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o cmpconfig cmpconfig.c + +ifdef EXEEXT +cmpconfig: cmpconfig$(EXEEXT) +endif # mkversion - Convert a .version file into a C version.h file -mkversion: mkconfig.c cfgparser.c - $(Q) gcc $(CFLAGS) -o mkversion mkversion.c cfgparser.c +mkversion$(EXEEXT): mkconfig.c cfgparser.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkversion$(EXEEXT) mkversion.c cfgparser.c + +ifdef EXEEXT +mkversion: mkversion$(EXEEXT) +endif # mksyscall - Convert a CSV file into syscall stubs and proxies -mksyscall: mksyscall.c csvparser.c - $(Q) gcc $(CFLAGS) -o mksyscall mksyscall.c csvparser.c +mksyscall$(EXEEXT): mksyscall.c csvparser.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o mksyscall$(EXEEXT) mksyscall.c csvparser.c + +ifdef EXEEXT +mksyscall: mksyscall$(EXEEXT) +endif # mksymtab - Convert a CSV file into a symbol table -mksymtab: mksymtab.c csvparser.c - $(Q) gcc $(CFLAGS) -o mksymtab mksymtab.c csvparser.c +mksymtab$(EXEEXT): mksymtab.c csvparser.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o mksymtab$(EXEEXT) mksymtab.c csvparser.c + +ifdef EXEEXT +mksymtab: mksymtab$(EXEEXT) +endif # bdf-converter - Converts a BDF font to the NuttX font format -bdf-converter: bdf-converter.c - $(Q) gcc $(CFLAGS) -o bdf-converter bdf-converter.c +bdf-converter$(EXEEXT): bdf-converter.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o bdf-converter$(EXEEXT) bdf-converter.c + +ifdef EXEEXT +bdf-converter: bdf-converter$(EXEEXT) +endif + +# Create dependencies for a list of files + +mkdeps$(EXEEXT): mkdeps.c csvparser.c + $(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkdeps$(EXEEXT) mkdeps.c + +ifdef EXEEXT +mkdeps: mkdeps$(EXEEXT) +endif clean: $(Q) rm -f *.o *.a *~ .*.swp diff --git a/nuttx/tools/README.txt b/nuttx/tools/README.txt index 5d52eaeff..28fa664bd 100644 --- a/nuttx/tools/README.txt +++ b/nuttx/tools/README.txt @@ -271,6 +271,8 @@ mkromfsimg.sh may be mounted under /etc in the NuttX pseudo file system. mkdeps.sh +mkdeps.bat +mkdeps.c mknulldeps.sh NuttX uses the GCC compilers capabilities to create Makefile dependencies. @@ -278,7 +280,8 @@ mknulldeps.sh dependencies. If a NuttX configuration uses the GCC toolchain, its Make.defs file (see configs/README.txt) will include a line like: - MKDEP = $(TOPDIR)/tools/mkdeps.sh + MKDEP = $(TOPDIR)/tools/mkdeps.sh, or + MKDEP = $(TOPDIR)/tools/mkdeps[.exe] (See NOTE below) If the NuttX configuration does not use a GCC compatible toolchain, then it cannot use the dependencies and instead it uses mknulldeps.sh: @@ -287,6 +290,21 @@ mknulldeps.sh The mknulldeps.sh is a stub script that does essentially nothing. + NOTE: The mkdep.* files are undergoing change. mkdeps.sh is a bash + script that produces dependencies well for POSIX style hosts (e..g., + Linux and Cygwin). It does not work well for mixed environments with + a Windows toolchain running in a POSIX style environemnt (hence, the + mknulldeps.sh script). + + mkdeps.bat is a simple port of the bash script to run in a Windows + command shell. However, it does not work well either because some + of the common CFLAGS use characters like '=' which are transformed + by the CMD.exe shell. + + mkdeps.c generates mkdeps (on Linux) or mkdeps.exe (on Windows). + This C version should solve all of the issues. However, this verison + is still under-development. + define.sh Different compilers have different conventions for specifying pre- 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 +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 ^ +echo Do not look in the current directory for the file. Instead, look in 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..1822dc957 --- /dev/null +++ b/nuttx/tools/mkdeps.c @@ -0,0 +1,599 @@ +/**************************************************************************** + * tools/mkdeps.c + * + * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define MAX_COMMAND 256 +#ifndef MAX_PATH +# define MAX_PATH 4096 +#endif +#define MAX_BUFFER (MAX_COMMAND + MAX_PATH + 2) + +/**************************************************************************** + * 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 + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +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(newbase) + 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 \n"); + fprintf(stderr, " Do not look in the current directory for the file. Instead, look in 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 \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 "; + char command[MAX_BUFFER]; + struct stat buf; + char *altpath; + char *path; + char *bufptr; + 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: %s\n", path); + exit(EXIT_FAILURE); + } + + strcpy(command, g_cc); + + /* Copy " -M " */ + + cmdlen += strlen(moption); + if (cmdlen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Option string is too long: %s\n", moption); + exit(EXIT_FAILURE); + } + + strcat(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: %s\n", g_cflags); + exit(EXIT_FAILURE); + } + + strcat(command, g_cflags); + + /* Add a space */ + + command[cmdlen] = ' '; + command[cmdlen+1] = '\0'; + cmdlen++; + + /* Try each path. This loop will continue until each path has been tried + * (failure) or until stat() finds the file + */ + + altpath = g_altpath; + while ((path = strtok(altpath, " ")) != 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: %s\n", path); + exit(EXIT_FAILURE); + } + + strcpy(&command[cmdlen], path); + + if (command[totallen] != '\0') + { + fprintf(stderr, "ERROR: Missing NUL terminator\n", path); + exit(EXIT_FAILURE); + } + + if (command[totallen-1] != separator) + { + command[totallen] = separator; + command[totallen+1] = '\0'; + pathlen++; + totallen++; + } + + filelen = strlen(file); + totallen += filelen; + if (totallen >= MAX_BUFFER) + { + fprintf(stderr, "ERROR: Path+file is too long\n"); + exit(EXIT_FAILURE); + } + + strcat(command, file); + + /* Check that a file actually exists at this path */ + + ret = stat(command, &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"); + exit(EXIT_FAILURE); + } + + /* Okay.. we have. Create the dependency */ + + ret = system(command); + if (ret != 0) + { + fprintf(stderr, "ERROR: ssystem(%s) failed\n"); + exit(EXIT_FAILURE); + } + + /* We don't really know that the command succeeded... Let's assume that it did */ + + return; + } + + printf("# ERROR: No readable file for \"%s\" 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 *files; + char *file; + + /* Parse command line parameters */ + + parse_args(argc, argv); + + /* Then generate dependencies for each path on the command line */ + + files = g_files; + while ((file = strtok(files, " ")) != 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 acb600150..028fd1d9f 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 # # Redistribution and use in source and binary forms, with or without -- cgit v1.2.3