X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=src%2Forg%2Fargeo%2Fbuild%2FMake.java;h=0da82b0cab00677432c497077740dca741abee9d;hb=a035c5f7a8550c6392a1a2b0686c8d5cc9a97836;hp=d94cb02069e42d166339fb700d1a482828e80e67;hpb=e7090f399609f0c1c80729e426c2463efed7e9cc;p=cc0%2Fargeo-build.git diff --git a/src/org/argeo/build/Make.java b/src/org/argeo/build/Make.java index d94cb02..0da82b0 100644 --- a/src/org/argeo/build/Make.java +++ b/src/org/argeo/build/Make.java @@ -31,6 +31,7 @@ import java.util.concurrent.CompletableFuture; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; +import java.util.zip.Deflater; import org.eclipse.jdt.core.compiler.CompilationProgress; @@ -51,6 +52,8 @@ public class Make { /** Name of the local-specific Makefile (sdk.mk). */ final static String SDK_MK = "sdk.mk"; + /** Name of the branch definition Makefile (branch.mk). */ + final static String BRANCH_MK = "branch.mk"; /** The execution directory (${user.dir}). */ final Path execDirectory; @@ -74,19 +77,7 @@ public class Make { Path sdkMkP = findSdkMk(execDirectory); Objects.requireNonNull(sdkMkP, "No " + SDK_MK + " found under " + execDirectory); - Map context = new HashMap<>(); - List sdkMkLines = Files.readAllLines(sdkMkP); - lines: for (String line : sdkMkLines) { - StringTokenizer st = new StringTokenizer(line, " :="); - if (!st.hasMoreTokens()) - continue lines; - String key = st.nextToken(); - if (!st.hasMoreTokens()) - continue lines; - String value = st.nextToken(); - context.put(key, value); - } - + Map context = readeMakefileVariables(sdkMkP); sdkSrcBase = Paths.get(context.computeIfAbsent("SDK_SRC_BASE", (key) -> { throw new IllegalStateException(key + " not found"); })).toAbsolutePath(); @@ -140,7 +131,6 @@ public class Make { for (Path jarP : Files.newDirectoryStream(a2Dir, (p) -> p.getFileName().toString().endsWith(".jar"))) { classPath.add(jarP.toString()); - System.out.println(jarP); } } } @@ -179,7 +169,7 @@ public class Make { } /** Package the bundles. */ - void bundle(Map> options) { + void bundle(Map> options) throws IOException { // check arguments List bundles = options.get("--bundles"); Objects.requireNonNull(bundles, "--bundles argument must be set"); @@ -192,10 +182,12 @@ public class Make { throw new IllegalArgumentException("One and only one --category must be specified"); String category = categories.get(0); - List branches = options.get("--branch"); - if (branches.size() != 1) - throw new IllegalArgumentException("One and only one --branch must be specified"); - String branch = branches.get(0); + Path branchMk = sdkSrcBase.resolve(BRANCH_MK); + if (!Files.exists(branchMk)) + throw new IllegalStateException("No " + branchMk + " file available"); + Map branchVariables = readeMakefileVariables(branchMk); + + String branch = branchVariables.get("BRANCH"); long begin = System.currentTimeMillis(); // create jars in parallel @@ -241,7 +233,8 @@ public class Make { } // Normalise - properties.put("Bundle-SymbolicName", bundleSymbolicName); + if (!properties.containsKey("Bundle-SymbolicName")) + properties.put("Bundle-SymbolicName", bundleSymbolicName); // Calculate MANIFEST Path binP = compiled.resolve("bin"); @@ -284,6 +277,7 @@ public class Make { Files.createDirectories(jarP.getParent()); try (JarOutputStream jarOut = new JarOutputStream(Files.newOutputStream(jarP), manifest)) { + jarOut.setLevel(Deflater.DEFAULT_COMPRESSION); // add all classes first Files.walkFileTree(binP, new SimpleFileVisitor() { @Override @@ -319,10 +313,24 @@ public class Make { } }); + Path srcP = source.resolve("src"); + // Add all resources from src/ + Files.walkFileTree(srcP, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (file.getFileName().toString().endsWith(".java") + || file.getFileName().toString().endsWith(".class")) + return FileVisitResult.CONTINUE; + jarOut.putNextEntry(new JarEntry(srcP.relativize(file).toString())); + if (!Files.isDirectory(file)) + Files.copy(file, jarOut); + return FileVisitResult.CONTINUE; + } + }); + // add sources // TODO add effective BND, Eclipse project file, etc., in order to be able to // repackage - Path srcP = source.resolve("src"); Files.walkFileTree(srcP, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -332,6 +340,7 @@ public class Make { return FileVisitResult.CONTINUE; } }); + } } @@ -339,7 +348,7 @@ public class Make { * Recursively find the base source directory (which contains the * {@value #SDK_MK} file). */ - private Path findSdkMk(Path directory) { + Path findSdkMk(Path directory) { Path sdkMkP = directory.resolve(SDK_MK); if (Files.exists(sdkMkP)) { return sdkMkP.toAbsolutePath(); @@ -349,6 +358,28 @@ public class Make { return findSdkMk(directory.getParent()); } + /** + * Reads Makefile variable assignments of the form =, :=, or ?=, ignoring white + * spaces. To be used with very simple included Makefiles only. + */ + Map readeMakefileVariables(Path path) throws IOException { + Map context = new HashMap<>(); + List sdkMkLines = Files.readAllLines(path); + lines: for (String line : sdkMkLines) { + StringTokenizer st = new StringTokenizer(line, " :=?"); + if (!st.hasMoreTokens()) + continue lines; + String key = st.nextToken(); + if (!st.hasMoreTokens()) + continue lines; + String value = st.nextToken(); + if (st.hasMoreTokens()) // probably not a simple variable assignment + continue lines; + context.put(key, value); + } + return context; + } + /** Main entry point, interpreting actions and arguments. */ public static void main(String... args) { if (args.length == 0)