/** * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.gluegen; import com.jogamp.gluegen.JavaEmitter; import com.jogamp.gluegen.GlueGen; import java.io.File; import java.net.URISyntaxException; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; import static java.lang.System.*; /** * @author Michael Bien */ public final class BuildUtil { private static final Project project; public static final String gluegenRoot; public static final String path; public static final String testOutput; public static final String rootrel_build; static { out.println(" - - - System info - - - "); out.println("OS: " + System.getProperty("os.name")); out.println("VM: " + System.getProperty("java.vm.name")); String rootrel_build_tmp = System.getProperty("rootrel.build"); if(null==rootrel_build_tmp || rootrel_build_tmp.length()==0) { rootrel_build_tmp = "build" ; } rootrel_build = rootrel_build_tmp; out.println("rootrel.build: " + rootrel_build); // setup paths try { final File executionRoot = new File(BuildUtil.class.getProtectionDomain().getCodeSource().getLocation().toURI()); out.println("execution root: " + executionRoot); gluegenRoot = executionRoot.getParentFile().getParentFile().getParentFile().getParentFile().toString(); out.println("gluegen project root: " + gluegenRoot); } catch (final URISyntaxException ex) { throw new RuntimeException("can not determine gluegen root", ex); } path = gluegenRoot + "/test/junit/com/jogamp/gluegen"; testOutput = gluegenRoot + "/" + rootrel_build + "/test"; out.println("path: "+path); out.println("testOutput: "+testOutput); out.println(" - - - - - - - - - - - - "); cleanGeneratedFiles(); //setup ant build file project = new Project(); project.setProperty("rootrel.build", rootrel_build); passSystemProperty(project, "gluegen-cpptasks.file"); passSystemProperty(project, "os.arch"); final DefaultLogger logger = new DefaultLogger(); logger.setErrorPrintStream(out); logger.setOutputPrintStream(out); logger.setMessageOutputLevel(Project.MSG_WARN); project.addBuildListener(logger); project.init(); final File buildFile = new File(path, "build.xml"); if(!buildFile.exists()) { throw new RuntimeException("buildfile "+buildFile+" does not exist"); } ProjectHelper.configureProject(project, buildFile); } public static Project passSystemProperty(final Project p, final String name) { final String tmp = System.getProperty(name); if(null!=tmp && tmp.length()>0) { p.setProperty(name, tmp); } return p; } public static void cleanGeneratedFiles() { out.println("cleaning generated files"); deleteDirectory(new File(testOutput+"/gensrc")); out.println("done"); } /** * fails if ant script fails (which is a good thing). * executeTarget throws RuntimeException on failure */ public static void compileJava() { out.println("compiling java files"); project.executeTarget("compile.java"); out.println("done"); } /** * fails if ant script fails (which is a good thing) * executeTarget throws RuntimeException on failure */ public static void compileNatives() { out.println("compiling native files"); project.executeTarget("compile.native"); out.println("done"); } public static void generate(final String bindingName) { generate(bindingName, JavaEmitter.class.getName()); // generate(bindingName, DebugEmitter.class.getName()); } public static void generate(final String bindingName, final String emitter) { generate(bindingName, bindingName, emitter); } public static void generate(final String bindingName, final String header, final String emitter) { out.println("generate binding to '" + bindingName+"' using '"+emitter+"'"); GlueGen.main( "-I"+path, "-O"+testOutput+"/gensrc", "-E"+emitter, "-C"+path+"/"+bindingName+".cfg", path+"/"+header+".h" ); out.println("done"); } public static void deleteDirectory(final File path) { if(path.exists()) { final File[] files = path.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { deleteDirectory(files[i]); } else { files[i].delete(); } } path.delete(); } } }