]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Make.java
Rename A2-ORIGIN to ARGEO-ORIGIN
[cc0/argeo-build.git] / src / org / argeo / build / Make.java
index b2fb7d24807de1081cbe463baddb6adf0a2abe3f..324cae8ab89725ef22d86d545b67a40a70e2dcf2 100644 (file)
@@ -3,6 +3,7 @@ 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;
@@ -12,6 +13,7 @@ import java.io.PrintWriter;
 import java.lang.System.Logger;
 import java.lang.System.Logger.Level;
 import java.lang.management.ManagementFactory;
+import java.nio.file.DirectoryStream;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -55,11 +57,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). */
@@ -100,7 +109,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");
@@ -120,7 +141,6 @@ public class Make {
        }
 
        /** Compile all the bundles which have been passed via the --bundle argument. */
-       @SuppressWarnings("restriction")
        void compile(Map<String, List<String>> options) throws IOException {
                List<String> bundles = options.get("--bundles");
                Objects.requireNonNull(bundles, "--bundles argument must be set");
@@ -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());
@@ -250,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();
 
@@ -376,6 +407,12 @@ public class Make {
                                }
                        });
 
+                       // add legal notices and licenses
+                       for (Path p : listLegalFilesToInclude(source).values()) {
+                               jarOut.putNextEntry(new JarEntry(p.getFileName().toString()));
+                               Files.copy(p, jarOut);
+                       }
+
                        // add sources
                        // TODO add effective BND, Eclipse project file, etc., in order to be able to
                        // repackage
@@ -395,6 +432,11 @@ public class Make {
 
                                try (JarOutputStream srcJarOut = new JarOutputStream(Files.newOutputStream(srcJarP), srcManifest)) {
                                        copySourcesToJar(srcP, srcJarOut, "");
+                                       // add legal notices and licenses
+                                       for (Path p : listLegalFilesToInclude(source).values()) {
+                                               jarOut.putNextEntry(new JarEntry(p.getFileName().toString()));
+                                               Files.copy(p, jarOut);
+                                       }
                                }
                        } else {
                                copySourcesToJar(srcP, jarOut, "OSGI-OPT/src/");
@@ -402,6 +444,45 @@ public class Make {
                }
        }
 
+       /** List the relevant legal files to include, from the SDK source base. */
+       Map<String, Path> listLegalFilesToInclude(Path bundleBase) throws IOException {
+               Map<String, Path> toInclude = new HashMap<>();
+               DirectoryStream<Path> sdkSrcLegal = Files.newDirectoryStream(sdkSrcBase, (p) -> {
+                       String fileName = p.getFileName().toString();
+                       return switch (fileName) {
+                       case "NOTICE":
+                       case "LICENSE":
+                       case "COPYING":
+                       case "COPYING.LESSER":
+                               yield true;
+                       default:
+                               yield false;
+                       };
+               });
+               for (Path p : sdkSrcLegal)
+                       toInclude.put(p.getFileName().toString(), p);
+               DirectoryStream<Path> bundleLegal = Files.newDirectoryStream(bundleBase, (p) -> {
+                       String fileName = p.getFileName().toString();
+                       return switch (fileName) {
+                       case "NOTICE":
+                       case "LICENSE":
+                       case "COPYING":
+                       case "COPYING.LESSER":
+                               yield true;
+                       default:
+                               yield false;
+                       };
+               });
+               // bundle can override
+               for (Path p : bundleLegal)
+                       toInclude.put(p.getFileName().toString(), p);
+               return toInclude;
+       }
+
+       /*
+        * UTILITIES
+        */
+       /** Add sources to a jar file */
        void copySourcesToJar(Path srcP, JarOutputStream srcJarOut, String prefix) throws IOException {
                Files.walkFileTree(srcP, new SimpleFileVisitor<Path>() {
                        @Override