resolve dependencies between standard config vars default tip

Mon, 01 Dec 2025 21:27:09 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 01 Dec 2025 21:27:09 +0100
changeset 177
8872934e5fb2
parent 176
f0f3d19a0aa1

resolve dependencies between standard config vars

fixes #768

src/main/java/de/unixwork/uwproj/Config.java file | annotate | diff | comparison | revisions
src/main/java/de/unixwork/uwproj/ConfigVar.java file | annotate | diff | comparison | revisions
test/configure2 file | annotate | diff | comparison | revisions
test/make/project.xml file | annotate | diff | comparison | revisions
test/make/project2.xml file | annotate | diff | comparison | revisions
--- 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>

mercurial