first attempt at virtual unix root is not going to work out due to interdependencies introduced between configuration and filesystem or vice-versa. i warned about them in a comment, and they unfortunately became true. we need to pull the virtual unix root up to a new level, hoist it into a config file that we can generate at build time and not depend on a lot of file ops.
//////////////
+// static storage for virtual unix root, if used.
+SAFE_STATIC(astring, static_root_holder, )
+
+// we don't expect it to change during runtime, right? that would be fubar.
astring application_configuration::get_virtual_unix_root()
{
#ifdef __UNIX__
return "/";
#endif
#ifdef __WIN32__
+ // see if we already cached the root. it shouldn't change during runtime.
+ if (static_root_holder().length()) {
+ return static_root_holder();
+ }
+
/*
read the path out of the config file, which should have been set during the
build process if this is really windows.
astring virtual_root = read_item(WINDOZE_VIRTUAL_ROOT_NAME());
if (!virtual_root) {
// if it has no length, we didn't get our setting! we'll limp along with a guess.
- return DEFAULT_VIRTUAL_UNIX_ROOT;
+ // also don't cache the failure value. maybe it will wake up later!
+ return DEFAULT_VIRTUAL_UNIX_ROOT();
+ } else {
+ static_root_holder() = virtual_root;
+ return static_root_holder();
}
#endif
#include <structures/string_table.h>
#include <structures/symbol_table.h>
+#include <stdio.h>
+
#undef LOG
#define LOG(to_print) printf("%s::%s: %s\n", static_class_name(), func, astring(to_print).s())
_where(where),
_add_spaces(false)
{
+ FUNCDEF("constructor");
name(ini_filename); // set name properly.
+LOG(astring("calculated ini name as: '") + _ini_name->raw() + "'");
}
ini_configurator::~ini_configurator()
#include <basis/byte_array.h>
#include <basis/functions.h>
+#include <configuration/application_configuration.h>
+/*
+ hmmm: note that we are relying on forward declared code here.
+ the canonical ordering for feisty's nucleus has the filesystem code come before
+ the configuration code, because the configuratin library uses filesystem features.
+ not sure i want to resolve this bizarritude at this time, but it points to the
+ need for a virtual interface at lower level than either filesystem or configuration
+ libraries, so we can emplace the need for the virtual unix root as a low-level
+ dependency to be implemented later.
+ */
+
#include <textual/parser_bits.h>
#include <stdio.h>
namespace filesystem {
-#if defined(__WIN32__) || defined(__VMS__)
- const char DEFAULT_SEPARATOR = '\\';
-#elif defined(__UNIX__)
+//#if defined(__WIN32__) || defined(__VMS__)
+// const char DEFAULT_SEPARATOR = '\\';
+//#elif defined(__UNIX__)
const char DEFAULT_SEPARATOR = '/';
-#else
- #error "We have no idea what the default path separator is."
-#endif
+//#else
+// #error "We have no idea what the default path separator is."
+//#endif
const char *NO_PARENT_DEFAULT = ".";
// used when no directory name can be popped off.
} else {
//LOG(astring("path didn't match so left as: ") + *this);
}
+
// now we convert msys...
if ( (length() >= 2) && (get(0) == DEFAULT_SEPARATOR)
&& textual::parser_bits::is_alpha(get(1)) ) {
}
}
- // if no specialized path specifications were seen, and we have a unix style path
- // here, then there will be trouble when we pass that to windows.
-//if first character is a slash, and second char is alphanumeric, then we check...
-//can we find a cygwin root dir stored in our config stuff?
-// maybe in the build version file? ugh, yuck.
-// what about in generated files, created at build time? --> yes, nice option.
-//
-//hmmm: we need the capability to re-create the config file that tells us
-// where cyg root is, but how can we, aside from guessing at where to find
-// cygwin (c:/cygwin c:/cygwin64 etc).
-//
-//hmmm:
+ // if we still have a unix style path here on windows, then there will be
+ // trouble when we pass that to the OS. we are not using any cygwin or
+ // other virtualization libraries directly, so we can't rely on those to
+ // fix the path. but if we built under something like cygwin, we should
+ // have stored the real dos-style location of the virtual unix root. we
+ // will use that to replace the root '/' and this should fix most of that
+ // style of path.
+ bool inject_root = false; // assume we don't need to do anything.
+
+LOG(astring("before root injection: ") + raw());
+
+ // condition here just checks if the path is only the root.
+ if ( (length() == 1) && separator(get(0)) ) { inject_root = true; }
+
+if (inject_root) LOG("decided to inject root since path is '/'.");
+
+ // condition is looking for first character being a slash, and second char as alphanumeric or dash or underscore.
+ // we will currently fail detecting freaky paths that don't start off with alphanumeric or one of that small set of special chars.
+ if ( (length() >= 2)
+ && separator(get(0))
+ && ( textual::parser_bits::is_alphanumeric(get(1)) || ('-' == get(1)) || ('_' == get(1)) ) ) {
+ inject_root = true;
+if (inject_root) LOG(astring("decided to inject root since path is compatible: ") + *this);
+ }
+
+LOG(astring("after second phase root injection: ") + *this);
+ if (inject_root) {
+ // inject the actual path to the unix root in front, if we know it.
+ // if we don't know it, then a default path that's unlikely to work is idiotically plugged in.
+ insert(0, configuration::application_configuration::get_virtual_unix_root());
+LOG(astring("turned cygdrive path string into: ") + *this);
+ }
#endif
// we don't crop the last separator if the name's too small. for msdos
echo build failure while copying paths initialization file.; \
exit 1; \
fi; \
-bash $(BUILD_SCRIPTS_PATH)/wrapdoze.sh $(CLAM_BINARIES)/value_tagger$(EXE_END) $(PRODUCTION_STORE)/codescan.ini; \
+$(CLAM_BINARIES)/value_tagger$(EXE_END) $(PRODUCTION_STORE)/codescan.ini; \
if [ $$? -ne 0 ]; then \
echo build failure during value tagging.; \
exit 1; \
fi; \
-bash $(BUILD_SCRIPTS_PATH)/wrapdoze.sh $(CLAM_BINARIES)/write_build_config$(EXE_END); \
+$(CLAM_BINARIES)/write_build_config$(EXE_END); \
if [ $$? -ne 0 ]; then \
echo build failure while writing config.; \
exit 1; \
whichable cygpath
if [ $? -eq 0 ]; then
# found cygpath, so run it now to get the dossy path of the root ('/' folder).
- found_root=$(cygpath -w -m /)
+ found_root="$(cygpath -w -m /)"
if [ $? -ne 0 ]; then
echo "Failure to find virtual Unix root folder with cygpath."
exit 1322
found_root=$(echo $found_root | tr '\\' '/')
echo "processed root is now: '$found_root'"
# edit the entry in place to correct the default path.
- sed -i -e "s/VirtualUnixRoot=.*/VirtualUnixRoot=$found_root/" "$CLAM_BINARIES/paths.ini"
+ sed -i -e "s%VirtualUnixRoot=.*%VirtualUnixRoot=$found_root%" "$CLAM_BINARIES/paths.ini"
echo "paths file now has:"
cat "$CLAM_BINARIES/paths.ini"
fi
done
fi
-# make the clam shell scripts executable.
-#hmmm: why? this should no longer be needed.
-# and even if it's needed, the perms should be stored in the repo.
-#chmod 755 "$CLAM_SCRIPTS"/*.sh
-#chmod 755 "$CLAM_SCRIPTS"/cpp/*.sh
-#chmod 755 "$CLAM_SCRIPTS"/csharp/*.sh
-#chmod 755 "$FEISTY_MEOW_SCRIPTS/generator/wrapdoze.sh"
-
# rebuild the dependency tool. needed by everything, pretty much, but
# since it's from the xfree project, it doesn't need any of our libraries.
if [ ! -f "$CLAM_BINARIES/makedep$EXE_ENDING" ]; then
+++ /dev/null
-#!/bin/bash
-
-eval "$@"
-
-exit $?
-
-
-#old below, we hope.
-
-
-source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
-
-#hmmm: make this support multiple vars as parameters.
-# replaces a specific environment variable with a dos approved equivalent.
-function dossify_environment_variable()
-{
- local var="$1"; shift
-
-#cygpath doesn't handle multiple path variables properly and otherwise operates only on one path element.
-## new_value="$(cygpath -p -d ${!var})"
-## eval "export $var=\"$new_value\""
-##echo "hey now the var is '${!var}'"
-
- old_value="${!var}"
-#echo "var is '$var' and old value is '$old_value'"
- if [[ ! "$old_value" =~ \/cygdrive\/ ]]; then
-#echo didnt have a cygdrive in it: $old_value
- return 0
-#hmmm: want this to continue in multi parm version.
- fi
-
- # replace single back-slashes with double ones.
- local new_value="$(unix_to_dos_path "${old_value}")"
-
- # remove any quote characters in the value.
- new_value="${new_value//\"/}"
-
- eval "export $var=\"$new_value\""
- echo "new value established: $var='${!var}'"
-}
-
-# for a windows build, this will replace any forward slashes
-# and other cygwin notation with the appropriate dos style paths.
-function dossify_and_run_commands()
-{
- if [ "$OS" != "Windows_NT" ]; then
- # for non windows, just run the commands straight up.
- eval "${@}"
- return $?
- fi
-
- # force all slashes to be dossy.
-# export SERIOUS_SLASH_TREATMENT=true
-
- dossify_environment_variable INCLUDE
-
- declare -a darc_commands=()
-
- for i in "$@"; do
- if [[ "$i" =~ ^-[a-zA-z][/\"].* ]]; then
- flag="${i:0:2}"
- filename="$(unix_to_dos_path ${i:2})"
-#echo "first two chars are $flag"
-#echo "last after that are $filename"
- recombined="$flag$filename"
-#echo combined flag and file is $recombined
- darc_commands+=("$recombined")
- elif [[ "$i" =~ ^-libpath:.* ]]; then
- flag="-libpath:"
- filename="$(unix_to_dos_path ${i:9})"
-#echo "libflag flag is $flag"
-#echo "name after that is $filename"
- recombined="$flag$filename"
-#echo combined flag and file is $recombined
- darc_commands+=("$recombined")
- else
- darc_commands+=($(unix_to_dos_path $i))
- fi
- done
-
- declare -a real_commands=()
- for i in "${darc_commands[@]}"; do
- real_commands+=($(echo $i | sed -e 's/\//\\/g'))
- done
-
- if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
- echo commands are now:
- for i in "${real_commands[@]}"; do
- echo -n "$i "
- done
- echo
- fi
-
-# this nonsense is only necessary because cygwin is screwing up our carefully constructed
-# command line. it can't seem to leave the dos style paths alone in some cases, and insists
-# on changing their form to use forward slashes, which breaks the windows compiler.
-# this is NOT what cygwin is supposed to be doing, according to their documentation that
-# claims all styles of paths are supported. and of course this worked fine in msys.
-
- # now actually run the chewed command.
-
-# old approach, not working since cygwin is hosing us on some paths.
-#cmd /c "${real_commands[@]}"
-
-#new approach that creates a cmd file.
- cmdfile="$(mktemp $CLAM_TMP/build_cmds.XXXXXX)"
- echo "${real_commands[@]}" >"$cmdfile"
-#echo "**** cmd file is $cmdfile"
- cmd /c $(cat "$cmdfile")
- retval=$?
- # leave the file for inspection if there was an error.
- if [ $retval -eq 0 ]; then
- \rm "$cmdfile"
- fi
- return $retval
-}
-
-dossify_and_run_commands "$@"
-