X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=src%2Forg%2Fargeo%2Fbuild%2FMake.java;h=be3764c29dda69abaab8e2868bdab0e3cce50bec;hb=6c0e011bdddc156221a8dfc3bba979446e08deea;hp=b2fb7d24807de1081cbe463baddb6adf0a2abe3f;hpb=2a08d85d02041f46defe643ba1cc6562e4e188e1;p=cc0%2Fargeo-build.git diff --git a/src/org/argeo/build/Make.java b/src/org/argeo/build/Make.java index b2fb7d2..be3764c 100644 --- a/src/org/argeo/build/Make.java +++ b/src/org/argeo/build/Make.java @@ -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,26 @@ 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 on whether legal files at the root of the sources should + * be included in the generated bundles. Should be set to true when building + * third-party software in order no to include the build harness license into + * the generated bundles. + */ + private final static String ENV_NO_SDK_LEGAL = "NO_SDK_LEGAL"; + + /** + * 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). */ @@ -70,7 +87,7 @@ public class Make { /** Base of the source code, typically the cloned git repository. */ final Path sdkSrcBase; /** - * The base of the builder, typically a submodule pointing to the public + * The base of the builder, typically a submodule pointing to the INCLUDEpublic * argeo-build directory. */ final Path argeoBuildBase; @@ -83,14 +100,19 @@ public class Make { /** The base of the a2 sources when packages separately. */ final Path a2srcOutput; - /** Whether sources should be packaged separately */ + /** Whether sources should be packaged separately. */ final boolean sourceBundles; + /** Whether common legal files should be included. */ + final boolean noSdkLegal; /** Constructor initialises the base directories. */ public Make() throws IOException { sourceBundles = Boolean.parseBoolean(System.getenv(ENV_SOURCE_BUNDLES)); if (sourceBundles) logger.log(Level.INFO, "Sources will be packaged separately"); + noSdkLegal = Boolean.parseBoolean(System.getenv(ENV_NO_SDK_LEGAL)); + if (noSdkLegal) + logger.log(Level.INFO, "SDK legal files will NOT be included"); execDirectory = Paths.get(System.getProperty("user.dir")); Path sdkMkP = findSdkMk(execDirectory); @@ -100,7 +122,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 +154,6 @@ public class Make { } /** Compile all the bundles which have been passed via the --bundle argument. */ - @SuppressWarnings("restriction") void compile(Map> options) throws IOException { List bundles = options.get("--bundles"); Objects.requireNonNull(bundles, "--bundles argument must be set"); @@ -183,8 +216,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 +289,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 +420,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 +445,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 +457,41 @@ public class Make { } } + /** List the relevant legal files to include, from the SDK source base. */ + Map listLegalFilesToInclude(Path bundleBase) throws IOException { + Map toInclude = new HashMap<>(); + if (!noSdkLegal) { + DirectoryStream 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); + } + for(Iterator> entries=toInclude.entrySet().iterator();entries.hasNext();) { + Map.Entry entry= entries.next(); + Path inBundle = bundleBase.resolve(entry.getValue().getFileName()); + // remove file if it is also defined at bundle level + // since it has already been copied + // and has priority + if(Files.exists(inBundle)) + entries.remove(); + } + return toInclude; + } + + /* + * UTILITIES + */ + /** Add sources to a jar file */ void copySourcesToJar(Path srcP, JarOutputStream srcJarOut, String prefix) throws IOException { Files.walkFileTree(srcP, new SimpleFileVisitor() { @Override