]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Make.java
Argeo Build can build itself
[cc0/argeo-build.git] / src / org / argeo / build / Make.java
index 782cfed024bd0af26af1cd359018d5e41d95cc9c..78310597c15a4982f03dccbaa2b2ecf35965adb2 100644 (file)
@@ -1,7 +1,9 @@
 package org.argeo.build;
 
+import static java.lang.System.Logger.Level.DEBUG;
 import static java.lang.System.Logger.Level.ERROR;
 import static java.lang.System.Logger.Level.INFO;
+import static java.lang.System.Logger.Level.WARNING;
 
 import java.io.File;
 import java.io.IOException;
@@ -54,11 +56,18 @@ public class Make {
        private final static Logger logger = System.getLogger(Make.class.getName());
 
        /**
-        * Environment properties on whether sources should be packaged separately or
+        * Environment variable on whether sources should be packaged separately or
         * integrated in the bundles.
         */
        private final static String ENV_SOURCE_BUNDLES = "SOURCE_BUNDLES";
 
+       /**
+        * Environment variable to override the default location for the Argeo Build
+        * configuration files. Typically used if Argeo Build has been compiled and
+        * packaged separately.
+        */
+       private final static String ENV_ARGEO_BUILD_CONFIG = "ARGEO_BUILD_CONFIG";
+
        /** Name of the local-specific Makefile (sdk.mk). */
        final static String SDK_MK = "sdk.mk";
        /** Name of the branch definition Makefile (branch.mk). */
@@ -99,7 +108,19 @@ public class Make {
                sdkSrcBase = Paths.get(context.computeIfAbsent("SDK_SRC_BASE", (key) -> {
                        throw new IllegalStateException(key + " not found");
                })).toAbsolutePath();
-               argeoBuildBase = sdkSrcBase.resolve("sdk/argeo-build");
+
+               Path argeoBuildBaseT = sdkSrcBase.resolve("sdk/argeo-build");
+               if (!Files.exists(argeoBuildBaseT)) {
+                       String fromEnv = System.getenv(ENV_ARGEO_BUILD_CONFIG);
+                       if (fromEnv != null)
+                               argeoBuildBaseT = Paths.get(fromEnv);
+                       if (fromEnv == null || !Files.exists(argeoBuildBaseT)) {
+                               throw new IllegalStateException(
+                                               "Argeo Build not found. Did you initialise the git submodules or set the "
+                                                               + ENV_ARGEO_BUILD_CONFIG + " environment variable?");
+                       }
+               }
+               argeoBuildBase = argeoBuildBaseT;
 
                sdkBuildBase = Paths.get(context.computeIfAbsent("SDK_BUILD_BASE", (key) -> {
                        throw new IllegalStateException(key + " not found");
@@ -143,16 +164,15 @@ public class Make {
                        // and order by bundle name, for predictability
                        Map<String, A2Jar> a2Jars = new TreeMap<>();
 
-                       StringJoiner modulePath = new StringJoiner(File.pathSeparator);
+//                     StringJoiner modulePath = new StringJoiner(File.pathSeparator);
                        for (String a2Base : a2Bases) {
                                categories: for (String a2Category : a2Categories) {
                                        Path a2Dir = Paths.get(a2Base).resolve(a2Category);
                                        if (!Files.exists(a2Dir))
                                                continue categories;
-                                       modulePath.add(a2Dir.toString());
+//                                     modulePath.add(a2Dir.toString());
                                        for (Path jarP : Files.newDirectoryStream(a2Dir,
                                                        (p) -> p.getFileName().toString().endsWith(".jar"))) {
-                                               // classPath.add(jarP.toString());
                                                A2Jar a2Jar = new A2Jar(jarP);
                                                if (a2Jars.containsKey(a2Jar.name)) {
                                                        A2Jar current = a2Jars.get(a2Jar.name);
@@ -183,8 +203,14 @@ public class Make {
                for (String bundle : bundles) {
                        StringBuilder sb = new StringBuilder();
                        Path bundlePath = execDirectory.resolve(bundle);
-                       if (!Files.exists(bundlePath))
-                               throw new IllegalArgumentException("Bundle " + bundle + " not found in " + execDirectory);
+                       if (!Files.exists(bundlePath)) {
+                               if (bundles.size() == 1) {
+                                       logger.log(WARNING, "Bundle " + bundle + " not found in " + execDirectory
+                                                       + ", assuming this is this directory, as only one bundle was requested.");
+                                       bundlePath = execDirectory;
+                               } else
+                                       throw new IllegalArgumentException("Bundle " + bundle + " not found in " + execDirectory);
+                       }
                        sb.append(bundlePath.resolve("src"));
                        sb.append("[-d");
                        compilerArgs.add(sb.toString());
@@ -197,8 +223,11 @@ public class Make {
                if (logger.isLoggable(INFO))
                        compilerArgs.add("-time");
 
-//             for (String arg : compilerArgs)
-//                     System.out.println(arg);
+               if (logger.isLoggable(DEBUG)) {
+                       logger.log(DEBUG, "Compiler arguments:");
+                       for (String arg : compilerArgs)
+                               logger.log(DEBUG, arg);
+               }
 
                boolean success = org.eclipse.jdt.core.compiler.batch.BatchCompiler.compile(
                                compilerArgs.toArray(new String[compilerArgs.size()]), new PrintWriter(System.out),
@@ -247,12 +276,17 @@ public class Make {
                logger.log(INFO, "Packaging took " + duration + " ms");
        }
 
-       /*
-        * UTILITIES
-        */
        /** Package a single bundle. */
        void createBundle(String branch, String bundle, String category) throws IOException {
-               Path source = execDirectory.resolve(bundle);
+               final Path source;
+               if (!Files.exists(execDirectory.resolve(bundle))) {
+                       logger.log(WARNING,
+                                       "Bundle " + bundle + " not found in " + execDirectory + ", assuming this is this directory.");
+                       source = execDirectory;
+               } else {
+                       source = execDirectory.resolve(bundle);
+               }
+
                Path compiled = buildBase.resolve(bundle);
                String bundleSymbolicName = source.getFileName().toString();
 
@@ -399,6 +433,10 @@ public class Make {
                }
        }
 
+       /*
+        * UTILITIES
+        */
+       /** Add sources to a jar file */
        void copySourcesToJar(Path srcP, JarOutputStream srcJarOut, String prefix) throws IOException {
                Files.walkFileTree(srcP, new SimpleFileVisitor<Path>() {
                        @Override