/*
* #%L
* Native ARchive plugin for Maven
* %%
* Copyright (C) 2002 - 2014 NAR Maven Plugin developers.
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.github.maven_nar;
import java.io.File;
import java.io.IOException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.codehaus.plexus.util.FileUtils;
/**
* Copies the GNU style source files to a target area, autogens and configures
* them.
*
* @author Mark Donszelmann
*/
@Mojo(name = "nar-gnu-configure", requiresProject = true, defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class NarGnuConfigureMojo extends AbstractGnuMojo {
private static final String AUTOGEN = "autogen.sh";
private static final String BUILDCONF = "buildconf";
private static final String CONFIGURE = "configure";
// JDK 1.4 compatibility
private static String arraysToString(final Object[] a) {
if (a == null) {
return "null";
}
final int iMax = a.length - 1;
if (iMax == -1) {
return "[]";
}
final StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0;; i++) {
b.append(String.valueOf(a[i]));
if (i == iMax) {
return b.append(']').toString();
}
b.append(", ");
}
}
/**
* If true, we run <code>./configure</code> in the source directory instead of
* copying the
* source code to the <code>target/</code> directory first (this saves disk
* space but
* violates Maven's paradigm of keeping generated files inside the
* <code>target/</code> directory structure.
*/
@Parameter(property = "nar.gnu.configure.in-place")
private boolean gnuConfigureInPlace;
/**
* Skip running of autogen.sh (aka buildconf).
*/
@Parameter(property = "nar.gnu.autogen.skip")
private boolean gnuAutogenSkip;
/**
* Skip running of configure and therefore also autogen.sh
*/
@Parameter(property = "nar.gnu.configure.skip")
private boolean gnuConfigureSkip;
/**
* Arguments to pass to GNU configure.
*/
@Parameter(property = "nar.gnu.configure.args", defaultValue = "")
private String gnuConfigureArgs;
/**
* Arguments to pass to GNU buildconf.
*/
@Parameter(property = "nar.gnu.buildconf.args", defaultValue = "")
private String gnuBuildconfArgs;
public NarGnuConfigureMojo() {
}
@Override
public final void narExecute() throws MojoExecutionException, MojoFailureException {
if (!useGnu()) {
return;
}
final File sourceDir = getGnuSourceDirectory();
if (sourceDir.exists()) {
File targetDir;
if (!this.gnuConfigureInPlace) {
targetDir = getGnuAOLSourceDirectory();
getLog().info("Copying GNU sources");
try {
FileUtils.mkdir(targetDir.getPath());
NarUtil.copyDirectoryStructure(sourceDir, targetDir, null, null);
} catch (final IOException e) {
throw new MojoExecutionException("Failed to copy GNU sources", e);
}
if (!this.gnuConfigureSkip && !this.gnuAutogenSkip) {
final File autogen = new File(targetDir, AUTOGEN);
final File buildconf = new File(targetDir, BUILDCONF);
if (autogen.exists()) {
getLog().info("Running GNU " + AUTOGEN);
runAutogen(autogen, targetDir, null);
} else if (buildconf.exists()) {
getLog().info("Running GNU " + BUILDCONF);
String gnuBuildconfArgsArray[] = null;
if (this.gnuBuildconfArgs != null) {
gnuBuildconfArgsArray = this.gnuBuildconfArgs.split("\\s");
}
runAutogen(buildconf, targetDir, gnuBuildconfArgsArray);
}
}
} else {
targetDir = sourceDir;
}
final File configure = new File(targetDir, CONFIGURE);
if (!this.gnuConfigureSkip && configure.exists()) {
getLog().info("Running GNU " + CONFIGURE);
NarUtil.makeExecutable(configure, getLog());
String[] args = null;
// create the array to hold constant and additional args
if (this.gnuConfigureArgs != null) {
final String[] a = this.gnuConfigureArgs.split(" ");
args = new String[a.length + 2];
System.arraycopy(a, 0, args, 2, a.length);
} else {
args = new String[2];
}
// first 2 args are constant
args[0] = configure.getAbsolutePath();
args[1] = "--prefix=" + getGnuAOLTargetDirectory().getAbsolutePath();
final File buildDir = getGnuAOLSourceDirectory();
FileUtils.mkdir(buildDir.getPath());
getLog().info("args: " + arraysToString(args));
final int result = NarUtil.runCommand("sh", args, buildDir, null, getLog());
if (result != 0) {
throw new MojoExecutionException("'" + CONFIGURE + "' errorcode: " + result);
}
}
}
}
private void runAutogen(final File autogen, final File targetDir, final String args[])
throws MojoExecutionException, MojoFailureException {
// fix missing config directory
final File configDir = new File(targetDir, "config");
if (!configDir.exists()) {
configDir.mkdirs();
}
NarUtil.makeExecutable(autogen, getLog());
getLog().debug("running sh ./" + autogen.getName());
String arguments[] = null;
if (args != null) {
arguments = new String[1 + args.length];
System.arraycopy(args, 0, arguments, 1, args.length);
} else {
arguments = new String[1];
}
arguments[0] = "./" + autogen.getName();
getLog().info("args: " + arraysToString(arguments));
final int result = NarUtil.runCommand("sh", arguments, targetDir, null, getLog());
if (result != 0) {
throw new MojoExecutionException("'" + autogen.getName() + "' errorcode: " + result);
}
}
}