src/main/java/de/unixwork/uwproj/AbstractOption.java

Sun, 30 Nov 2025 10:14:33 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 30 Nov 2025 10:14:33 +0100
changeset 168
4cd9757c1ad9
parent 165
f4f11f755ee7
permissions
-rw-r--r--

run compiler detection before trying to correct libdir + check TOOLCHAIN_WSIZE before setting 64bit libdir

162
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 package de.unixwork.uwproj;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 public abstract class AbstractOption {
165
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
4 protected String arg = "";
162
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 protected String desc = "";
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6
165
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
7 public AbstractOption() {
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
8 }
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
9
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
10 /**
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
11 * Indicates whether the option can be overridden by command line arguments.
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
12 *
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
13 * @return {@code true} if the option can be overridden, {@code false} otherwise
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
14 */
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
15 public final boolean isOverridable() {
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
16 return !arg.isEmpty();
162
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 /**
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * The name of the argument.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 *
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * @return the argument name
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * @see #getHelpTextArg()
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 */
165
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
25 public final String getArg() {
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
26 return arg;
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
27 }
162
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 /**
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 * The display text for the argument.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 * <p>
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 * This is not necessarily the same as {@link #getArg()},
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 * e.g. for options that have --enable-opt / --disable-opt variants.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 * Also, the help text may show a set of selecatable values or other info.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 *
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 * @return the text for the argument to include in the help text
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 * @see #getArg()
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 */
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 public abstract String getHelpTextArg();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 /**
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 * The description of the option.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 * Rarely used, better use {@link #getHelpText()} instead.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 * @return the description without any formatting
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 * @see #getHelpText()
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 */
165
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
47 public final String getDesc() {
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
48 return desc;
f4f11f755ee7 add full spectrum config var configurations
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
49 }
162
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 /**
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 * The internal variable name for the option.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 * @return the variable name where the option's value will be stored
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 */
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 public abstract String getVarName();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 /**
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 * Generates help text for the feature option.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 * <p>
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 * If no description is available via {@link #getDesc()}, only the option name is generated
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 * via {@link #getHelpTextArg()}. Otherwise, the description is added according to the following rules:
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 * <p>
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 * When the option name does not consume more than 25 characters, the description starts in the same line.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 * Otherwise, a line break is added, first. The description will be placed in a block starting from column
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 * 27 to 80 and automatically break when necessary. The description must not contain a single word
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 * that is longer than 54 characters, or it will break the layout.
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 *
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 * @return a help text for terminal output
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 */
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 public String getHelpText() {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 final var builder = new StringBuilder();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 // Get the option name and prepend it with indentation
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 final var opt = " "+getHelpTextArg();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 // Add option name
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 builder.append(opt);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 // Stop, if there is no description
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 if (desc.isBlank()) return builder.toString();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 // Prepare the description by replacing some unwanted spaces
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83 final var hdesc = desc.trim()
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 .replaceAll("\\r", "")
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 .replaceAll("\\t", " ");
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 // Declare our frame where the description shall be placed
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 final int startx = 26;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 final int endx = 80;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 // Move to startx (break, if we already past that)
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 if (opt.length() >= startx) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 builder.append("\n");
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 builder.append(" ".repeat(startx));
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 } else {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 builder.append(" ".repeat(startx-opt.length()));
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 // Append the description keeping the layout intact
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 int x = startx;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 for (int i = 0 ; i < hdesc.length() ;) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 // get the next word and see where we would end
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 int s = hdesc.indexOf(' ', i);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 if (s < 0) s = hdesc.length();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 int n = hdesc.indexOf('\n', i);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 if (n < 0) n = hdesc.length();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 s = Math.min(s, n);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 int l = s-i;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 if (x + l > endx) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 // does not fit, break into next line
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 builder.append('\n');
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 builder.append(" ".repeat(startx));
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 x = startx;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 // append the word
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 builder.append(hdesc, i, s);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 x += l;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 i += l;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 // append the next spaces
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 while (i < hdesc.length()) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 int c = hdesc.charAt(i);
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 if (c == ' ') {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123 // as long as we don't need to break, add the spaces
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 i++;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 x++;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 if (x < endx) builder.append(' ');
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 } else if (c == '\n') {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 // if user wants us to break, comply
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 i++;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 // if we have still space, just move to the end of the line
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131 if (x < endx) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 x = endx;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 } else {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 // otherwise, we need to add an extra blank line
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 builder.append('\n');
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 } else {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 // we have found the next word, so continue with the outer loop
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 break;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 // break to new line, when spaces moved us outside the frame
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143 if (x > endx) {
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 builder.append('\n');
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 builder.append(" ".repeat(startx));
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146 x = startx;
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150 return builder.toString();
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151 }
79eeb33c738f add description for options
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152 }

mercurial