*/
private final static String ENV_ARGEO_BUILD_CONFIG = "ARGEO_BUILD_CONFIG";
+ /** Make file variable (in {@link #SDK_MK}) with a path to the sources base. */
+ private final static String VAR_SDK_SRC_BASE = "SDK_SRC_BASE";
+
+ /**
+ * Make file variable (in {@link #SDK_MK}) with a path to the build output base.
+ */
+ private final static String VAR_SDK_BUILD_BASE = "SDK_BUILD_BASE";
+ /**
+ * Make file variable (in {@link #BRANCH_MK}) with the branch.
+ */
+ private final static String VAR_BRANCH = "BRANCH";
+
/** Name of the local-specific Makefile (sdk.mk). */
final static String SDK_MK = "sdk.mk";
/** Name of the branch definition Makefile (branch.mk). */
final Path buildBase;
/** The base of the a2 output for all layers. */
final Path a2Output;
- /** The base of the a2 sources when packages separately. */
+ /** The base of the a2 sources when packaged separately. */
final Path a2srcOutput;
/** Whether sources should be packaged separately. */
Objects.requireNonNull(sdkMkP, "No " + SDK_MK + " found under " + execDirectory);
Map<String, String> context = readMakefileVariables(sdkMkP);
- sdkSrcBase = Paths.get(context.computeIfAbsent("SDK_SRC_BASE", (key) -> {
+ sdkSrcBase = Paths.get(context.computeIfAbsent(VAR_SDK_SRC_BASE, (key) -> {
throw new IllegalStateException(key + " not found");
})).toAbsolutePath();
}
argeoBuildBase = argeoBuildBaseT;
- sdkBuildBase = Paths.get(context.computeIfAbsent("SDK_BUILD_BASE", (key) -> {
+ sdkBuildBase = Paths.get(context.computeIfAbsent(VAR_SDK_BUILD_BASE, (key) -> {
throw new IllegalStateException(key + " not found");
})).toAbsolutePath();
buildBase = sdkBuildBase.resolve(sdkSrcBase.getFileName());
return;
List<String> categories = options.get("--category");
- Objects.requireNonNull(bundles, "--category argument must be set");
+ Objects.requireNonNull(categories, "--category argument must be set");
if (categories.size() != 1)
throw new IllegalArgumentException("One and only one --category must be specified");
String category = categories.get(0);
Path branchMk = sdkSrcBase.resolve(BRANCH_MK);
if (Files.exists(branchMk)) {
Map<String, String> branchVariables = readMakefileVariables(branchMk);
- branch = branchVariables.get("BRANCH");
+ branch = branchVariables.get(VAR_BRANCH);
} else {
branch = null;
}
logger.log(INFO, "Packaging took " + duration + " ms");
}
+ /** Install the bundles. */
+ void install(Map<String, List<String>> options) throws IOException {
+ // check arguments
+ List<String> bundles = options.get("--bundles");
+ Objects.requireNonNull(bundles, "--bundles argument must be set");
+ if (bundles.isEmpty())
+ return;
+
+ List<String> categories = options.get("--category");
+ Objects.requireNonNull(categories, "--category argument must be set");
+ if (categories.size() != 1)
+ throw new IllegalArgumentException("One and only one --category must be specified");
+ String category = categories.get(0);
+
+ List<String> targetDirs = options.get("--target");
+ Objects.requireNonNull(targetDirs, "--target argument must be set");
+ if (targetDirs.size() != 1)
+ throw new IllegalArgumentException("One and only one --target must be specified");
+ Path targetA2 = Paths.get(targetDirs.get(0));
+ logger.log(INFO, "Installing to " + targetA2);
+
+ final String branch;
+ Path branchMk = sdkSrcBase.resolve(BRANCH_MK);
+ if (Files.exists(branchMk)) {
+ Map<String, String> branchVariables = readMakefileVariables(branchMk);
+ branch = branchVariables.get(VAR_BRANCH);
+ } else {
+ throw new IllegalArgumentException(VAR_BRANCH + " variable must be set.");
+ }
+
+ Properties properties = new Properties();
+ Path branchBnd = sdkSrcBase.resolve("sdk/branches/" + branch + ".bnd");
+ if (Files.exists(branchBnd))
+ try (InputStream in = Files.newInputStream(branchBnd)) {
+ properties.load(in);
+ }
+ String major = properties.getProperty("major");
+ Objects.requireNonNull(major, "'major' must be set");
+ String minor = properties.getProperty("minor");
+ Objects.requireNonNull(minor, "'minor' must be set");
+
+ for (String bundle : bundles) {
+ Path bundlePath = Paths.get(bundle);
+ Path bundleParent = bundlePath.getParent();
+ Path a2JarDirectory = bundleParent != null ? a2Output.resolve(bundleParent).resolve(category)
+ : a2Output.resolve(category);
+ Path jarP = a2JarDirectory.resolve(bundlePath.getFileName() + "." + major + "." + minor + ".jar");
+
+ Path targetJarP = targetA2.resolve(a2JarDirectory.relativize(jarP));
+ Files.createDirectories(targetJarP.getParent());
+ Files.copy(jarP, targetJarP);
+ }
+ }
+
/** Package a single bundle. */
void createBundle(String branch, String bundle, String category) throws IOException {
final Path source;
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+ // skip output directory if it happens to be within the sources
+ if (Files.isSameFile(sdkBuildBase, dir))
+ return FileVisitResult.SKIP_SUBTREE;
+
+ // skip excluded patterns
Path relativeP = source.relativize(dir);
for (PathMatcher exclude : excludes)
if (exclude.matches(relativeP))
case "compile" -> argeoMake.compile(options);
case "bundle" -> argeoMake.bundle(options);
case "all" -> argeoMake.all(options);
+ case "install" -> argeoMake.install(options);
default -> throw new IllegalArgumentException("Unkown action: " + action);
}