From d4d67ec4259feb79efdc39d8eb37ff783d8d29cb Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 6 Aug 2019 10:39:12 -0600 Subject: [PATCH] tools/: Update configuration-related tools for last change to boards/ directory organization. --- tools/configure.c | 155 +++++++++++++++++++++++++++++++++++++++------ tools/configure.sh | 15 +++-- tools/refresh.sh | 27 ++++++-- tools/testbuild.sh | 17 ++++- 4 files changed, 183 insertions(+), 31 deletions(-) diff --git a/tools/configure.c b/tools/configure.c index ca231bbcc0..164578754b 100644 --- a/tools/configure.c +++ b/tools/configure.c @@ -73,6 +73,39 @@ #define WINDOWS_UBUNTU 3 #define WINDOWS_MSYS 4 +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static void show_usage(const char *progname, int exitcode); +static void debug(const char *fmt, ...); +static const char *find_archname(const char *boardname); +static void parse_args(int argc, char **argv); +static bool check_directory(const char *directory); +static void verify_directory(const char *directory); +static bool verify_optiondir(const char *directory); +static bool verify_file(const char *path); +static void find_topdir(void); +static void config_search(const char *boarddir); +static void enumerate_configs(void); +static void check_configdir(void); +static void check_configured(void); +static void read_configfile(void); +static void read_versionfile(void); +static void get_verstring(void); +static bool verify_appdir(const char *appdir); +static void check_appdir(void); +static void check_configuration(void); +static void copy_file(const char *srcpath, const char *destpath, mode_t mode); +static void substitute(char *str, int ch1, int ch2); +static char *double_appdir_backslashes(char *old_appdir); +static void copy_optional(void); +static void enable_feature(const char *destconfig, const char *varname); +static void disable_feature(const char *destconfig, const char *varname); +static void set_host(const char *destconfig); +static void configure(void); +static void refresh(void); + /**************************************************************************** * Private Data ****************************************************************************/ @@ -86,7 +119,8 @@ 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_appdir = NULL; /* Relative path to the application directory */ +static const char *g_archdir = NULL; /* Name of architecture subdirectory */ static const char *g_boarddir = NULL; /* Name of board subdirectory */ static char *g_configdir = NULL; /* Name of configuration subdirectory */ @@ -112,6 +146,26 @@ static char g_buffer[BUFFER_SIZE]; /* Scratch buffer for forming full p static struct variable_s *g_configvars = NULL; static struct variable_s *g_versionvars = NULL; +/* Recognized architectures */ + +static const char *g_archnames[] = +{ + "arm", + "avr", + "hc", + "mips", + "misoc", + "or1k", + "renesas", + "risc-v", + "sim", + "x86", + "xtensa", + "z16", + "z80", + NULL +}; + /* Optional configuration files */ static const char *g_optfiles[] = @@ -194,6 +248,48 @@ static void debug(const char *fmt, ...) } } +static const char *find_archname(const char *boardname) +{ + const char **archname; + DIR *dirp; + struct dirent *dentry; + + for (archname = g_archnames; *archname != NULL; archname++) + { + /* Get the architecture directory under boards */ + + snprintf(g_buffer, BUFFER_SIZE, "boards/%s", *archname); + + /* Open the architecture directory */ + + dirp = opendir(g_buffer); + if (dirp == NULL) + { + debug("ERROR: Failed to open: %s\n", g_buffer); + continue; + } + + /* Now search for a sub-directory that has the board name */ + + while ((dentry = readdir(dirp)) != NULL) + { + /* Check if the directory entry matches the boardname. + * We really should also verify that it is a directory. + */ + + if (strcmp(boardname, dentry->d_name) == 0) + { + closedir(dirp); + return *archname; + } + } + + closedir(dirp); + } + + return NULL; +} + static void parse_args(int argc, char **argv) { char *ptr; @@ -307,9 +403,16 @@ static void parse_args(int argc, char **argv) if (optind < argc) { - fprintf(stderr, "Unexpected garbage at the end of the line\n"); + fprintf(stderr, "ERROR: Unexpected garbage at the end of the line\n"); show_usage(argv[0], EXIT_FAILURE); } + + g_archdir = find_archname(g_boarddir); + if (g_archdir == NULL) + { + fprintf(stderr, "ERROR: Architecture for board %s not found\n", + g_boarddir); + } } static bool check_directory(const char *directory) @@ -542,28 +645,42 @@ static void config_search(const char *boarddir) char *configname; char *delim; - /* Get the board directory at the beginning of the 'boarddir' path. */ + /* Get the board directory near the beginning of the 'boarddir' path: + * //configs/ + */ strncpy(g_buffer, boarddir, BUFFER_SIZE); - boardname = g_buffer; - delim = strchr(g_buffer, '/'); + delim = strchr(g_buffer, g_delim); if (delim == NULL) { - configname = ""; + debug("ERROR: delimiter not found in path: %s\n", boarddir); } else { - *delim = '\0'; - configname = delim + 1; + *delim = '\0'; + boardname = delim + 1; - delim = strrchr(configname, '/'); - if (delim != NULL) + delim = strchr(boardname, g_delim); + if (delim == NULL) { - configname = delim + 1; + debug("ERROR: delimiter not found in path: %s\n", boardname); + } + else + { + *delim = '\0'; + delim = strrchr(delim + 1, g_delim); + if (delim == NULL) + { + debug("ERROR: Configuration directory not found in path: %s\n", + boardname); + } + else + { + configname = delim + 1; + fprintf(stderr, " %s:%s\n", boardname, configname); + } } } - - fprintf(stderr, " %s:%s\n", boardname, configname); } free(child); @@ -590,11 +707,12 @@ static void check_configdir(void) g_configtop = strdup(g_buffer); /* Get and verify the path to the selected configuration: - * boards//configs/ + * boards///configs/ */ - snprintf(g_buffer, BUFFER_SIZE, "%s%cboards%c%s%cconfigs%c%s", - g_topdir, g_delim, g_delim, g_boarddir, g_delim, g_delim, g_configdir); + snprintf(g_buffer, BUFFER_SIZE, "%s%cboards%c%s%c%s%cconfigs%c%s", + g_topdir, g_delim, g_delim, g_archdir, g_delim, g_boarddir, + g_delim, g_delim, g_configdir); debug("check_configdir: Checking configpath=%s\n", g_buffer); if (!verify_optiondir(g_buffer)) @@ -610,8 +728,9 @@ static void check_configdir(void) * boards//scripts */ - snprintf(g_buffer, BUFFER_SIZE, "%s%cboards%c%s%cscripts", - g_topdir, g_delim, g_delim, g_boarddir, g_delim); + snprintf(g_buffer, BUFFER_SIZE, "%s%cboards%c%s%c%s%cscripts", + g_topdir, g_delim, g_delim, g_archdir, g_delim, + g_boarddir, g_delim); debug("check_configdir: Checking scriptspath=%s\n", g_buffer); g_scriptspath = NULL; diff --git a/tools/configure.sh b/tools/configure.sh index 06cc21d2aa..f73355196c 100755 --- a/tools/configure.sh +++ b/tools/configure.sh @@ -135,19 +135,20 @@ else boarddir=`echo ${boardconfig} | cut -d':' -f1` fi -# Try to detect architecure for convenience. +# Try to detect architecture for convenience. + archs="arm avr hc mips misoc or1k renesas risc-v sim x86 xtensa z16 z80" for arc in ${archs}; do if [ -f boards/${arc}/${boarddir}/Kconfig ]; then - archdir=${arc} - echo "Detected ${archdir} Architecture" + archdir=${arc} + echo " Detected ${archdir} Architecture" fi done configpath=${TOPDIR}/boards/${archdir}/${boarddir}/configs/${configdir} if [ ! -d "${configpath}" ]; then - # Try direct path for convenience. + # Try direct path used with custom configurations. configpath=${TOPDIR}/${boardconfig} if [ ! -d "${configpath}" ]; then @@ -156,8 +157,10 @@ if [ ! -d "${configpath}" ]; then echo "Select one of the following options for :" configlist=`find ${TOPDIR}/boards -name defconfig` for defconfig in ${configlist}; do - config=`dirname ${defconfig} | sed -e "s,${TOPDIR}/boards/,,g" | sed -e "s,/configs/,:,g"` - echo " ${config}" + config=`dirname ${defconfig} | sed -e "s,${TOPDIR}/boards/,,g"` + boardname=`echo ${config} | cut -d'/' -f2` + configname=`echo ${config} | cut -d'/' -f4` + echo " ${boardname}:${configname}" done echo "" echo "$USAGE" diff --git a/tools/refresh.sh b/tools/refresh.sh index cc65fbf518..56ad913cf5 100755 --- a/tools/refresh.sh +++ b/tools/refresh.sh @@ -90,11 +90,11 @@ done # Get the board configuration -if [ -z "$1" ]; then - echo "ERROR: No configuration provided" - echo $USAGE - echo $ADVICE - exit 1 +if [ -z "${CONFIG}" ]; then + echo "ERROR: No configuration provided" + echo $USAGE + echo $ADVICE + exit 1 fi CONFIGSUBDIR=`echo ${CONFIG} | cut -s -d':' -f2` @@ -112,6 +112,21 @@ else BOARDSUBDIR=`echo ${CONFIG} | cut -d':' -f1` fi +# Detect the architecture of this board. + +ARCHLIST="arm avr hc mips misoc or1k renesas risc-v sim x86 xtensa z16 z80" + +for arch in ${ARCHLIST}; do + if [ -f boards/${arch}/${BOARDSUBDIR}/Kconfig ]; then + ARCHSUBDIR=${arch} + fi +done + +if [ -z "${ARCHSUBDIR}" ]; then + echo "ERROR: Architecture of ${BOARDSUBDIR} not found" + exit 1 +fi + # Where are we MYNAME=`basename $0` @@ -129,7 +144,7 @@ fi WD=${PWD} -BOARDDIR=boards/$BOARDSUBDIR +BOARDDIR=boards/$ARCHSUBDIR/$BOARDSUBDIR SCRIPTSDIR=$BOARDDIR/scripts MAKEDEFS1=$SCRIPTSDIR/Make.defs diff --git a/tools/testbuild.sh b/tools/testbuild.sh index 799f84830d..0bc7c3d80b 100755 --- a/tools/testbuild.sh +++ b/tools/testbuild.sh @@ -290,7 +290,22 @@ for line in $testlist; do boarddir=`echo $config | cut -d':' -f1` fi - path=$nuttx/boards/$boarddir/configs/$configdir + # Detect the architecture of this board. + + ARCHLIST="arm avr hc mips misoc or1k renesas risc-v sim x86 xtensa z16 z80" + + for arch in ${ARCHLIST}; do + if [ -f $nuttx/boards/${arch}/${boarddir}/Kconfig ]; then + archdir=${arch} + fi + done + + if [ -z "${archdir}" ]; then + echo "ERROR: Architecture of ${boarddir} not found" + exit 1 + fi + + path=$nuttx/boards/$archdir/$boarddir/configs/$configdir if [ ! -r "$path/defconfig" ]; then echo "ERROR: no configuration found at $path" showusage