package org.apache.maven.plugin.nar; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.codehaus.plexus.util.FileUtils; /** * Copies the GNU style source files to a target area, autogens and configures * them. * * @goal nar-gnu-configure * @phase process-sources * @requiresProject * @author Mark Donszelmann */ public class NarGnuConfigureMojo extends AbstractGnuMojo { /** * Skip running of autogen.sh (aka buildconf). * * @parameter expression="${nar.gnu.autogen.skip}" default-value="false" */ private boolean gnuAutogenSkip; /** * Skip running of configure and therefore also autogen.sh * * @parameter expression="${nar.gnu.configure.skip}" default-value="false" */ private boolean gnuConfigureSkip; /** * Arguments to pass to GNU configure. * * @parameter expression="${nar.gnu.configure.args}" */ private List<String> gnuConfigureArgs; /** * Arguments to pass to GNU configure. Space separated arguments list of arguments. * Will work in combination with <gnuConfigureArgs>. * * @parameter expression="${nar.gnu.configure.argSet}" default-value="" */ private String gnuConfigureArgSet; /** * Arguments to pass to GNU buildconf. * * @parameter expression="${nar.gnu.buildconf.args}" default-value="" */ private String gnuBuildconfArgs; private static final String AUTOGEN = "autogen.sh"; private static final String BUILDCONF = "buildconf"; private static final String CONFIGURE = "configure"; public final void narExecute() throws MojoExecutionException, MojoFailureException { if (!useGnu()) { return; } File targetDir = getGnuAOLSourceDirectory(); if (getGnuSourceDirectory().exists()) { getLog().info("Copying GNU sources"); try { FileUtils.mkdir(targetDir.getPath()); NarUtil.copyDirectoryStructure(getGnuSourceDirectory(), targetDir, null, null, getLog()); } catch (IOException e) { throw new MojoExecutionException("Failed to copy GNU sources", e); } if (!gnuConfigureSkip && !gnuAutogenSkip) { File autogen = new File(targetDir, AUTOGEN); 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 (gnuBuildconfArgs != null) { gnuBuildconfArgsArray = gnuBuildconfArgs.split("\\s"); } runAutogen(buildconf, targetDir, gnuBuildconfArgsArray); } } File configure = new File(targetDir, CONFIGURE); if (!gnuConfigureSkip && configure.exists()) { getLog().info("Running GNU " + CONFIGURE); NarUtil.makeExecutable(configure, getLog()); List<String> argsList = new ArrayList<>(); // first 2 args are constant argsList.add("./" + configure.getName()); argsList.add("--prefix=" + getGnuAOLTargetDirectory().getAbsolutePath()); if (gnuConfigureArgs != null) { for (String arg : gnuConfigureArgs) { argsList.add(arg); } } if (gnuConfigureArgSet != null) { final String[] argSet = gnuConfigureArgSet.split("\\s"); for (int i = 0; i < argSet.length ; i++) { argsList.add(argSet[i]); } } String[] args = argsList.toArray(new String[argsList.size()]); getLog().info("args: " + arraysToString(args)); int result = NarUtil.runCommand("sh", args, targetDir, 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]; for (int i = 0; i < args.length; ++i) { arguments[i + 1] = args[i]; } } 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); } } // JDK 1.4 compatibility private static String arraysToString(Object[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; 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(", "); } } }