diff options
Diffstat (limited to 'nuttx/tools/configure.c')
-rw-r--r-- | nuttx/tools/configure.c | 890 |
1 files changed, 0 insertions, 890 deletions
diff --git a/nuttx/tools/configure.c b/nuttx/tools/configure.c deleted file mode 100644 index 9e82c3657..000000000 --- a/nuttx/tools/configure.c +++ /dev/null @@ -1,890 +0,0 @@ -/**************************************************************************** - * tools/configure.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 <stdarg.h> -#include <unistd.h> -#include <fcntl.h> -#include <string.h> -#include <dirent.h> -#include <libgen.h> -#include <errno.h> - -#include "cfgparser.h" - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -#define BUFFER_SIZE 1024 - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -#ifdef CONFIG_WINDOWS_NATIVE -static char g_delim = '\\'; /* Delimiter to use when forming paths */ -static bool g_winpaths = true; /* True: Windows style paths */ -#else -static char g_delim = '/'; /* Delimiter to use when forming paths */ -static bool g_winpaths = false; /* False: POSIX style paths */ -#endif -static bool g_debug = false; /* Enable debug output */ - -static const char *g_appdir = NULL; /* Relative path to the applicatin directory */ -static const char *g_boarddir = NULL; /* Name of board subdirectory */ -static char *g_configdir = NULL; /* Name of configuration subdirectory */ - -static char *g_topdir = NULL; /* Full path to top-level NuttX build directory */ -static char *g_apppath = NULL; /* Full path to the applicatino directory */ -static char *g_configtop = NULL; /* Full path to the top-level configuration directory */ -static char *g_configpath = NULL; /* Full path to the configuration sub-directory */ -static char *g_verstring = "0.0"; /* Version String */ - -static char *g_srcdefconfig = NULL; /* Source defconfig file */ -static char *g_srcmakedefs = NULL; /* Source Make.defs file */ -static char *g_srcappconfig = NULL ; /* Source appconfig file (optional) */ -static char *g_srcsetenvsh = NULL; /* Source setenv.sh file (optional) */ -static char *g_srcsetenvbat = NULL; /* Source setenv.bat file (optional) */ - -static bool g_newconfig = false; /* True: New style configuration */ -static bool g_winnative = false; /* True: Windows native configuration */ -static bool g_needapppath = true; /* Need to add app path to the .config file */ - -static char g_buffer[BUFFER_SIZE]; /* Scratch buffer for forming full paths */ - -static struct variable_s *g_configvars = NULL; -static struct variable_s *g_versionvars = NULL; - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -static void show_usage(const char *progname, int exitcode) -{ - fprintf(stderr, "\nUSAGE: %s [-d] [-w] [-l] [-h] [-a <app-dir>] <board-name>[%c<config-name>]\n", progname, g_delim); - fprintf(stderr, "\nWhere:\n"); - fprintf(stderr, " <board-name>:\n"); - fprintf(stderr, " Identifies the board. This must correspond to a board directory\n"); - fprintf(stderr, " under nuttx%cconfigs%c.\n", g_delim, g_delim); - fprintf(stderr, " <config-name>:\n"); - fprintf(stderr, " Identifies the specific configuration for the selected <board-name>.\n"); - fprintf(stderr, " This must correspond to a sub-directory under the board directory at\n"); - fprintf(stderr, " under nuttx%cconfigs%c<board-name>%c.\n", g_delim, g_delim, g_delim); - fprintf(stderr, " <-d>:\n"); - fprintf(stderr, " Enables debug output\n"); - fprintf(stderr, " <-w>:\n"); -#ifdef CONFIG_WINDOWS_NATIVE - fprintf(stderr, " Informs the tool that it should use Windows style paths like C:\\Program Files\n"); - fprintf(stderr, " instead of POSIX style paths are used like /usr/local/bin. Windows\n"); - fprintf(stderr, " style paths are used by default.\n"); -#else - fprintf(stderr, " Informs the tool that it should use Windows style paths like C:\\Program Files.\n"); - fprintf(stderr, " By default, POSIX style paths like /usr/local/bin are used.\n"); -#endif - fprintf(stderr, " <-l>:\n"); -#ifdef CONFIG_WINDOWS_NATIVE - fprintf(stderr, " Informs the tool that it should use POSIX style paths like /usr/local/bin.\n"); - fprintf(stderr, " By default, Windows style paths like C:\\Program Files are used.\n"); -#else - fprintf(stderr, " Informs the tool that it should use POSIX style paths like /usr/local/bin\n"); - fprintf(stderr, " instead of Windows style paths like C:\\Program Files are used. POSIX\n"); - fprintf(stderr, " style paths are used by default.\n"); -#endif - fprintf(stderr, " -a <app-dir>:\n"); - fprintf(stderr, " Informs the configuration tool where the application build\n"); - fprintf(stderr, " directory. This is a relative path from the top-level NuttX\n"); - fprintf(stderr, " build directory. But default, this tool will look in the usual\n"); - fprintf(stderr, " places to try to locate the application directory: ..%capps or\n", g_delim); - fprintf(stderr, " ..%capps-xx.yy where xx.yy is the NuttX version number.\n", g_delim); - fprintf(stderr, " <-h>:\n"); - fprintf(stderr, " Prints this message and exits.\n"); - exit(exitcode); -} - -static void debug(const char *fmt, ...) -{ - va_list ap; - - if (g_debug) - { - va_start(ap, fmt); - (void)vprintf(fmt, ap); - va_end(ap); - } -} - -static void parse_args(int argc, char **argv) -{ - char *ptr; - int ch; - - /* Parse command line options */ - - g_debug = false; - - while ((ch = getopt(argc, argv, ":a:dwlh")) > 0) - { - switch (ch) - { - case 'a' : - g_appdir = optarg; - break; - - case 'd' : - g_debug = true; - break; - - case 'w' : - g_delim = '/'; - g_winpaths = true; - break; - - case 'l' : - g_delim = '\\'; - g_winpaths = false; - break; - - case 'h' : - show_usage(argv[0], EXIT_SUCCESS); - - case '?' : - fprintf(stderr, "ERROR: Unrecognized option: %c\n", optopt); - show_usage(argv[0], EXIT_FAILURE); - - case ':' : - fprintf(stderr, "ERROR: Missing option argument, option: %c\n", optopt); - show_usage(argv[0], EXIT_FAILURE); - - break; - fprintf(stderr, "ERROR: Unexpected option: %c\n", ch); - show_usage(argv[0], EXIT_FAILURE); - } - } - - /* There should be exactly one argument following the options */ - - if (optind >= argc) - { - fprintf(stderr, "ERROR: Missing <board-name>%c<config-name>\n", g_delim); - show_usage(argv[0], EXIT_FAILURE); - } - - /* The required option should be the board directory name and the - * configuration directory name separated by '/' or '\'. Either is - * acceptable in this context. - */ - - g_boarddir = argv[optind]; - optind++; - - ptr = strchr(g_boarddir, '/'); - if (!ptr) - { - ptr = strchr(g_boarddir, '\\'); - } - - if (!ptr) - { - fprintf(stderr, "ERROR: Invalid <board-name>%c<config-name>\n", g_delim); - show_usage(argv[0], EXIT_FAILURE); - } - - *ptr++ = '\0'; - g_configdir = ptr; - - if (optind < argc) - { - fprintf(stderr, "Unexpected garbage at the end of the line\n"); - show_usage(argv[0], EXIT_FAILURE); - } -} - -static void verify_directory(const char *directory) -{ - struct stat buf; - - if (stat(directory, &buf) < 0) - { - fprintf(stderr, "ERROR: stat of %s failed: %s\n", directory, strerror(errno)); - exit(EXIT_FAILURE); - } - - if (!S_ISDIR(buf.st_mode)) - { - fprintf(stderr, "ERROR: %s exists but is not a directory\n", directory); - exit(EXIT_FAILURE); - } -} - -static bool verify_optiondir(const char *directory) -{ - struct stat buf; - - if (stat(directory, &buf) < 0) - { - /* It may be okay if the dirctory does not exist */ - - /* It may be okay if the file does not exist */ - - int errcode = errno; - if (errcode == ENOENT) - { - debug("verify_optiondir: stat of %s failed: %s\n", directory, strerror(errno)); - return false; - } - else - { - fprintf(stderr, "ERROR: stat of %s failed: %s\n", directory, strerror(errno)); - exit(EXIT_FAILURE); - } - } - - if (!S_ISDIR(buf.st_mode)) - { - fprintf(stderr, "ERROR: %s exists but is not a directory\n", directory); - exit(EXIT_FAILURE); - } - - return true; -} - -static bool verify_file(const char *path) -{ - struct stat buf; - - if (stat(path, &buf) < 0) - { - /* It may be okay if the file does not exist */ - - int errcode = errno; - if (errcode == ENOENT) - { - debug("verify_file: stat of %s failed: %s\n", path, strerror(errno)); - return false; - } - else - { - fprintf(stderr, "ERROR: stat of %s failed: %s\n", path, strerror(errno)); - exit(EXIT_FAILURE); - } - } - - if (!S_ISREG(buf.st_mode)) - { - fprintf(stderr, "ERROR: %s exists but is not a regular file\n", path); - exit(EXIT_FAILURE); - } - - return true; -} - -static void get_topdir(void) -{ - /* Get and verify the top-level NuttX directory */ - - if (getcwd(g_buffer, BUFFER_SIZE) == NULL) - { - fprintf(stderr, "ERROR: getcwd failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - - g_topdir = strdup(dirname(g_buffer)); - debug("get_topdir: Checking topdir=%s\n", g_topdir); - verify_directory(g_topdir); -} - -static void config_search(const char *boarddir) -{ - DIR *dir; - struct dirent *dp; - struct stat buf; - char *parent; - char *child; - - /* Skip over any leading '/' or '\\'. This happens on the first second - * call because the starting boarddir is "" - */ - - if (boarddir[0] == g_delim) - { - boarddir++; - } - - /* Get the full directory path and open it */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%c%s", g_configtop, g_delim, boarddir); - dir = opendir(g_buffer); - if (!dir) - { - fprintf(stderr, "ERROR: Could not open %s: %s\n", - g_buffer, strerror(errno)); - return; - } - - /* Make a copy of the path to the directory */ - - parent = strdup(g_buffer); - - /* Vist each entry in the directory */ - - while ((dp = readdir (dir)) != NULL) - { - /* Ignore directory entries that start with '.' */ - - if (dp->d_name[0] == '.') - { - continue; - } - - /* Get a properly terminated copy of d_name (if d_name is long it may - * not include a NUL terminator.\ */ - - child = strndup(dp->d_name, NAME_MAX); - - /* Get the full path to d_name and stat the file/directory */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%c%s", parent, g_delim, child); - if (stat(g_buffer, &buf) < 0) - { - fprintf(stderr, "ERROR: stat of %s failed: %s\n", - g_buffer, strerror(errno)); - free(child); - continue; - } - - /* If it is a directory, the recurse */ - - if (S_ISDIR(buf.st_mode)) - { - char *tmppath; - snprintf(g_buffer, BUFFER_SIZE, "%s%c%s", boarddir, g_delim, child); - tmppath = strdup(g_buffer); - config_search(tmppath); - free(tmppath); - } - - /* If it is a regular file named 'defconfig' then we have found a - * configuration directory. We could terminate the serach in this case - * because we do not expect sub-directories within configuration - * directories. - */ - - else if (S_ISREG(buf.st_mode) && strcmp("defconfig", child) == 0) - { - fprintf(stderr, " %s\n", boarddir); - } - - free(child); - } - - free(parent); - closedir(dir); -} - -static void enumerate_configs(void) -{ - fprintf(stderr, "Options for <board-name>[%c<config-name>] include:\n\n", g_delim); - config_search(""); -} - -static void check_configdir(void) -{ - /* Get the path to the top level configuration directory */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%cconfigs", g_topdir, g_delim); - debug("check_configdir: Checking configtop=%s\n", g_buffer); - - verify_directory(g_buffer); - g_configtop = strdup(g_buffer); - - /* Get and verify the path to the selected configuration */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%cconfigs%c%s%c%s", - g_topdir, g_delim, g_delim, g_boarddir, g_delim, g_configdir); - debug("check_configdir: Checking configpath=%s\n", g_buffer); - - if (!verify_optiondir(g_buffer)) - { - fprintf(stderr, "ERROR: No configuration at %s\n", g_buffer); - enumerate_configs(); - exit(EXIT_FAILURE); - } - - g_configpath = strdup(g_buffer); -} - -static void read_configfile(void) -{ - FILE *stream; - - snprintf(g_buffer, BUFFER_SIZE, "%s%cdefconfig", g_configpath, g_delim); - stream = fopen(g_buffer, "r"); - if (!stream) - { - fprintf(stderr, "ERROR: failed to open %s for reading: %s\n", - g_buffer, strerror(errno)); - exit(EXIT_FAILURE); - } - - parse_file(stream, &g_configvars); - fclose(stream); -} - -static void read_versionfile(void) -{ - FILE *stream; - - snprintf(g_buffer, BUFFER_SIZE, "%s%c.version", g_topdir, g_delim); - stream = fopen(g_buffer, "r"); - if (!stream) - { - /* It may not be an error if there is no .version file */ - - debug("Failed to open %s for reading: %s\n", - g_buffer, strerror(errno)); - } - else - { - parse_file(stream, &g_versionvars); - fclose(stream); - } -} - -static void get_verstring(void) -{ - struct variable_s *var; - - if (g_versionvars) - { - var = find_variable("CONFIG_VERSION_STRING", g_versionvars); - if (var && var->val) - { - g_verstring = strdup(var->val); - } - } - - debug("get_verstring: Version string=%s\n", g_verstring); -} - -static bool verify_appdir(const char *appdir) -{ - /* Does this directory exist? */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%c%s", g_topdir, g_delim, appdir); - debug("verify_appdir: Checking apppath=%s\n", g_buffer); - if (verify_optiondir(g_buffer)) - { - /* Yes.. Use this application directory path */ - - g_appdir = strdup(appdir); - g_apppath = strdup(g_buffer); - return true; - } - - debug("verify_appdir: apppath=%s does not exist\n", g_buffer); - return false; -} - -static void check_appdir(void) -{ - char tmp[16]; - - /* Get and verify the full path to the application directory */ - /* Was the appdir provided on the command line? */ - - debug("check_appdir: Command line appdir=%s\n", - g_appdir ? g_appdir : "<null>"); - - if (!g_appdir) - { - /* No, was the path provided in the configuration? */ - - struct variable_s *var = find_variable("CONFIG_APP_DIR", g_configvars); - if (var) - { - debug("check_appdir: Config file appdir=%s\n", - var->val ? var->val : "<null>"); - - /* Yes.. does this directory exist? */ - - if (var->val && verify_appdir(var->val)) - { - /* We are using the CONFIG_APP_DIR setting already - * in the defconfig file. - */ - - g_needapppath = false; - return; - } - } - - /* Now try some canned locations */ - - /* Try ../apps-xx.yy where xx.yy is the version string */ - - snprintf(tmp, 16, ".%capps-%s", g_delim, g_verstring); - debug("check_appdir: Try appdir=%s\n", tmp); - if (verify_appdir(tmp)) - { - return; - } - - /* Try ../apps with no version */ - - snprintf(tmp, 16, "..%capps", g_delim); - debug("check_appdir: Try appdir=%s\n", tmp); - if (verify_appdir(tmp)) - { - return; - } - - /* Try ../apps-xx.yy where xx.yy are the NuttX version number */ - - fprintf(stderr, "ERROR: Could not find the path to the application directory\n"); - exit(EXIT_FAILURE); - } - else - { - snprintf(g_buffer, BUFFER_SIZE, "%s%c%s", g_topdir, g_delim, g_appdir); - if (!verify_appdir(g_buffer)) - { - fprintf(stderr, "ERROR: Command line path to application directory does not exist\n"); - exit(EXIT_FAILURE); - } - } -} - -static void check_configuration(void) -{ - struct variable_s *var; - - /* Check if this the new style configuration based on kconfig-fontends */ - - var = find_variable("CONFIG_NUTTX_NEWCONFIG", g_configvars); - if (var && var->val && strcmp("y", var->val) == 0) - { - debug("check_configuration: New style configuration\n"); - g_newconfig = true; - } - - /* Check if this is a Windows native configuration */ - - var = find_variable("CONFIG_WINDOWS_NATIVE", g_configvars); - if (var && var->val && strcmp("y", var->val) == 0) - { - debug("check_configuration: Windows native configuration\n"); - g_winnative = true; - } - - /* All configurations must provide a defconfig and Make.defs file */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%cdefconfig", g_configpath, g_delim); - debug("check_configuration: Checking %s\n", g_buffer); - if (!verify_file(g_buffer)) - { - fprintf(stderr, "ERROR: No configuration in %s\n", g_configpath); - fprintf(stderr, " No defconfig file found.\n"); - enumerate_configs(); - exit(EXIT_FAILURE); - } - - g_srcdefconfig = strdup(g_buffer); - - snprintf(g_buffer, BUFFER_SIZE, "%s%cMake.defs", g_configpath, g_delim); - debug("check_configuration: Checking %s\n", g_buffer); - if (!verify_file(g_buffer)) - { - fprintf(stderr, "ERROR: Configuration corrupted in %s\n", g_configpath); - fprintf(stderr, " No Make.defs file found.\n"); - enumerate_configs(); - exit(EXIT_FAILURE); - } - - g_srcmakedefs = strdup(g_buffer); - - /* Windows native configurations may provide setenv.bat; POSIX - * configurations may provide a setenv.sh. - */ - - if (g_winnative) - { - snprintf(g_buffer, BUFFER_SIZE, "%s%csetenv.bat", g_configpath, g_delim); - debug("check_configuration: Checking %s\n", g_buffer); - if (verify_file(g_buffer)) - { - g_srcsetenvbat = strdup(g_buffer); - } - } - else - { - snprintf(g_buffer, BUFFER_SIZE, "%s%csetenv.sh", g_configpath, g_delim); - debug("check_configuration: Checking %s\n", g_buffer); - if (verify_file(g_buffer)) - { - g_srcsetenvsh = strdup(g_buffer); - } - } - - /* Old style configurations MUST provide an appconfig file */ - - if (!g_newconfig) - { - snprintf(g_buffer, BUFFER_SIZE, "%s%cappconfig", g_configpath, g_delim); - debug("check_configuration: Checking %s\n", g_buffer); - if (!verify_file(g_buffer)) - { - fprintf(stderr, "ERROR: Configuration corrupted in %s\n", g_configpath); - fprintf(stderr, " Required appconfig file not found.\n"); - enumerate_configs(); - exit(EXIT_FAILURE); - } - - g_srcappconfig = strdup(g_buffer); - } -} - -static void copy_file(const char *srcpath, const char *destpath, mode_t mode) -{ - int nbytesread; - int nbyteswritten; - int rdfd; - int wrfd; - - /* Open the source file for reading */ - - rdfd = open(srcpath, O_RDONLY); - if (rdfd < 0) - { - fprintf(stderr, "ERROR: Failed to open %s for reading: %s\n", srcpath, strerror(errno)); - exit(EXIT_FAILURE); - } - - /* Now open the destination for writing*/ - - wrfd = open(destpath, O_WRONLY|O_CREAT|O_TRUNC, mode); - if (wrfd < 0) - { - fprintf(stderr, "ERROR: Failed to open %s for writing: %s\n", destpath, strerror(errno)); - exit(EXIT_FAILURE); - } - - /* Now copy the file */ - - for (;;) - { - do - { - nbytesread = read(rdfd, g_buffer, BUFFER_SIZE); - if (nbytesread == 0) - { - /* End of file */ - - close(rdfd); - close(wrfd); - return; - } - else if (nbytesread < 0) - { - /* EINTR is not an error (but will still stop the copy) */ - - fprintf(stderr, "ERROR: Read failure: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - } - while (nbytesread <= 0); - - do - { - nbyteswritten = write(wrfd, g_buffer, nbytesread); - if (nbyteswritten >= 0) - { - nbytesread -= nbyteswritten; - } - else - { - /* EINTR is not an error (but will still stop the copy) */ - - fprintf(stderr, "ERROR: Write failure: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - } - while (nbytesread > 0); - } -} - -static void substitute(char *str, int ch1, int ch2) -{ - for (; *str; str++) - { - if (*str == ch1) - { - *str = ch2; - } - } -} - -static void configure(void) -{ - char *destconfig; - - /* Copy the defconfig file as .config */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%c.config", g_topdir, g_delim); - destconfig = strdup(g_buffer); - debug("configure: Copying from %s to %s\n", g_srcdefconfig, destconfig); - copy_file(g_srcdefconfig, destconfig, 0644); - - /* Copy the Make.defs file as Make.defs */ - - snprintf(g_buffer, BUFFER_SIZE, "%s%cMake.defs", g_topdir, g_delim); - debug("configure: Copying from %s to %s\n", g_srcmakedefs, g_buffer); - copy_file(g_srcmakedefs, g_buffer, 0644); - - /* Copy the setenv.sh file if have one and need one */ - - if (g_srcsetenvsh) - { - snprintf(g_buffer, BUFFER_SIZE, "%s%csetenv.sh", g_topdir, g_delim); - debug("configure: Copying from %s to %s\n", g_srcsetenvsh, g_buffer); - copy_file(g_srcsetenvsh, g_buffer, 0755); - } - - /* Copy the setenv.bat file if have one and need one */ - - if (g_srcsetenvbat) - { - snprintf(g_buffer, BUFFER_SIZE, "%s%csetenv.bat", g_topdir, g_delim); - debug("configure: Copying from %s to %s\n", g_srcsetenvbat, g_buffer); - copy_file(g_srcsetenvbat, g_buffer, 0644); - } - - /* Copy the appconfig file to ../apps/.config if have one and need one */ - - if (g_srcappconfig) - { - snprintf(g_buffer, BUFFER_SIZE, "%s%c.config", g_apppath, g_delim); - debug("configure: Copying from %s to %s\n", g_srcappconfig, g_buffer); - copy_file(g_srcappconfig, g_buffer, 0644); - } - - /* 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 (g_needapppath) - { - FILE *stream; - char *appdir = strdup(g_appdir); - - /* One complexity is if we are using Windows paths, but the configuration - * needs POSIX paths (or vice versa). - */ - - if (g_winpaths != g_winnative) - { - /* Not the same */ - - if (g_winpaths) - { - /* Using Windows paths, but the configuration wants POSIX paths */ - - substitute(appdir, '\\', '/'); - } - else - { - /* Using POSIX paths, but the configuration wants Windows paths */ - - substitute(appdir, '/', '\\'); - } - } - - /* Open the file for appending */ - - stream = fopen(destconfig, "a"); - if (!stream) - { - fprintf(stderr, "ERROR: Failed to open %s for append mode mode: %s\n", - destconfig, strerror(errno)); - exit(EXIT_FAILURE); - } - - fprintf(stream, "\n# Application configuration\n\n"); - fprintf(stream, "CONFIG_APPS_DIR=\"%s\"\n", appdir); - fclose(stream); - free(appdir); - } - - free(destconfig); -} - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -int main(int argc, char **argv, char **envp) -{ - debug("main: Checking arguments\n"); - parse_args(argc, argv); - - debug("main: Checking Nuttx Directories\n"); - get_topdir(); - check_configdir(); - - debug("main: Reading the configuration/version files\n"); - read_configfile(); - read_versionfile(); - get_verstring(); - - debug("main: Checking Configuration Directory\n"); - check_configuration(); - - debug("main: Checking Application Directories\n"); - check_appdir(); - debug("main: Using apppath=%s\n", g_apppath ? g_apppath : "<null>"); - - debug("main: Configuring\n"); - configure(); - return EXIT_SUCCESS; -} |