Mon, 01 Dec 2025 21:27:09 +0100
resolve dependencies between standard config vars
fixes #768
--- a/src/main/java/de/unixwork/uwproj/Config.java Mon Dec 01 20:38:17 2025 +0100 +++ b/src/main/java/de/unixwork/uwproj/Config.java Mon Dec 01 21:27:09 2025 +0100 @@ -2,9 +2,7 @@ import org.w3c.dom.Element; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -12,29 +10,77 @@ private final String platform; private final String not; - private final List<ConfigVar> vars = new LinkedList<>(); + private final LinkedList<ConfigVar> vars = new LinkedList<>(); + private final List<String> standardVars = List.of( + // list of standard vars in the exact order they must appear in the file + "prefix", + "exec_prefix", + "bindir", + "sbindir", + "libdir", + "libexecdir", + "datarootdir", + "datadir", + "sharedstatedir", + "sysconfdir", + "localstatedir", + "runstatedir", + "includedir", + "infodir", + "mandir", + "localedir" + ); + private final Map<String, ConfigVar> standardVarDefs = new HashMap<>(); + public Config(Element element) { platform = element.getAttribute("platform"); not = element.getAttribute("not"); - Util.getChildElements(element).forEach(elm -> - vars.add(new ConfigVar(elm)) - ); - - // special case: prefix is requested, but exec_prefix is not - // insert exec_prefix default directly after the prefix - if (vars.stream().noneMatch(v -> v.getVarName().equals("exec_prefix"))) { - for (var iter = vars.listIterator(); iter.hasNext();) { - final var v = iter.next(); - if (v.getVarName().equals("prefix")) { - iter.add(new ConfigVar("exec_prefix")); - break; - } + Util.getChildElements(element).forEach(elm -> { + final var cv = new ConfigVar(elm); + if (isStandardVar(cv)) { + addStandardVar(cv); + } else { + vars.add(cv); } + }); + // prepend the required standard vars to the list + final var iter = standardVars.listIterator(standardVars.size()); + while(iter.hasPrevious()) { + Optional.ofNullable(standardVarDefs.get(iter.previous())) + .ifPresent(vars::addFirst); } } + + private boolean isStandardVar(ConfigVar var) { + return standardVars.contains(var.getVarName()); + } + private void addDependentStandardVar(String value) { + if (!standardVarDefs.containsKey(value)) { + addStandardVar(new ConfigVar(value)); + } + } + + private void addStandardVar(ConfigVar var) { + // add dependent variables + switch(var.getVarName()) { + case "exec_prefix", "includedir", + "runstatedir", "localstatedir", + "sysconfdir", "sharedstatedir", + "datarootdir" + -> addDependentStandardVar("prefix"); + case "bindir", "libexecdir", + "libdir", "sbindir" + -> addDependentStandardVar("exec_prefix"); + case "datadir", "localedir", + "mandir", "infodir" + -> addDependentStandardVar("datarootdir"); + } + // add requested standard var + standardVarDefs.put(var.getVarName(), var); + } public String getPlatform() { return platform;
--- a/src/main/java/de/unixwork/uwproj/ConfigVar.java Mon Dec 01 20:38:17 2025 +0100 +++ b/src/main/java/de/unixwork/uwproj/ConfigVar.java Mon Dec 01 21:27:09 2025 +0100 @@ -3,15 +3,17 @@ import org.w3c.dom.Element; public final class ConfigVar extends AbstractOption { + private static final String DEFAULT_PREFIX = "/usr"; + private final String varName; private final String value; private final boolean exec; public ConfigVar(String varName) { this.varName = varName; - desc = getDefaultHelpText(varName); arg = varName.toLowerCase().replace('_', '-'); - value = ""; + value = varName.equals("prefix") ? DEFAULT_PREFIX : ""; + desc = getDefaultHelpText(varName).replace("%default", value); exec = false; } @@ -35,7 +37,7 @@ value = Util.getContent(e); } else if (arg.equals("prefix")) { // special treatment for prefix - value = "/usr"; + value = DEFAULT_PREFIX; } else { value = ""; }
--- a/test/configure2 Mon Dec 01 20:38:17 2025 +0100 +++ b/test/configure2 Mon Dec 01 21:27:09 2025 +0100 @@ -118,6 +118,12 @@ [PREFIX/share] __EOF__ fi + if [ -z "$datadir__described__" ] ; then + datadir__described__=1 + cat << '__EOF__' + --datadir read-only architecture-independent data [DATAROOTDIR] +__EOF__ + fi if [ -z "$localstatedir__described__" ] ; then localstatedir__described__=1 cat << '__EOF__' @@ -197,6 +203,11 @@ datarootdir__initialized__=1 datarootdir='' fi + if [ -z "$datadir__initialized__" ] ; then + has_config_vars__=1 + datadir__initialized__=1 + datadir='' + fi if [ -z "$localstatedir__initialized__" ] ; then has_config_vars__=1 localstatedir__initialized__=1 @@ -233,6 +244,7 @@ "--exec-prefix="*) exec_prefix=${ARG#--exec-prefix=} ;; "--libdir="*) libdir=${ARG#--libdir=} ;; "--datarootdir="*) datarootdir=${ARG#--datarootdir=} ;; + "--datadir="*) datadir=${ARG#--datadir=} ;; "--localstatedir="*) localstatedir=${ARG#--localstatedir=} ;; "--libdatadir="*) libdatadir=${ARG#--libdatadir=} ;; "--toolkit-home="*) TOOLKIT_HOME=${ARG#--toolkit-home=} ;; @@ -351,6 +363,7 @@ echo "exec_prefix=$exec_prefix" >> "$TEMP_DIR/vars.mk" echo "libdir=$libdir" >> "$TEMP_DIR/vars.mk" echo "datarootdir=$datarootdir" >> "$TEMP_DIR/vars.mk" + echo "datadir=$datadir" >> "$TEMP_DIR/vars.mk" echo "localstatedir=$localstatedir" >> "$TEMP_DIR/vars.mk" echo "libdatadir=$libdatadir" >> "$TEMP_DIR/vars.mk" echo "SRCDIR=$SRCDIR" >> "$TEMP_DIR/vars.mk" @@ -945,6 +958,10 @@ printf ' %-16s' 'datarootdir:' echo "$datarootdir" fi + if [ -n "$datadir__initialized__" ]; then + printf ' %-16s' 'datadir:' + echo "$datadir" + fi if [ -n "$localstatedir__initialized__" ]; then printf ' %-16s' 'localstatedir:' echo "$localstatedir"
--- a/test/make/project.xml Mon Dec 01 20:38:17 2025 +0100 +++ b/test/make/project.xml Mon Dec 01 21:27:09 2025 +0100 @@ -2,7 +2,6 @@ <project version="0.4" xmlns="http://unixwork.de/uwproj"> <!-- makefile config --> <config> - <prefix/> <libdir/> <var name="HOST" exec="true">uname -n</var> </config>
--- a/test/make/project2.xml Mon Dec 01 20:38:17 2025 +0100 +++ b/test/make/project2.xml Mon Dec 01 21:27:09 2025 +0100 @@ -3,7 +3,7 @@ <config> <prefix>`pwd`/work</prefix> <libdir/> - <datarootdir/> + <datadir/> <localstatedir>/var</localstatedir> <var name="libdatadir" option-help="miscellaneous files for libraries [PREFIX/libdata]">$prefix/libdata</var> <var name="SRCDIR" exec="true">pwd</var>