blob: 5fc2971108616628d4badde9bb71f7a6796dffbe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tools.builders;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.tools.internal.*;
public class JNIBuilder extends IncrementalProjectBuilder {
MetaData metaData;
MainClass[] classes;
static class MainClass {
public String mainClassName;
public String outputDir;
public String sourceDir;
public boolean build;
@Override
public String toString() {
return mainClassName + "->" + outputDir;
}
}
public JNIBuilder() {
metaData = new MetaData("org.eclipse.swt.internal");
String mainClasses = metaData.getMetaData("swt_main_classes", null);
if (mainClasses != null) {
String[] list = mainClasses.split(",");
classes = new MainClass[list.length / 2];
for (int i = 0; i < list.length; i += 2) {
MainClass clazz = classes[i/2] = new MainClass();
clazz.mainClassName = list[i];
clazz.outputDir = list[i+1].substring(2, list[i+1].length());
clazz.sourceDir = clazz.outputDir.substring(0, clazz.outputDir.length() - "library/".length());
}
}
}
@Override
protected IProject[] build(int kind, Map<String, String> args, final IProgressMonitor monitor) throws CoreException {
IResourceDelta delta = getDelta(getProject());
if (delta == null) return null;
delta.accept(delta1 -> {
IPath ipath = delta1.getFullPath();
if (!"java".equals(ipath.getFileExtension())) return true;
String path = ipath.toPortableString();
for (int i = 0; i < classes.length; i++) {
if (classes[i].build) continue;
if (path.startsWith(classes[i].sourceDir)) {
classes[i].build = true;
}
}
return true;
});
final IWorkspaceRoot root = getProject().getWorkspace().getRoot();
for (MainClass mainClass : classes) {
if (mainClass.build) {
mainClass.build = false;
IResource library = root.findMember(mainClass.outputDir);
JNIGeneratorApp gen = new JNIGeneratorApp();
gen.setMainClassName(mainClass.mainClassName, library.getLocation().toPortableString());
gen.generate();
library.refreshLocal(IResource.DEPTH_INFINITE, null);
}
}
return null;
}
}