Introduce subcommands to build script

This commit is contained in:
naofal.helal
2025-03-25 12:45:21 +03:00
parent 9f2e6d74e9
commit ec4097c727

View File

@@ -1,8 +1,8 @@
import static nobuild.NoBuild.*;
import java.nio.file.Paths;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.Optional;
public class Build {
static final String program = "jtags";
@@ -10,32 +10,69 @@ public class Build {
public static void main(String[] args) {
rebuildSelf(Build.class, args);
var arguments = new ArrayDeque<>(Arrays.asList(args));
if (arguments.size() == 0) {
printUsage();
System.exit(1);
}
String mainClass = "xyz.naofal.jtags.Jtags";
String[] sourcePaths = glob("src/main/java/**.java");
String[] classPaths = glob("third-party/jars/*.jar");
String[] classPaths = {};
var subcommand = arguments.pop();
switch (subcommand) {
case "build":
buildJtags(mainClass, sourcePaths, classPaths);
break;
case "run":
buildJtags(mainClass, sourcePaths, classPaths);
runJava(classPaths, mainClass, arguments.toArray(String[]::new));
break;
case "package":
buildJtags(mainClass, sourcePaths, classPaths);
packageJar(Optional.ofNullable(arguments.poll()));
break;
default:
logger.severe("Unknown subcommand: " + subcommand);
printUsage();
System.exit(1);
break;
}
}
static void buildJtags(String mainClass, String[] sourcePaths, String[] classPaths) {
if (classNeedsRebuild(mainClass, sourcePaths)) {
ensureDependencies();
logger.info("Compiling %s...".formatted(program));
compileJava(classPaths, sourcePaths);
}
var argumentPartitions =
Arrays.stream(args).collect(Collectors.partitioningBy(it -> it.startsWith("-D")));
String[] javaArguments = argumentPartitions.get(true).toArray(String[]::new);
String[] programArguments = argumentPartitions.get(false).toArray(String[]::new);
runJava(classPaths, javaArguments, mainClass, programArguments);
}
private static void ensureDependencies() {
Dependency[] dependencies = {
new Dependency("com.h2database", "h2", "2.3.232"),
};
static void packageJar(Optional<String> jarfile) {
command(
"jar",
"cfe",
jarfile.orElse("Jtags.jar"),
"xyz.naofal.jtags.Jtags",
"-C",
buildClassPath,
".");
}
if (!downloadDependencies(mavenCentral, Paths.get("third-party", "jars"), dependencies)) {
logger.severe("Could not download all dependencies");
System.exit(1);
}
static void printUsage() {
System.err.println(
"""
Usage: java Build <subcommand> [args...]
Subcommands:
build Build %1$s
run [args...] Run %1$s with arguments
package Package %1$s to a JAR file
[file] Output JAR filename [Default: Jtags.jar]
"""
.formatted(program));
}
}