From 880b1b606a76bf51cee39f80ddb69d37cacf5d1f Mon Sep 17 00:00:00 2001 From: Wainer dos Santos Moschetta Date: Fri, 19 Feb 2016 21:02:40 -0200 Subject: [PATCH] Bug 467771 - add basis to support autotools option as NAME=VALUE It is not obvious in autotools preferences UI how to set variables like CC=/sbin/gcc Introduces the basis to allow extend the UI to include such as kind of variables. Change-Id: Ife0aada50d8c253f3fff39e7087f5fd54803ba48 Signed-off-by: Wainer dos Santos Moschetta --- .../core/AutotoolsOptionConstants.java | 5 + .../cdt/autotools/core/IAutotoolsOption.java | 4 + .../configure/AutotoolsConfiguration.java | 8 + .../AutotoolsConfigurationManager.java | 1 + .../configure/ConfigureMessages.properties | 4 + .../core/configure/IConfigureOption.java | 4 + .../configure/VariableConfigureOption.java | 73 ++++++ .../META-INF/MANIFEST.MF | 3 +- .../AutotoolsCategoryPropertyOptionPage.java | 240 +++++++++++++++++- .../AutotoolsPropertyMessages.properties | 4 + 10 files changed, 344 insertions(+), 2 deletions(-) create mode 100644 build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/VariableConfigureOption.java diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/AutotoolsOptionConstants.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/AutotoolsOptionConstants.java index a0ebb91ef5b..2068ad00fac 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/AutotoolsOptionConstants.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/AutotoolsOptionConstants.java @@ -58,5 +58,10 @@ public class AutotoolsOptionConstants { public static final String TOOL_AUTOGEN = "autogen"; // $NON-NLS-1$ public static final String CATEGORY_OPTIONS = "options"; // $NON-NLS-1$ public static final String OPT_AUTOGENOPTS = "autogenOpts"; // $NON-NLS-1$ + /** + * @since 2.0 + */ + public static final String CATEGORY_ENVVAR = "cat_envvar"; // $NON-NLS-1$ + public final static String OPT_ENVVAR = "env_vars"; // $NON-NLS-1$ } diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/IAutotoolsOption.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/IAutotoolsOption.java index d51d675b47c..f31212eab89 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/IAutotoolsOption.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/autotools/core/IAutotoolsOption.java @@ -22,6 +22,10 @@ public interface IAutotoolsOption { int TOOL = 5; int FLAG = 6; int FLAGVALUE = 7; + /** + * @since 2.0 + */ + int ENVVAR = 8; int getType(); diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfiguration.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfiguration.java index c0c162068bd..5a1b16e07b2 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfiguration.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfiguration.java @@ -102,6 +102,8 @@ public class AutotoolsConfiguration implements IAConfiguration { 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$ @@ -193,6 +195,12 @@ public class AutotoolsConfiguration implements IAConfiguration { 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()]); diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfigurationManager.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfigurationManager.java index 4581667a540..b8e0e3a4f26 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfigurationManager.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/AutotoolsConfigurationManager.java @@ -566,6 +566,7 @@ public class AutotoolsConfigurationManager implements IResourceChangeListener { case FLAGVALUE: case MULTIARG: case INTERNAL: + case ENVVAR: return true; } return false; diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/ConfigureMessages.properties b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/ConfigureMessages.properties index 6b62caa9f7b..b9ba02bbae4 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/ConfigureMessages.properties +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/ConfigureMessages.properties @@ -91,6 +91,10 @@ Option.configure.cflags_gcov.parm=-fprofile-arcs -ftest-coverage Option.configure.cflags=Compiler Flags: +Option.configure.cat_envvar=Environment variables +Option.configure.env_vars=Export environment variables +Option.configure.env_vars.tip=Environment variables to be used during configuration + Option.configure.autogen=autogen Option.configure.options=Options Option.configure.autogenOpts=Additional command-line options diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/IConfigureOption.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/IConfigureOption.java index 46385573bce..4854ca95828 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/IConfigureOption.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/IConfigureOption.java @@ -24,6 +24,10 @@ public interface IConfigureOption { int TOOL = IAutotoolsOption.TOOL; int FLAG = IAutotoolsOption.FLAG; int FLAGVALUE = IAutotoolsOption.FLAGVALUE; + /** + * @since 2.0 + */ + int ENVVAR = IAutotoolsOption.ENVVAR; String getName(); diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/VariableConfigureOption.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/VariableConfigureOption.java new file mode 100644 index 00000000000..036e3b4f964 --- /dev/null +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/configure/VariableConfigureOption.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2016 IBM Corporation. + * 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: + * Wainer dos Santos Moschetta - initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.autotools.core.configure; + +/** + * This class represents a a list of environment variables as NAME="VALUE" + * + * @since 2.0 + * + */ +public class VariableConfigureOption extends AbstractConfigurationOption { + + private String value; + + public VariableConfigureOption(String name, AutotoolsConfiguration cfg) { + super(name, cfg); + this.value = ""; // $NON-NLS-1$ + } + + public VariableConfigureOption(String name, String transformedName, AutotoolsConfiguration autotoolsConfiguration) { + super(name, transformedName, autotoolsConfiguration); + this.value = ""; // $NON-NLS-1$ + } + + public VariableConfigureOption(String name, AutotoolsConfiguration cfg, String value) { + super(name, cfg); + this.value = value; + } + + @Override + public String getParameter() { + if (isParmSet()) + return this.value; + return ""; //$NON-NLS-1$ + } + + @Override + public boolean isParmSet() { + return !this.value.isEmpty(); + } + + @Override + public IConfigureOption copy(AutotoolsConfiguration cfg) { + return new VariableConfigureOption(name, cfg, value); + } + + @Override + public void setValue(String newValue) { + if (!newValue.equals(value)) { + cfg.setDirty(true); + value = newValue; + } + } + + @Override + public String getValue() { + return value; + } + + @Override + public int getType() { + return ENVVAR; + } + +} diff --git a/build/org.eclipse.cdt.autotools.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.autotools.ui/META-INF/MANIFEST.MF index 3655b69d9c6..114c5e624e7 100644 --- a/build/org.eclipse.cdt.autotools.ui/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.autotools.ui/META-INF/MANIFEST.MF @@ -22,7 +22,8 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.filesystem;bundle-version="1.2.0", org.eclipse.cdt.make.ui;bundle-version="6.0.0", org.eclipse.ui.views;bundle-version="3.4.0", - org.eclipse.cdt.remote.core;bundle-version="1.0.0" + org.eclipse.cdt.remote.core;bundle-version="1.0.0", + org.eclipse.swt Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.cdt.autotools.ui, diff --git a/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsCategoryPropertyOptionPage.java b/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsCategoryPropertyOptionPage.java index ce0cd770309..782d7d01385 100644 --- a/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsCategoryPropertyOptionPage.java +++ b/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsCategoryPropertyOptionPage.java @@ -16,15 +16,26 @@ import java.util.List; import org.eclipse.cdt.internal.autotools.core.configure.AutotoolsConfiguration; import org.eclipse.cdt.internal.autotools.core.configure.IAConfiguration; import org.eclipse.cdt.internal.autotools.core.configure.IConfigureOption; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditor; +import org.eclipse.jface.preference.ListEditor; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.graphics.FontMetrics; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; public class AutotoolsCategoryPropertyOptionPage extends AbstractConfigurePropertyOptionsPage { @@ -70,7 +81,225 @@ public class AutotoolsCategoryPropertyOptionPage extends @Override protected void doStore() {} } - + + static class VariableListEditor extends ListEditor { + Composite fParent; + String fName; + String fLabelText; + boolean isLoaded; + + public VariableListEditor(String name, String labelText, Composite parent) { + fName = name; + fLabelText = labelText; + fParent = parent; + isLoaded = false; + init(fName, fLabelText); + createControl(fParent); + } + + @Override + protected void selectionChanged() { + super.selectionChanged(); + super.fireValueChanged(getPreferenceName(), "", ""); //$NON-NLS-1$ //$NON-NLS-2$ + } + + @Override + protected String createList(String[] arg0) { + StringBuffer sb = new StringBuffer(); + for (String item : arg0) { + sb.append(item); + sb.append("\\s"); //$NON-NLS-1$ + } + return sb.toString(); + } + + @Override + protected void doLoad() { + if (!isLoaded) { + super.doLoad(); + isLoaded = true; + } + }; + + public void setToolTipText(String toolTip) { + this.getLabelControl().setToolTipText(toolTip); + } + + /** + * Dialog user inputs variable's name and value. + */ + class DialogNewVar extends Dialog { + private String name; + private Text fTextName; + private String value; + private Text fTextValue; + private Button fOkButton; + + public DialogNewVar(Shell shell) { + super(shell); + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(AutotoolsPropertyMessages.getString("NewEnvVarDialog.title")); + }; + + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = 5; + layout.numColumns = 2; + composite.setLayout(layout); + + GC gc = new GC(composite); + gc.setFont(composite.getFont()); + FontMetrics metrics = gc.getFontMetrics(); + gc.dispose(); + int fieldWidthHint = convertWidthInCharsToPixels(metrics, 50); + + Label label = new Label(composite, SWT.NONE); + label.setText(AutotoolsPropertyMessages.getString("NewEnvVarDialog.name_field")); + fTextName = new Text(composite, SWT.SINGLE | SWT.BORDER); + GridData gd = new GridData(GridData.FILL_BOTH); + gd.grabExcessHorizontalSpace = true; + gd.widthHint = fieldWidthHint; + fTextName.setLayoutData(gd); + // Name field cannot be empty. + fTextName.addModifyListener(new ModifyListener() { + + @Override + public void modifyText(ModifyEvent e) { + if (fOkButton != null) { + fOkButton.setEnabled(fTextName.getText().length() > 0); + } + } + }); + label = new Label(composite, SWT.NONE); + label.setText(AutotoolsPropertyMessages.getString("NewEnvVarDialog.value_field")); + fTextValue = new Text(composite, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_BOTH); + gd.grabExcessHorizontalSpace = true; + gd.widthHint = fieldWidthHint; + fTextValue.setLayoutData(gd); + return composite; + }; + + // Obtain instance of OK button and set disabled. + @Override + protected Control createButtonBar(Composite parent) { + Control control = super.createButtonBar(parent); + fOkButton = getButton(IDialogConstants.OK_ID); + fOkButton.setEnabled(false); + return control; + } + + @Override + protected void okPressed() { + name = fTextName.getText().trim(); + value = fTextValue.getText(); + if (value != null) { + value = value.trim(); + } else { + value = ""; //$NON-NLS-1$ + } + super.okPressed(); + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + }; + + @Override + protected String getNewInputObject() { + DialogNewVar newDialog = new DialogNewVar(getShell()); + newDialog.open(); + String name = newDialog.getName(); + + // Create quoted string like CFLAGS="-q -O3" + if (name != null) { + String quote = "\""; //$NON-NLS-1$ + StringBuilder sb = new StringBuilder(name.trim()); + sb.append("="); //$NON-NLS-1$ + String value = newDialog.getValue(); + if (value != null) { + value = value.trim(); + if (value.length() == 0) { + // Check empty value + sb.append(quote); + sb.append(quote); + } else if (value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"') { + // Check user has already quoted it. + sb.append(value); + } else { + sb.append(quote); + sb.append(value); + sb.append(quote); + } + } + return sb.toString(); + } + return null; + } + + /* + * Expect string with format: VAR1="VALUE1" VAR2="VALUE2". Count quotes + * to mark end of a variable. + * + * @see + * org.eclipse.jface.preference.ListEditor#parseString(java.lang.String) + */ + @Override + protected String[] parseString(String str) { + if (str == null) { + return new String[] {}; + } + ArrayList variables = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + int i = 0; + int quote = 0; // 0 = begin variable, + // 1 = looking for end of variable. + while (i < str.length()) { + char c = str.charAt(i); + sb.append(c); + if (c == '"') { + quote++; + } + if (quote == 2) { + // Found end of variable. + quote = 0; + variables.add(sb.toString()); + sb.delete(0, sb.length()); + i++; // Skip whitespace char separating variables. + } + i++; + } + + return variables.toArray(new String[0]); + } + + /** + * Get the list of environment variables in a single line. + * + * @return environment variables + */ + public String getVariablesValue() { + org.eclipse.swt.widgets.List list = super.getList(); + StringBuilder sb = new StringBuilder(); + for (String var : list.getItems()) { + sb.append(var); + sb.append(" "); //$NON-NLS-1$ + } + return sb.toString().trim(); + } + }; + private List fieldEditors; public AutotoolsCategoryPropertyOptionPage(ToolListElement element, IAConfiguration cfg) { @@ -120,6 +349,12 @@ public class AutotoolsCategoryPropertyOptionPage extends addField(l); fieldEditors.add(l); break; + case IConfigureOption.ENVVAR: + VariableListEditor listEditor = new VariableListEditor(option.getName(), option.getDescription(), area); + listEditor.setToolTipText(option.getToolTip()); + addField(listEditor); + fieldEditors.add(listEditor); + break; } } } @@ -150,6 +385,9 @@ public class AutotoolsCategoryPropertyOptionPage extends } else if (event.getSource() instanceof BooleanFieldEditor) { BooleanFieldEditor b = (BooleanFieldEditor)event.getSource(); cfg.setOption(b.getPreferenceName(), Boolean.toString(b.getBooleanValue())); + } else if (event.getSource() instanceof VariableListEditor) { + VariableListEditor v = (VariableListEditor) event.getSource(); + cfg.setOption(v.getPreferenceName(), v.getVariablesValue()); } } diff --git a/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsPropertyMessages.properties b/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsPropertyMessages.properties index a9c612595ab..b6d7200472e 100644 --- a/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsPropertyMessages.properties +++ b/build/org.eclipse.cdt.autotools.ui/src/org/eclipse/cdt/internal/autotools/ui/properties/AutotoolsPropertyMessages.properties @@ -42,3 +42,7 @@ CleanMakeTarget.tooltip=Specify a top-level make target to clean build directory AutoBuildName.label=Automatically generate build directory names for additional configurations AutoBuildName.tooltip=When a configuration other than the first configuration is created, generate a unique build directory using the configuration name. + +NewEnvVarDialog.title=New environment variable +NewEnvVarDialog.name_field=Name: +NewEnvVarDialog.value_field=Value: \ No newline at end of file