blob: 065bd712b10962f1754b3b17cba6bbf6de18ad5d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2016 Red Hat Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.autotools.core.configure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.autotools.core.AutotoolsOptionConstants;
public class AutotoolsConfiguration implements IAConfiguration {
public static class Option {
private String name;
private String transformedName;
private int type;
private String defaultValue;
public Option(String name, int type) {
this(name, name, type);
}
public Option(String name, String transformedName, int type) {
this.name = name;
this.transformedName = transformedName;
this.type = type;
}
public Option(String name, String transformedName, String defaultValue, int type) {
this.name = name;
this.transformedName = transformedName;
this.type = type;
this.defaultValue = defaultValue;
}
public String getName() {
return name;
}
public int getType() {
return type;
}
public String getDefaultValue() {
return defaultValue;
}
public String getDescription() {
return ConfigureMessages.getConfigureDescription(transformedName);
}
public String getToolTip() {
return ConfigureMessages.getConfigureTip(transformedName);
}
}
// Configure options and categories. List below is ordered.
// All options following a category are children of that category
// in a tree view, up to the next category.
private static Option[] configOpts = new Option[] {
new Option(AutotoolsOptionConstants.TOOL_CONFIGURE, IConfigureOption.TOOL),
new Option(AutotoolsOptionConstants.CATEGORY_GENERAL, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_CONFIGDIR, IConfigureOption.INTERNAL),
new Option(AutotoolsOptionConstants.OPT_CACHE_FILE, "cache_file", IConfigureOption.STRING), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_HELP, IConfigureOption.BIN),
new Option(AutotoolsOptionConstants.OPT_NO_CREATE, "no_create", IConfigureOption.BIN), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_QUIET, IConfigureOption.BIN),
new Option(AutotoolsOptionConstants.OPT_VERSION, IConfigureOption.BIN),
new Option(AutotoolsOptionConstants.CATEGORY_PLATFORM, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_HOST, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_BUILD, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_TARGET, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.CATEGORY_DIRECTORIES, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_PREFIX, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_EXEC_PREFIX, "exec_prefix", IConfigureOption.STRING), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_LIBDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_BINDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_SBINDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_INCLUDEDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_DATADIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_SYSCONFDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_INFODIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_MANDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_SRCDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_LOCALSTATEDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_SHAREDSTATEDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_LIBEXECDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.OPT_OLDINCLUDEDIR, IConfigureOption.STRING),
new Option(AutotoolsOptionConstants.CATEGORY_FILENAMES, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_PROGRAM_PREFIX, "program_prefix", IConfigureOption.STRING), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_PROGRAM_SUFFIX, "program_suffix", IConfigureOption.STRING), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_PROGRAM_TRANSFORM_NAME, "program_transform_name", IConfigureOption.STRING), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.CATEGORY_ENVVAR, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_ENVVAR, IConfigureOption.ENVVAR),
new Option(AutotoolsOptionConstants.CATEGORY_FEATURES, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_ENABLE_MAINTAINER_MODE, "enable_maintainer_mode", IConfigureOption.BIN), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.FLAG_CFLAGS, "cflags", AutotoolsOptionConstants.FLAG_CFLAGS_FLAGS, IConfigureOption.FLAG), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.OPT_CFLAGS_DEBUG, "cflags_debug", IConfigureOption.FLAGVALUE), // $NON-NLS-1$ // $NON-NLS-2$
new Option(AutotoolsOptionConstants.OPT_CFLAGS_GPROF, "cflags_gprof", IConfigureOption.FLAGVALUE), // $NON-NLS-1$ // $NON-NLS-2$
new Option(AutotoolsOptionConstants.OPT_CFLAGS_GCOV, "cflags_gcov", IConfigureOption.FLAGVALUE), // $NON-NLS-1$ // $NON-NLS-2$
new Option(AutotoolsOptionConstants.OPT_USER, IConfigureOption.MULTIARG),
new Option(AutotoolsOptionConstants.TOOL_AUTOGEN, "autogen", "autogen.sh", IConfigureOption.TOOL), // $NON-NLS-1$
new Option(AutotoolsOptionConstants.CATEGORY_OPTIONS, IConfigureOption.CATEGORY),
new Option(AutotoolsOptionConstants.OPT_AUTOGENOPTS, IConfigureOption.MULTIARG),
};
private static Option[] toolList;
private String id;
private boolean isDirty;
private boolean isParmsDirty;
private Map<String, IConfigureOption> configOptions;
private ArrayList<String> configParms = new ArrayList<>();
public AutotoolsConfiguration(String name) {
this(name, true);
}
private AutotoolsConfiguration(String name, boolean initialize) {
this.id = name;
configOptions = new HashMap<>();
if (initialize)
initConfigOptions();
isParmsDirty = true;
}
private void initConfigOptions() {
// Put configure options in hash map. Ignore categories.
ArrayList<Option> tools = new ArrayList<>();
FlagConfigureOption lastFlag = null;
for (int i = 0; i < configOpts.length; ++i) {
Option opt = configOpts[i];
String defaultValue = opt.getDefaultValue();
int type = opt.type;
switch (type) {
case IConfigureOption.BIN:
BinConfigureOption b = new BinConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
b.setValue(defaultValue);
configOptions.put(opt.name, b);
break;
case IConfigureOption.STRING:
StringConfigureOption s = new StringConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
s.setValue(defaultValue);
configOptions.put(opt.name, s);
break;
case IConfigureOption.INTERNAL:
InternalConfigureOption io = new InternalConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
io.setValue(defaultValue);
configOptions.put(opt.name, io);
break;
case IConfigureOption.MULTIARG:
MultiArgConfigureOption m = new MultiArgConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
m.setValue(defaultValue);
configOptions.put(opt.name, m);
break;
case IConfigureOption.TOOL:
tools.add(opt);
ConfigureTool t = new ConfigureTool(opt.name, opt.transformedName, this);
if (defaultValue != null)
t.setValue(defaultValue);
configOptions.put(opt.name, t);
break;
case IConfigureOption.CATEGORY:
configOptions.put(opt.name, new ConfigureOptionCategory(opt.name));
break;
case IConfigureOption.FLAG:
FlagConfigureOption f = new FlagConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
f.setValue(defaultValue);
lastFlag = f;
configOptions.put(opt.name, f);
break;
case IConfigureOption.FLAGVALUE:
FlagValueConfigureOption fv
= new FlagValueConfigureOption(opt.name, opt.transformedName,
this, ConfigureMessages.getParameter(opt.transformedName));
if (defaultValue != null)
fv.setValue(defaultValue);
lastFlag.addChild(opt.name);
configOptions.put(opt.name, fv);
break;
case IConfigureOption.ENVVAR:
VariableConfigureOption v = new VariableConfigureOption(opt.name, opt.transformedName, this);
if (defaultValue != null)
v.setValue(defaultValue);
configOptions.put(opt.name, v);
break;
}
}
toolList = tools.toArray(new Option[tools.size()]);
}
public static Option[] getOptionList() {
return configOpts.clone();
}
public static Option[] getChildOptions(String name) {
ArrayList<Option> options = new ArrayList<>();
for (int i = 0; i < configOpts.length; ++i) {
Option opt = configOpts[i];
if (opt.getName().equals(name)) {
if (opt.getType() == IConfigureOption.CATEGORY) {
for (int j = i + 1; j < configOpts.length; ++j) {
Option o = configOpts[j];
int type = o.getType();
if (type != IConfigureOption.CATEGORY &&
type != IConfigureOption.TOOL)
options.add(o);
else
return options.toArray(new Option[options.size()]);
}
} else if (opt.getType() == IConfigureOption.TOOL) {
for (int j = i + 1; j < configOpts.length; ++j) {
Option o = configOpts[j];
int type = o.getType();
if (type == IConfigureOption.CATEGORY)
options.add(o);
else if (type == IConfigureOption.TOOL)
return options.toArray(new Option[options.size()]);
}
}
}
}
return options.toArray(new Option[options.size()]);
}
public static Option[] getTools() {
return toolList.clone();
}
@Override
public IConfigureOption getOption(String name) {
return configOptions.get(name);
}
@Override
public IAConfiguration copy() {
return copy(id);
}
@Override
public IAConfiguration copy(String newId) {
AutotoolsConfiguration cfg = new AutotoolsConfiguration(newId, false);
Collection<IConfigureOption> oldValues = configOptions.values();
for (Iterator<IConfigureOption> i = oldValues.iterator(); i.hasNext();) {
IConfigureOption opt = i.next();
cfg.configOptions.put(opt.getName(), opt.copy(cfg));
}
if (getId().equals(newId))
cfg.setDirty(isDirty()); // copying with same id, do not change dirty attribute
else
cfg.setDirty(true); // we are cloning with a new id, treat it as never built/dirty
return cfg;
}
@Override
public String getId() {
return id;
}
@Override
public boolean isDirty() {
return isDirty;
}
@Override
public void setDirty(boolean value) {
isDirty = value;
if (isDirty)
isParmsDirty = true;
}
@Override
public Map<String, IConfigureOption> getOptions() {
return configOptions;
}
@Override
public String getToolParameters(String name) {
StringBuilder buf = new StringBuilder();
Option[] options = getChildOptions(name);
for (int i = 0; i < options.length; ++i) {
IConfigureOption option = getOption(options[i].getName());
if (option.getType() == IConfigureOption.CATEGORY) {
Option[] childOptions = getChildOptions(option.getName());
for (int j = 0; j < childOptions.length; ++j) {
IConfigureOption childOption = getOption(childOptions[j].getName());
String parameter = childOption.getParameter();
if (!parameter.isEmpty())
buf.append(' ').append(parameter);
}
} else {
String parameter = option.getParameter();
if (!parameter.isEmpty())
buf.append(' ').append(parameter);
}
}
return buf.toString();
}
@Override
public List<String> getToolArgs(String name) {
if (isParmsDirty) {
configParms = new ArrayList<>();
Option[] options = getChildOptions(name);
for (int i = 0; i < options.length; ++i) {
IConfigureOption option = getOption(options[i].getName());
if (option.getType() == IConfigureOption.CATEGORY) {
Option[] childOptions = getChildOptions(option.getName());
for (int j = 0; j < childOptions.length; ++j) {
IConfigureOption childOption = getOption(childOptions[j].getName());
List<String> parameters = childOption.getParameters();
configParms.addAll(parameters);
}
} else {
List<String> parameters = option.getParameters();
configParms.addAll(parameters);
}
}
}
return configParms;
}
@Override
public void setOption(String name, String value) {
IConfigureOption option = configOptions.get(name);
if (option != null) {
if (!option.getValue().equals(value)) {
option.setValue(value);
setDirty(true);
}
}
}
@Override
public void setConfigToolDirectory(String configToolDirectory) {
setOption("configdir", configToolDirectory);
}
@Override
public String getConfigToolDirectory() {
IConfigureOption option = configOptions.get("configdir");
return option.getValue();
}
@Override
public void setDefaultOptions() {
initConfigOptions();
}
}