diff options
Diffstat (limited to 'build')
61 files changed, 3613 insertions, 0 deletions
diff --git a/build/org.eclipse.cdt.meson-feature/.project b/build/org.eclipse.cdt.meson-feature/.project new file mode 100644 index 00000000000..036545112de --- /dev/null +++ b/build/org.eclipse.cdt.meson-feature/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.cdt.meson-feature</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.pde.FeatureBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.FeatureNature</nature> + </natures> +</projectDescription> diff --git a/build/org.eclipse.cdt.meson-feature/build.properties b/build/org.eclipse.cdt.meson-feature/build.properties new file mode 100644 index 00000000000..b3a611b5c93 --- /dev/null +++ b/build/org.eclipse.cdt.meson-feature/build.properties @@ -0,0 +1,2 @@ +bin.includes = feature.xml,\ + feature.properties diff --git a/build/org.eclipse.cdt.meson-feature/feature.properties b/build/org.eclipse.cdt.meson-feature/feature.properties new file mode 100644 index 00000000000..12ba6eb0cc3 --- /dev/null +++ b/build/org.eclipse.cdt.meson-feature/feature.properties @@ -0,0 +1,17 @@ +############################################################################### +# Copyright (c) 2018 Red Hat Inc. and others +# 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 +############################################################################### +featureName=C/C++ Meson Build Support - Preview +providerName=Eclipse CDT +description=Support for projects built using Meson +copyright=\ +Copyright (c) 2018 Red Hat Inc. and others.\n\ +All rights reserved. This program and the accompanying materials\n\ +are made available under the terms of the Eclipse Public License v1.0\n\ +which accompanies this distribution, and is available at\n\ +http://www.eclipse.org/legal/epl-v10.html + diff --git a/build/org.eclipse.cdt.meson-feature/feature.xml b/build/org.eclipse.cdt.meson-feature/feature.xml new file mode 100644 index 00000000000..79ee4b375fd --- /dev/null +++ b/build/org.eclipse.cdt.meson-feature/feature.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feature + id="org.eclipse.cdt.meson" + label="%featureName" + version="9.4.0.qualifier" + provider-name="%providerName" + license-feature="org.eclipse.license" + license-feature-version="0.0.0"> + + <description> + %description + </description> + + <copyright> + %copyright + </copyright> + + <license url="%licenseURL"> + %license + </license> + + <plugin + id="org.eclipse.cdt.meson.core" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + + <plugin + id="org.eclipse.cdt.meson.ui" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + +</feature> diff --git a/build/org.eclipse.cdt.meson.core/.classpath b/build/org.eclipse.cdt.meson.core/.classpath new file mode 100644 index 00000000000..eca7bdba8f0 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/build/org.eclipse.cdt.meson.core/.project b/build/org.eclipse.cdt.meson.core/.project new file mode 100644 index 00000000000..88c2a4d72fe --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/.project @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.cdt.meson.core</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ds.core.builder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/build/org.eclipse.cdt.meson.core/.settings/org.eclipse.jdt.core.prefs b/build/org.eclipse.cdt.meson.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..0c68a61dca8 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..5e685e1adf8 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF @@ -0,0 +1,18 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundler-Name.0 +Bundle-SymbolicName: org.eclipse.cdt.meson.core;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.eclipse.cdt.meson.core.Activator +Bundle-Vendor: %provider +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.core.resources, + org.eclipse.cdt.core;bundle-version="6.4.0", + org.eclipse.tools.templates.freemarker +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Import-Package: com.google.gson +Export-Package: org.eclipse.cdt.internal.meson.core;x-friends:="org.eclipse.cdt.meson.ui", + org.eclipse.cdt.meson.core +Service-Component: OSGI-INF/component.xml diff --git a/build/org.eclipse.cdt.meson.core/OSGI-INF/component.xml b/build/org.eclipse.cdt.meson.core/OSGI-INF/component.xml new file mode 100644 index 00000000000..0555d1378f2 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/OSGI-INF/component.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.cdt.meson.core"> + <implementation class="org.eclipse.cdt.internal.meson.core.MesonToolChainManager"/> + <service> + <provide interface="org.eclipse.cdt.meson.core.IMesonToolChainManager"/> + </service> +</scr:component> diff --git a/build/org.eclipse.cdt.meson.core/about.html b/build/org.eclipse.cdt.meson.core/about.html new file mode 100644 index 00000000000..d7c511887d6 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/about.html @@ -0,0 +1,24 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>About</title></head> + +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>June 22, 2007</p> +<h3>License</h3> + +<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. +For purposes of the EPL, "Program" will mean the Content.</p> + +<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p> + +</body></html>
\ No newline at end of file diff --git a/build/org.eclipse.cdt.meson.core/build.properties b/build/org.eclipse.cdt.meson.core/build.properties new file mode 100644 index 00000000000..1f193d82824 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/build.properties @@ -0,0 +1,10 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + schema/,\ + templates/,\ + plugin.properties,\ + plugin.xml,\ + about.html,\ + OSGI-INF/, +source.. = src/ diff --git a/build/org.eclipse.cdt.meson.core/plugin.properties b/build/org.eclipse.cdt.meson.core/plugin.properties new file mode 100644 index 00000000000..668a1805f17 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/plugin.properties @@ -0,0 +1,3 @@ +edHatVendor.name = Red Hat +Bundle-Name.0 = Meson Plug-in +provider=Eclipse CDT diff --git a/build/org.eclipse.cdt.meson.core/plugin.xml b/build/org.eclipse.cdt.meson.core/plugin.xml new file mode 100644 index 00000000000..f84a5fd4b74 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/plugin.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.4"?> +<plugin> + <extension-point id="toolChainProvider" name="Meson ToolChain File Provider" schema="schema/toolChainProvider.exsd"/> + <extension + id="mesonNature" + point="org.eclipse.core.resources.natures"> + <runtime> + <run + class="org.eclipse.cdt.meson.core.MesonNature"> + </run> + </runtime> + </extension> + <extension + point="org.eclipse.cdt.core.buildConfigProvider"> + <provider + class="org.eclipse.cdt.internal.meson.core.MesonBuildConfigurationProvider" + id="org.eclipse.cdt.meson.core.provider" + natureId="org.eclipse.cdt.meson.core.mesonNature"> + </provider> + </extension> +</plugin> diff --git a/build/org.eclipse.cdt.meson.core/schema/toolChainProvider.exsd b/build/org.eclipse.cdt.meson.core/schema/toolChainProvider.exsd new file mode 100644 index 00000000000..b83426fe8b9 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/schema/toolChainProvider.exsd @@ -0,0 +1,102 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.cdt.meson.core" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appinfo> + <meta.schema plugin="org.eclipse.cdt.meson.core" id="toolChainProvider" name="Meson ToolChain File Provider"/> + </appinfo> + <documentation> + [Enter description of this extension point.] + </documentation> + </annotation> + + <element name="extension"> + <annotation> + <appinfo> + <meta.element /> + </appinfo> + </annotation> + <complexType> + <sequence minOccurs="1" maxOccurs="unbounded"> + <element ref="provider"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + <appinfo> + <meta.attribute translatable="true"/> + </appinfo> + </annotation> + </attribute> + </complexType> + </element> + + <element name="provider"> + <complexType> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appinfo> + <meta.attribute kind="java" basedOn=":org.eclipse.cdt.meson.core.IMesonToolChainProvider"/> + </appinfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appinfo> + <meta.section type="since"/> + </appinfo> + <documentation> + [Enter the first release in which this extension point appears.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="examples"/> + </appinfo> + <documentation> + [Enter extension point usage example here.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="apiinfo"/> + </appinfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="implementation"/> + </appinfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + +</schema> diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/CompileCommand.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/CompileCommand.java new file mode 100644 index 00000000000..9bcb8d36ac8 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/CompileCommand.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems and others. + * 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 + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +public class CompileCommand { + + private String directory; + private String command; + private String file; + + public String getDirectory() { + return directory; + } + + public String getCommand() { + return command; + } + + public String getFile() { + return file; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java new file mode 100644 index 00000000000..22c4518841c --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java @@ -0,0 +1,299 @@ +/******************************************************************************* + * Copyright (c) 2015, 2016 QNX Software Systems and others. + * 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 + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.core.CommandLauncherManager; +import org.eclipse.cdt.core.ConsoleOutputStream; +import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.core.ICommandLauncher; +import org.eclipse.cdt.core.build.CBuildConfiguration; +import org.eclipse.cdt.core.build.ICBuildCommandLauncher; +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.model.ICModelMarker; +import org.eclipse.cdt.core.resources.IConsole; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.cdt.meson.core.IMesonConstants; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.cdt.meson.core.IMesonToolChainManager; +import org.eclipse.cdt.utils.Platform; +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubMonitor; +import org.osgi.service.prefs.BackingStoreException; +import org.osgi.service.prefs.Preferences; + +import com.google.gson.Gson; + +public class MesonBuildConfiguration extends CBuildConfiguration { + + private static final String TOOLCHAIN_FILE = "cdt.meson.toolchainfile"; //$NON-NLS-1$ + + private IMesonToolChainFile toolChainFile; + + public MesonBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { + super(config, name); + + IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class); + Preferences settings = getSettings(); + String pathStr = settings.get(TOOLCHAIN_FILE, ""); //$NON-NLS-1$ + if (!pathStr.isEmpty()) { + Path path = Paths.get(pathStr); + toolChainFile = manager.getToolChainFile(path); + } else { + toolChainFile = manager.getToolChainFileFor(getToolChain()); + if (toolChainFile != null) { + saveToolChainFile(); + } + } + } + + public MesonBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { + this(config, name, toolChain, null, "run"); //$NON-NLS-1$ + } + + public MesonBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, + IMesonToolChainFile toolChainFile, String launchMode) { + super(config, name, toolChain, launchMode); + + this.toolChainFile = toolChainFile; + if (toolChainFile != null) { + saveToolChainFile(); + } + } + + private void saveToolChainFile() { + Preferences settings = getSettings(); + settings.put(TOOLCHAIN_FILE, toolChainFile.getPath().toString()); + try { + settings.flush(); + } catch (BackingStoreException e) { + Activator.log(e); + } + } + + private boolean isLocal() throws CoreException { + IToolChain toolchain = getToolChain(); + return Platform.getOS().equals(toolchain.getProperty(IToolChain.ATTR_OS)) + && Platform.getOSArch().equals(toolchain.getProperty(IToolChain.ATTR_ARCH)); + } + + @Override + public IProject[] build(int kind, Map<String, String> args, IConsole console, IProgressMonitor monitor) + throws CoreException { + IProject project = getProject(); + + try { + project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); + + ConsoleOutputStream outStream = console.getOutputStream(); + + Path buildDir = getBuildDirectory(); + + outStream.write(String.format(Messages.MesonBuildConfiguration_BuildingIn, buildDir.toString())); + + // Make sure we have a toolchain file if cross + if (toolChainFile == null && !isLocal()) { + IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class); + toolChainFile = manager.getToolChainFileFor(getToolChain()); + + if (toolChainFile == null) { + // error + console.getErrorStream().write(Messages.MesonBuildConfiguration_NoToolchainFile); + return null; + } + } + + boolean runMeson = !Files.exists(buildDir.resolve("build.ninja")); //$NON-NLS-1$ + if (runMeson) { // $NON-NLS-1$ + Path path = findCommand("meson"); //$NON-NLS-1$ + if (path == null) { + path = Paths.get("meson"); //$NON-NLS-1 + } + + List<String> argsList = new ArrayList<>(); + + String userArgs = getProperty(IMesonConstants.MESON_ARGUMENTS); + if (userArgs != null) { + argsList.addAll(Arrays.asList(userArgs.trim().split("\\s+"))); //$NON-NLS-1$ + } + + argsList.add(getBuildDirectory().toString()); + + String envStr = getProperty(IMesonConstants.MESON_ENV); + String[] env = new String[0]; + if (envStr != null) { + env = envStr.split(IMesonConstants.MESON_ENV_SEPARATOR); //$NON-NLS-1$ + } + ICommandLauncher launcher = CommandLauncherManager.getInstance().getCommandLauncher(this); + + launcher.setProject(getProject()); + if (launcher instanceof ICBuildCommandLauncher) { + ((ICBuildCommandLauncher)launcher).setBuildConfiguration(this); + } + + monitor.subTask(Messages.MesonBuildConfiguration_RunningMeson); + + org.eclipse.core.runtime.Path mesonPath = new org.eclipse.core.runtime.Path(path.toString()); + outStream.write(String.join(" ", envStr != null ? envStr : "", //$NON-NLS-1$ //$NON-NLS-2$ + mesonPath.toString(), userArgs, "\n")); //$NON-NLS-1$ + outStream.write(getBuildDirectory() + "\n"); //$NON-NLS-1$ + org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(getBuildDirectory().getParent().getParent().toString()); + + launcher.execute(mesonPath, argsList.toArray(new String[0]), env, workingDir, monitor); + if (launcher.waitAndRead(outStream, outStream, SubMonitor.convert(monitor)) != ICommandLauncher.OK) { + String errMsg = launcher.getErrorMessage(); + console.getErrorStream().write(String.format(Messages.MesonBuildConfiguration_RunningMesonFailure, errMsg)); + return null; + }; + } + + try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this, + getToolChain().getErrorParserIds())) { + epm.setOutputStream(console.getOutputStream()); + + String buildCommand = getProperty(IMesonConstants.BUILD_COMMAND); + if (buildCommand == null || buildCommand.isEmpty()) { + buildCommand = "ninja"; + } + + + String envStr = getProperty(IMesonConstants.MESON_ENV); + String[] env = new String[0]; + if (envStr != null) { + env = envStr.split(envStr); + } + ICommandLauncher launcher = CommandLauncherManager.getInstance().getCommandLauncher(this); + + launcher.setProject(getProject()); + if (launcher instanceof ICBuildCommandLauncher) { + ((ICBuildCommandLauncher)launcher).setBuildConfiguration(this); + } + + monitor.subTask(Messages.MesonBuildConfiguration_RunningMeson); + + org.eclipse.core.runtime.Path ninjaPath = new org.eclipse.core.runtime.Path(buildCommand); + outStream.write(String.join(" ", ninjaPath.toString() + '\n')); //$NON-NLS-1$ + org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(getBuildDirectory().toString()); + + launcher.execute(ninjaPath, new String[0], env, workingDir, monitor); + if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), SubMonitor.convert(monitor)) != ICommandLauncher.OK) { + String errMsg = launcher.getErrorMessage(); + console.getErrorStream().write(String.format(Messages.MesonBuildConfiguration_RunningNinjaFailure, errMsg)); + return null; + }; + } + + project.refreshLocal(IResource.DEPTH_INFINITE, monitor); + + // Load compile_commands.json file + processCompileCommandsFile(monitor); + + outStream.write(String.format(Messages.MesonBuildConfiguration_BuildingComplete, buildDir.toString())); + + return new IProject[] { project }; + } catch (IOException e) { + throw new CoreException(Activator.errorStatus(String.format(Messages.MesonBuildConfiguration_Building, project.getName()), e)); + } + } + + @Override + public void clean(IConsole console, IProgressMonitor monitor) throws CoreException { + IProject project = getProject(); + try { + project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); + + ConsoleOutputStream outStream = console.getOutputStream(); + + Path buildDir = getBuildDirectory(); + + try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this, + getToolChain().getErrorParserIds())) { + epm.setOutputStream(console.getOutputStream()); + + + String cleanCommand = getProperty(IMesonConstants.CLEAN_COMMAND); + if (cleanCommand == null) { + cleanCommand = "ninja clean"; //$NON-NLS-1$ + } + String[] command = cleanCommand.split(" "); //$NON-NLS-1$ + + Path cmdPath = findCommand(command[0]); + if (cmdPath != null) { + command[0] = cmdPath.toString(); + } + + IPath cmd = new org.eclipse.core.runtime.Path(command[0]); + ICommandLauncher launcher = CommandLauncherManager.getInstance().getCommandLauncher(this); + + launcher.setProject(getProject()); + if (launcher instanceof ICBuildCommandLauncher) { + ((ICBuildCommandLauncher)launcher).setBuildConfiguration(this); + } + + String[] commandargs = new String[0]; + if (command.length > 1) { + commandargs = Arrays.copyOfRange(command, 1, command.length); + } + org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(buildDir.toString()); + + String[] env = new String[0]; + + outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$ + launcher.execute(cmd, commandargs, env, workingDir, monitor); + if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), SubMonitor.convert(monitor)) != ICommandLauncher.OK) { + String errMsg = launcher.getErrorMessage(); + console.getErrorStream().write(String.format(Messages.MesonBuildConfiguration_RunningNinjaFailure, errMsg)); + return; + }; + } + + project.refreshLocal(IResource.DEPTH_INFINITE, monitor); + } catch (IOException e) { + throw new CoreException(Activator.errorStatus(String.format(Messages.MesonBuildConfiguration_Cleaning, project.getName()), e)); + } + } + + private void processCompileCommandsFile(IProgressMonitor monitor) throws CoreException { + IProject project = getProject(); + Path commandsFile = getBuildDirectory().resolve("compile_commands.json"); //$NON-NLS-1$ + if (Files.exists(commandsFile)) { + monitor.setTaskName(Messages.MesonBuildConfiguration_ProcCompJson); + try (FileReader reader = new FileReader(commandsFile.toFile())) { + Gson gson = new Gson(); + CompileCommand[] commands = gson.fromJson(reader, CompileCommand[].class); + Map<String, CompileCommand> dedupedCmds = new HashMap<>(); + for (CompileCommand command : commands) { + dedupedCmds.put(command.getFile(), command); + } + for (CompileCommand command : dedupedCmds.values()) { + processLine(command.getCommand()); + } + shutdown(); + } catch (IOException e) { + throw new CoreException( + Activator.errorStatus(String.format(Messages.MesonBuildConfiguration_ProcCompCmds, project.getName()), e)); + } + } + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java new file mode 100644 index 00000000000..9b08b9c9f83 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use with Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.core.build.ICBuildConfigurationManager; +import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.cdt.meson.core.IMesonToolChainManager; +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Platform; + +public class MesonBuildConfigurationProvider implements ICBuildConfigurationProvider { + + public static final String ID = "org.eclipse.cdt.meson.core.provider"; //$NON-NLS-1$ + + private IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class); + private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class); + + @Override + public String getId() { + return ID; + } + + @Override + public ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { + if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) { + IToolChain toolChain = null; + + // try the toolchain for the local target + Map<String, String> properties = new HashMap<>(); + properties.put(IToolChain.ATTR_OS, Platform.getOS()); + properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch()); + IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class); + for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) { + toolChain = tc; + break; + } + + // local didn't work, try and find one that does + if (toolChain == null) { + for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) { + toolChain = tc; + break; + } + } + + if (toolChain != null) { + return new MesonBuildConfiguration(config, name, toolChain); + } else { + // No valid combinations + return null; + } + } else { + return new MesonBuildConfiguration(config, name); + } + } + + @Override + public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + IProgressMonitor monitor) throws CoreException { + // get matching toolchain file if any + Map<String, String> properties = new HashMap<>(); + String os = toolChain.getProperty(IToolChain.ATTR_OS); + if (os != null && !os.isEmpty()) { + properties.put(IToolChain.ATTR_OS, os); + } + String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); + if (arch != null && !arch.isEmpty()) { + properties.put(IToolChain.ATTR_ARCH, arch); + } + IMesonToolChainFile file = manager.getToolChainFileFor(toolChain); + if (file == null) { + Collection<IMesonToolChainFile> files = manager.getToolChainFilesMatching(properties); + if (!files.isEmpty()) { + file = files.iterator().next(); + } + } + + // create config + StringBuilder configName = new StringBuilder("meson."); //$NON-NLS-1$ + configName.append(launchMode); + if (os != null) { + configName.append('.'); + configName.append(os); + } + if (arch != null && !arch.isEmpty()) { + configName.append('.'); + configName.append(arch); + } + String name = configName.toString(); + int i = 0; + while (configManager.hasConfiguration(this, project, name)) { + name = configName.toString() + '.' + (++i); + } + + IBuildConfiguration config = configManager.createBuildConfiguration(this, project, name, monitor); + MesonBuildConfiguration mesonConfig = new MesonBuildConfiguration(config, name, toolChain, file, + launchMode); + configManager.addBuildConfiguration(config, mesonConfig); + return mesonConfig; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainFile.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainFile.java new file mode 100644 index 00000000000..20bc5885ace --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainFile.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +import java.nio.file.Path; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.core.runtime.CoreException; + +public class MesonToolChainFile implements IMesonToolChainFile { + + String n; + private final Path path; + private IToolChain toolchain; + + final Map<String, String> properties = new HashMap<>(); + + public MesonToolChainFile(String n, Path path) { + this.n = n; + this.path = path; + } + + @Override + public Path getPath() { + return path; + } + + @Override + public String getProperty(String key) { + return properties.get(key); + } + + @Override + public void setProperty(String key, String value) { + properties.put(key, value); + } + + @Override + public IToolChain getToolChain() throws CoreException { + if (toolchain == null) { + IToolChainManager tcManager = Activator.getService(IToolChainManager.class); + toolchain = tcManager.getToolChain(properties.get(MesonBuildConfiguration.TOOLCHAIN_TYPE), + properties.get(MesonBuildConfiguration.TOOLCHAIN_ID)); + + if (toolchain == null) { + Collection<IToolChain> tcs = tcManager.getToolChainsMatching(properties); + if (!tcs.isEmpty()) { + toolchain = tcs.iterator().next(); + } + } + } + return toolchain; + } + + boolean matches(Map<String, String> properties) { + for (Map.Entry<String, String> property : properties.entrySet()) { + if (!property.getValue().equals(getProperty(property.getKey()))) { + return false; + } + } + return true; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainManager.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainManager.java new file mode 100644 index 00000000000..047345db82a --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonToolChainManager.java @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use with Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.cdt.meson.core.IMesonToolChainListener; +import org.eclipse.cdt.meson.core.IMesonToolChainManager; +import org.eclipse.cdt.meson.core.IMesonToolChainProvider; +import org.eclipse.cdt.meson.core.MesonToolChainEvent; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.SafeRunner; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.osgi.service.prefs.BackingStoreException; +import org.osgi.service.prefs.Preferences; + +public class MesonToolChainManager implements IMesonToolChainManager { + + private Map<Path, IMesonToolChainFile> files; + + private static final String N = "n"; //$NON-NLS-1$ + private static final String PATH = "__path"; //$NON-NLS-1$ + + private final List<IMesonToolChainListener> listeners = new LinkedList<>(); + + private Preferences getPreferences() { + return InstanceScope.INSTANCE.getNode(Activator.getPluginId()).node("mesonToolchains"); //$NON-NLS-1$ + } + + private void init() { + if (files == null) { + files = new HashMap<>(); + + Preferences prefs = getPreferences(); + try { + for (String childName : prefs.childrenNames()) { + Preferences tcNode = prefs.node(childName); + String pathStr = tcNode.get(PATH, "/"); //$NON-NLS-1$ + Path path = Paths.get(pathStr); + if (Files.exists(path) && !files.containsKey(path)) { + IMesonToolChainFile file = new MesonToolChainFile(childName, path); + for (String key : tcNode.keys()) { + String value = tcNode.get(key, ""); //$NON-NLS-1$ + if (!value.isEmpty()) { + file.setProperty(key, value); + } + } + files.put(path, file); + } else { + tcNode.removeNode(); + prefs.flush(); + } + } + } catch (BackingStoreException e) { + Activator.log(e); + } + + // TODO discovery + IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(Activator.getPluginId(), + "toolChainProvider"); //$NON-NLS-1$ + for (IConfigurationElement element : point.getConfigurationElements()) { + if (element.getName().equals("provider")) { //$NON-NLS-1$ + try { + IMesonToolChainProvider provider = (IMesonToolChainProvider) element + .createExecutableExtension("class"); //$NON-NLS-1$ + provider.init(this); + } catch (ClassCastException | CoreException e) { + Activator.log(e); + } + } + } + } + } + + @Override + public IMesonToolChainFile newToolChainFile(Path path) { + return new MesonToolChainFile(null, path); + } + + @Override + public void addToolChainFile(IMesonToolChainFile file) { + init(); + if (files.containsKey(file.getPath())) { + removeToolChainFile(file); + } + files.put(file.getPath(), file); + + // save it + + MesonToolChainFile realFile = (MesonToolChainFile) file; + Preferences prefs = getPreferences(); + String n = realFile.n; + if (n == null) { + n = prefs.get(N, "0"); //$NON-NLS-1$ + realFile.n = n; + } + prefs.put(N, Integer.toString(Integer.parseInt(n) + 1)); + + Preferences tcNode = prefs.node(n); + tcNode.put(PATH, file.getPath().toString()); + for (Entry<String, String> entry : realFile.properties.entrySet()) { + tcNode.put(entry.getKey(), entry.getValue()); + } + + try { + prefs.flush(); + } catch (BackingStoreException e) { + Activator.log(e); + } + + fireEvent(new MesonToolChainEvent(MesonToolChainEvent.ADDED, file)); + } + + @Override + public void removeToolChainFile(IMesonToolChainFile file) { + init(); + fireEvent(new MesonToolChainEvent(MesonToolChainEvent.REMOVED, file)); + files.remove(file.getPath()); + + String n = ((MesonToolChainFile) file).n; + if (n != null) { + Preferences prefs = getPreferences(); + Preferences tcNode = prefs.node(n); + try { + tcNode.removeNode(); + prefs.flush(); + } catch (BackingStoreException e) { + Activator.log(e); + } + } + } + + @Override + public IMesonToolChainFile getToolChainFile(Path path) { + init(); + return files.get(path); + } + + @Override + public Collection<IMesonToolChainFile> getToolChainFiles() { + init(); + return Collections.unmodifiableCollection(files.values()); + } + + @Override + public Collection<IMesonToolChainFile> getToolChainFilesMatching(Map<String, String> properties) { + List<IMesonToolChainFile> matches = new ArrayList<>(); + for (IMesonToolChainFile file : getToolChainFiles()) { + boolean match = true; + for (Entry<String, String> entry : properties.entrySet()) { + if (!entry.getValue().equals(file.getProperty(entry.getKey()))) { + match = false; + break; + } + } + + if (match) { + matches.add(file); + } + } + return matches; + } + + @Override + public IMesonToolChainFile getToolChainFileFor(IToolChain toolchain) { + String id = toolchain.getId(); + + for (IMesonToolChainFile file : getToolChainFiles()) { + if (id.equals(file.getProperty(MesonBuildConfiguration.TOOLCHAIN_ID))) { + return file; + } + } + + return null; + } + + @Override + public void addListener(IMesonToolChainListener listener) { + listeners.add(listener); + } + + @Override + public void removeListener(IMesonToolChainListener listener) { + listeners.remove(listener); + } + + private void fireEvent(MesonToolChainEvent event) { + for (IMesonToolChainListener listener : listeners) { + SafeRunner.run(new ISafeRunnable() { + @Override + public void run() throws Exception { + listener.handleCMakeToolChainEvent(event); + } + + @Override + public void handleException(Throwable exception) { + Activator.log(exception); + } + }); + } + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/Messages.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/Messages.java new file mode 100644 index 00000000000..e3057822ef4 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/Messages.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 + * + * Red Hat Inc. - initial version + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.core; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.meson.core.messages"; //$NON-NLS-1$ + + public static String MesonBuildConfiguration_Building; + public static String MesonBuildConfiguration_BuildingIn; + public static String MesonBuildConfiguration_BuildingComplete; + public static String MesonBuildConfiguration_Cleaning; + public static String MesonBuildConfiguration_RunningMeson; + public static String MesonBuildConfiguration_RunningMesonFailure; + public static String MesonBuildConfiguration_RunningNinjaFailure; + public static String MesonBuildConfiguration_NoToolchainFile; + public static String MesonBuildConfiguration_ProcCompCmds; + public static String MesonBuildConfiguration_ProcCompJson; + + + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} + diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/messages.properties b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/messages.properties new file mode 100644 index 00000000000..44cdce29493 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/messages.properties @@ -0,0 +1,21 @@ +################################################################################ +# Copyright (c) 2018 Red Hat Inc. and others. +# 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 +# +# Red Hat Inc. - initial implementation +################################################################################ +MesonBuildConfiguration_Building=Building %s +MesonBuildConfiguration_BuildingIn=Building in: %s\n +MesonBuildConfiguration_BuildingComplete=Build complete: %s\n +MesonBuildConfiguration_Cleaning=Cleaning %s +MesonBuildConfiguration_RunningMeson=Running meson +MesonBuildConfiguration_ProcCompCmds=Processing compile commands %s +MesonBuildConfiguration_ProcCompJson=Processing compile_commands.json +MesonBuildConfiguration_NoToolchainFile=No toolchain file found for this target. +MesonBuildConfiguration_RunningMesonFailure=Failure running meson: %s +MesonBuildConfiguration_RunningNinjaFailure=Failure running ninja: %s + + diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/Activator.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/Activator.java new file mode 100644 index 00000000000..31e9b18f715 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/Activator.java @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 + * + * Red Hat Inc. - initial version + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +import java.lang.reflect.InvocationTargetException; +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; + +public class Activator implements BundleActivator { + + private static BundleContext context; + //The shared instance. + private static Activator plugin; + private ResourceBundle resourceBundle; + + public static final String PLUGIN_ID = "org.eclipse.cdt.meson.core"; //$NON-NLS-1$ + + + public Activator() { + Assert.isTrue(plugin == null); + plugin = this; + try { + resourceBundle = ResourceBundle.getBundle(PLUGIN_ID + ".Resources"); //$NON-NLS-1$ + } catch (MissingResourceException x) { + resourceBundle = null; + } + } + + public static String getPluginId() { + return PLUGIN_ID; + } + + public static String getUniqueIdentifier() { + if (getDefault() == null) { + // If the default instance is not yet initialized, + // return a static identifier. This identifier must + // match the plugin id defined in plugin.xml + return PLUGIN_ID; + } + return context.getBundle().getSymbolicName(); + } + + public Bundle getBundle() { + return context.getBundle(); + } + + /** + * Returns the shared instance. + */ + public static Activator getDefault() { + return plugin; + } + + /** + * Return the OSGi service with the given service interface. + * + * @param service service interface + * @return the specified service or null if it's not registered + * @since 1.5 + */ + public static <T> T getService(Class<T> service) { + if (context != null) { + ServiceReference<T> ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } + return null; + } + + public static void error(String message, Throwable cause) { + log(errorStatus(message, cause)); + } + + public static IStatus errorStatus(String message, Throwable cause) { + return new Status(IStatus.ERROR, PLUGIN_ID, message, cause); + } + + /** + * Returns the string from the plugin's resource bundle, + * or 'key' if not found. + * + * @param key the message key + * @return the resource bundle message + */ + public static String getResourceString(String key) { + ResourceBundle bundle = Activator.getDefault().getResourceBundle(); + try { + return bundle.getString(key); + } catch (MissingResourceException e) { + return key; + } + } + + /** + * Returns the string from the plugin's resource bundle, + * or 'key' if not found. + * + * @param key the message key + * @param args an array of substituition strings + * @return the resource bundle message + */ + public static String getFormattedString(String key, String[] args) { + return MessageFormat.format(getResourceString(key), (Object[])args); + } + + /** + * Returns the plugin's resource bundle, + */ + public ResourceBundle getResourceBundle() { + return resourceBundle; + } + + public static void log(IStatus status) { + ResourcesPlugin.getPlugin().getLog().log(status); + } + + public static void logErrorMessage(String message) { + log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null)); + } + + public static void log(Throwable e) { + if (e instanceof InvocationTargetException) + e = ((InvocationTargetException) e).getTargetException(); + IStatus status = null; + if (e instanceof CoreException) + status = ((CoreException) e).getStatus(); + else + status = new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.OK, e.getMessage(), e); + log(status); + } + + + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + plugin = null; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonConstants.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonConstants.java new file mode 100644 index 00000000000..696e27f5ee3 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonConstants.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +public interface IMesonConstants { + + public static final String MESON_ARGUMENTS = "meson.arguments"; //$NON-NLS-1$ + public static final String MESON_ENV = "meson.environment"; //$NON-NLS-1$ + public static final String MESON_ENV_SEPARATOR = "|"; //$NON-NLS-1$ + String MESON_GENERATOR = "meson.generator"; //$NON-NLS-1$ + String BUILD_COMMAND = "meson.command.build"; //$NON-NLS-1$ + String CLEAN_COMMAND = "meson.command.clean"; //$NON-NLS-1$ + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainFile.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainFile.java new file mode 100644 index 00000000000..f2001a60fbf --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainFile.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use with Meson builder + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +import java.nio.file.Path; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.core.runtime.CoreException; + +/** + * A toolchain file. + * + * @noimplement + * @noextend + */ +public interface IMesonToolChainFile { + + Path getPath(); + + String getProperty(String key); + + void setProperty(String key, String value); + + IToolChain getToolChain() throws CoreException; + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainListener.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainListener.java new file mode 100644 index 00000000000..6e1cda8e957 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainListener.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use with Meson builder + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +/** + * Listener for toolchain events. + */ +public interface IMesonToolChainListener { + + void handleCMakeToolChainEvent(MesonToolChainEvent event); + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainManager.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainManager.java new file mode 100644 index 00000000000..011a87bb8ef --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainManager.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use with Meson builder + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +import java.nio.file.Path; +import java.util.Collection; +import java.util.Map; + +import org.eclipse.cdt.core.build.IToolChain; + +/** + * Manages toolchain files for Meson. + * + * @noimplement + * @noextend + */ +public interface IMesonToolChainManager { + + IMesonToolChainFile newToolChainFile(Path path); + + void addToolChainFile(IMesonToolChainFile file); + + void removeToolChainFile(IMesonToolChainFile file); + + IMesonToolChainFile getToolChainFile(Path path); + + Collection<IMesonToolChainFile> getToolChainFilesMatching(Map<String, String> properties); + + IMesonToolChainFile getToolChainFileFor(IToolChain toolchain); + + Collection<IMesonToolChainFile> getToolChainFiles(); + + void addListener(IMesonToolChainListener listener); + + void removeListener(IMesonToolChainListener listener); + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainProvider.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainProvider.java new file mode 100644 index 00000000000..6ceea28f9da --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/IMesonToolChainProvider.java @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +public interface IMesonToolChainProvider { + + void init(IMesonToolChainManager manager); + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonNature.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonNature.java new file mode 100644 index 00000000000..8db389d9005 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonNature.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2015, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use in Meson build plug-in + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +import org.eclipse.cdt.core.build.CBuilder; +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IProjectNature; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; + +public class MesonNature implements IProjectNature { + + public static final String ID = Activator.getPluginId() + ".mesonNature"; //$NON-NLS-1$ + + private IProject project; + + public static void setupBuilder(IProjectDescription projDesc) throws CoreException { + ICommand command = projDesc.newCommand(); + CBuilder.setupBuilder(command); + projDesc.setBuildSpec(new ICommand[] { command }); + } + + @Override + public void configure() throws CoreException { + IProjectDescription projDesc = project.getDescription(); + setupBuilder(projDesc); + project.setDescription(projDesc, new NullProgressMonitor()); + } + + @Override + public void deconfigure() throws CoreException { + } + + @Override + public IProject getProject() { + return project; + } + + @Override + public void setProject(IProject project) { + this.project = project; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonProjectGenerator.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonProjectGenerator.java new file mode 100644 index 00000000000..0de802b9df7 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonProjectGenerator.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2015, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CProjectNature; +import org.eclipse.cdt.core.build.CBuilder; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.IPathEntry; +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.tools.templates.freemarker.FMProjectGenerator; +import org.eclipse.tools.templates.freemarker.SourceRoot; +import org.eclipse.tools.templates.freemarker.TemplateManifest; +import org.osgi.framework.Bundle; + +public class MesonProjectGenerator extends FMProjectGenerator { + + public MesonProjectGenerator(String manifestFile) { + super(manifestFile); + } + + @Override + protected void initProjectDescription(IProjectDescription description) { + description + .setNatureIds( + new String[] { CProjectNature.C_NATURE_ID, CCProjectNature.CC_NATURE_ID, MesonNature.ID }); + ICommand command = description.newCommand(); + CBuilder.setupBuilder(command); + description.setBuildSpec(new ICommand[] { command }); + } + + @Override + public Bundle getSourceBundle() { + return Activator.getDefault().getBundle(); + } + + @Override + public void generate(Map<String, Object> model, IProgressMonitor monitor) throws CoreException { + super.generate(model, monitor); + + List<IPathEntry> entries = new ArrayList<>(); + IProject project = getProject(); + + // Create the source and output folders + IFolder buildFolder = getProject().getFolder("build"); //$NON-NLS-1$ + + TemplateManifest manifest = getManifest(); + if (manifest != null) { + List<SourceRoot> srcRoots = getManifest().getSrcRoots(); + if (srcRoots != null && !srcRoots.isEmpty()) { + for (SourceRoot srcRoot : srcRoots) { + IFolder sourceFolder = project.getFolder(srcRoot.getDir()); + if (!sourceFolder.exists()) { + sourceFolder.create(true, true, monitor); + } + + entries.add(CoreModel.newSourceEntry(sourceFolder.getFullPath(), + new IPath[] { buildFolder.getFullPath() })); + } + } else { + entries.add(CoreModel.newSourceEntry(getProject().getFullPath())); + } + } + + entries.add(CoreModel.newOutputEntry(buildFolder.getFullPath(), // $NON-NLS-1$ + new IPath[] {})); //$NON-NLS-1$ + CoreModel.getDefault().create(project).setRawPathEntries(entries.toArray(new IPathEntry[entries.size()]), + monitor); + } + +} diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonToolChainEvent.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonToolChainEvent.java new file mode 100644 index 00000000000..f61fb06952c --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/meson/core/MesonToolChainEvent.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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 + * + * Red Hat Inc. - modified for use with Meson builder + *******************************************************************************/ +package org.eclipse.cdt.meson.core; + +/** + * Event occured with Meson ToolChain Files, either added or removed. + */ +public class MesonToolChainEvent { + + /** + * ToolChain file has been added. + */ + public static final int ADDED = 1; + + /** + * ToolChain File has been removed. + */ + public static final int REMOVED = 2; + + private final int type; + private final IMesonToolChainFile toolChainFile; + + public MesonToolChainEvent(int type, IMesonToolChainFile toolChainFile) { + this.type = type; + this.toolChainFile = toolChainFile; + } + + public int getType() { + return type; + } + + public IMesonToolChainFile getToolChainFile() { + return toolChainFile; + } + +} diff --git a/build/org.eclipse.cdt.meson.core/templates/simple/main.c b/build/org.eclipse.cdt.meson.core/templates/simple/main.c new file mode 100644 index 00000000000..ad585992199 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/templates/simple/main.c @@ -0,0 +1,7 @@ +// Simple Hello World program +#include <stdio.h> + +int main(int argc, char **argv) { + printf("Hello World\n"); + return 0; +} diff --git a/build/org.eclipse.cdt.meson.core/templates/simple/manifest.xml b/build/org.eclipse.cdt.meson.core/templates/simple/manifest.xml new file mode 100644 index 00000000000..3f92ad4be56 --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/templates/simple/manifest.xml @@ -0,0 +1,7 @@ +<templateManifest> + <file src="/templates/simple/meson.build" + dest="/${projectName}/meson.build"/> + <file src="/templates/simple/main.c" + dest="/${projectName}/${projectName}.c" + open="true"/> +</templateManifest>
\ No newline at end of file diff --git a/build/org.eclipse.cdt.meson.core/templates/simple/meson.build b/build/org.eclipse.cdt.meson.core/templates/simple/meson.build new file mode 100644 index 00000000000..1b87da012ba --- /dev/null +++ b/build/org.eclipse.cdt.meson.core/templates/simple/meson.build @@ -0,0 +1,3 @@ +project('${projectName}', 'c') +executable('${projectName}', '${projectName}.c') + diff --git a/build/org.eclipse.cdt.meson.ui/.classpath b/build/org.eclipse.cdt.meson.ui/.classpath new file mode 100644 index 00000000000..eca7bdba8f0 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/build/org.eclipse.cdt.meson.ui/.project b/build/org.eclipse.cdt.meson.ui/.project new file mode 100644 index 00000000000..e70361cee48 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.cdt.meson.ui</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/build/org.eclipse.cdt.meson.ui/.settings/org.eclipse.jdt.core.prefs b/build/org.eclipse.cdt.meson.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..0c68a61dca8 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/build/org.eclipse.cdt.meson.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.meson.ui/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e337680fd8d --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.cdt.meson.ui;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: %vendorName +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-Activator: org.eclipse.cdt.meson.ui.Activator +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.13.0", + org.eclipse.ui;bundle-version="3.109.0", + org.eclipse.cdt.meson.core;bundle-version="1.0.0", + org.eclipse.tools.templates.core;bundle-version="1.1.0", + org.eclipse.tools.templates.ui;bundle-version="1.1.1", + org.eclipse.ui.ide;bundle-version="3.13.1", + org.eclipse.tools.templates.freemarker;bundle-version="1.0.0", + org.eclipse.cdt.core;bundle-version="6.4.0", + org.eclipse.core.resources;bundle-version="3.12.0", + org.eclipse.debug.core;bundle-version="3.11.0", + org.eclipse.cdt.launch;bundle-version="9.2.0", + org.eclipse.debug.ui;bundle-version="3.12.50" diff --git a/build/org.eclipse.cdt.meson.ui/about.html b/build/org.eclipse.cdt.meson.ui/about.html new file mode 100644 index 00000000000..545079e3510 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/about.html @@ -0,0 +1,26 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>About</title></head> + +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>June 22, 2007</p> +<h3>License</h3> + +<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. +For purposes of the EPL, "Program" will mean the Content.</p> + +<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p> + +<p>The file: icons/meson-logo.png is made available under the Apache Software License 2.0 +(available at http://www.apache.org/licenses/LICENSE-2.0). +</body></html> diff --git a/build/org.eclipse.cdt.meson.ui/build.properties b/build/org.eclipse.cdt.meson.ui/build.properties new file mode 100644 index 00000000000..d3ac1d69326 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/build.properties @@ -0,0 +1,8 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + icons/,\ + plugin.xml,\ + plugin.properties,\ + about.html diff --git a/build/org.eclipse.cdt.meson.ui/icons/meson-logo.png b/build/org.eclipse.cdt.meson.ui/icons/meson-logo.png Binary files differnew file mode 100644 index 00000000000..d43109bd34d --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/icons/meson-logo.png diff --git a/build/org.eclipse.cdt.meson.ui/plugin.properties b/build/org.eclipse.cdt.meson.ui/plugin.properties new file mode 100644 index 00000000000..2987c590423 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/plugin.properties @@ -0,0 +1,9 @@ +############################################################################### +# Copyright (c) 2018 Red Hat Inc. and others +# 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 +############################################################################### + +meson.preferences.name = Meson diff --git a/build/org.eclipse.cdt.meson.ui/plugin.xml b/build/org.eclipse.cdt.meson.ui/plugin.xml new file mode 100644 index 00000000000..e9ea3f91911 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/plugin.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.4"?> +<plugin> + <extension + point="org.eclipse.ui.propertyPages"> + <page + class="org.eclipse.cdt.meson.ui.properties.MesonPropertyPage" + id="org.eclipse.cdt.meson.ui.properties.mesonPropertyPage" + name="Meson"> + <enabledWhen> + <and> + <instanceof + value="org.eclipse.core.resources.IProject"> + </instanceof> + <test + property="org.eclipse.core.resources.projectNature" + value="org.eclipse.cdt.meson.core.mesonNature"> + </test> + </and> + </enabledWhen> + </page> + </extension> + <extension + point="org.eclipse.ui.preferencePages"> + <page + category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage" + class="org.eclipse.cdt.internal.meson.ui.MesonPreferencePage" + id="org.eclipse.cdt.meson.ui.page1" + name="%meson.preferences.name"> + </page> + </extension> + <extension + point="org.eclipse.tools.templates.ui.templates"> + <tag + id="org.eclipse.cdt.meson.ui.tag" + label="Meson"> + </tag> + <template + icon="icons/meson-logo.png" + id="org.eclipse.cdt.meson.ui.newProjectTemplate" + label="Meson Project" + wizard="org.eclipse.cdt.internal.meson.ui.NewMesonProjectWizard"> + <description> + A Meson project with a Hello World executable to get started. + </description> + <tagReference + id="org.eclipse.cdt.ui.cdtTag"> + </tagReference> + <tagReference + id="org.eclipse.cdt.meson.ui.tag"> + </tagReference> + </template> + <template + icon="icons/meson-logo.png" + id="org.eclipse.cdt.meson.ui.emptyProjectTemplate" + label="Empty or Existing Meson Project" + wizard="org.eclipse.cdt.internal.meson.ui.EmptyMesonProjectWizard"> + <description> + Create a Meson project with no files. Can be used to create one over existing content. + </description> + <tagReference + id="org.eclipse.cdt.ui.cdtTag"> + </tagReference> + <tagReference + id="org.eclipse.cdt.meson.ui.tag"> + </tagReference> + </template> + </extension> + <extension + point="org.eclipse.cdt.launch.coreBuildTab"> + <provider + nature="org.eclipse.cdt.meson.core.mesonNature" + priority="10" + tabClass="org.eclipse.cdt.internal.meson.ui.MesonBuildTab"> + </provider> + </extension> + +</plugin> diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/EmptyMesonProjectWizard.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/EmptyMesonProjectWizard.java new file mode 100644 index 00000000000..59abd0f8ad7 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/EmptyMesonProjectWizard.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import org.eclipse.cdt.meson.core.MesonProjectGenerator; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.tools.templates.core.IGenerator; +import org.eclipse.tools.templates.ui.TemplateWizard; +import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; + +public class EmptyMesonProjectWizard extends TemplateWizard { + + private WizardNewProjectCreationPage mainPage; + + @Override + public void addPages() { + mainPage = new WizardNewProjectCreationPage("basicNewProjectPage") { //$NON-NLS-1$ + @Override + public void createControl(Composite parent) { + super.createControl(parent); + createWorkingSetGroup((Composite) getControl(), getSelection(), + new String[] { "org.eclipse.ui.resourceWorkingSetPage" }); //$NON-NLS-1$ + Dialog.applyDialogFont(getControl()); + } + }; + mainPage.setTitle("New Meson Project"); //$NON-NLS-1$ + mainPage.setDescription("Specify properties of new Meson project."); //$NON-NLS-1$ + this.addPage(mainPage); + } + + @Override + protected IGenerator getGenerator() { + MesonProjectGenerator generator = new MesonProjectGenerator(null); + generator.setProjectName(mainPage.getProjectName()); + if (!mainPage.useDefaults()) { + generator.setLocationURI(mainPage.getLocationURI()); + } + return generator; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonBuildTab.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonBuildTab.java new file mode 100644 index 00000000000..4470a62f095 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonBuildTab.java @@ -0,0 +1,237 @@ +/******************************************************************************* + * Copyright (c) 2017, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import java.util.Map; + +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.internal.meson.core.MesonBuildConfigurationProvider; +import org.eclipse.cdt.launch.ui.corebuild.CommonBuildTab; +import org.eclipse.cdt.meson.core.IMesonConstants; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class MesonBuildTab extends CommonBuildTab { + + private Button unixGenButton; + private Button ninjaGenButton; + private Text mesonArgsText; + private Text buildCommandText; + private Text cleanCommandText; + + @Override + protected String getBuildConfigProviderId() { + return MesonBuildConfigurationProvider.ID; + } + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + comp.setLayout(new GridLayout()); + setControl(comp); + + Control tcControl = createToolchainSelector(comp); + tcControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + + Group mesonGroup = new Group(comp, SWT.NONE); + mesonGroup.setText(Messages.MesonBuildTab_Settings); + mesonGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + mesonGroup.setLayout(new GridLayout()); + + Label label = new Label(mesonGroup, SWT.NONE); + label.setText(Messages.MesonBuildTab_Generator); + + Composite genComp = new Composite(mesonGroup, SWT.BORDER); + genComp.setLayout(new GridLayout(2, true)); + + unixGenButton = new Button(genComp, SWT.RADIO); + unixGenButton.setText(Messages.MesonBuildTab_UnixMakefiles); + unixGenButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + updateLaunchConfigurationDialog(); + } + }); + + ninjaGenButton = new Button(genComp, SWT.RADIO); + ninjaGenButton.setText(Messages.MesonBuildTab_Ninja); + ninjaGenButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + updateLaunchConfigurationDialog(); + } + }); + + label = new Label(mesonGroup, SWT.NONE); + label.setText(Messages.MesonBuildTab_MesonArgs); + + mesonArgsText = new Text(mesonGroup, SWT.BORDER); + mesonArgsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + mesonArgsText.addModifyListener(e -> updateLaunchConfigurationDialog()); + + label = new Label(mesonGroup, SWT.NONE); + label.setText(Messages.MesonBuildTab_BuildCommand); + + buildCommandText = new Text(mesonGroup, SWT.BORDER); + buildCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + buildCommandText.addModifyListener(e -> updateLaunchConfigurationDialog()); + + label = new Label(mesonGroup, SWT.NONE); + label.setText(Messages.MesonBuildTab_CleanCommand); + + cleanCommandText = new Text(mesonGroup, SWT.BORDER); + cleanCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + cleanCommandText.addModifyListener(e -> updateLaunchConfigurationDialog()); + } + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + // TODO + } + + @Override + public void initializeFrom(ILaunchConfiguration configuration) { + super.initializeFrom(configuration); + + ICBuildConfiguration buildConfig = getBuildConfiguration(); + + String generator = buildConfig.getProperty(IMesonConstants.MESON_GENERATOR); + updateGeneratorButtons(generator); + + String mesonArgs = buildConfig.getProperty(IMesonConstants.MESON_ARGUMENTS); + if (mesonArgs != null) { + mesonArgsText.setText(mesonArgs); + } else { + mesonArgsText.setText(""); //$NON-NLS-1$ + } + + String buildCommand = buildConfig.getProperty(IMesonConstants.BUILD_COMMAND); + if (buildCommand != null) { + buildCommandText.setText(buildCommand); + } else { + buildCommandText.setText(""); //$NON-NLS-1$ + } + + String cleanCommand = buildConfig.getProperty(IMesonConstants.CLEAN_COMMAND); + if (cleanCommand != null) { + cleanCommandText.setText(buildCommand); + } else { + cleanCommandText.setText(""); //$NON-NLS-1$ + } + } + + private void updateGeneratorButtons(String generator) { + if (generator == null || generator.equals("Ninja")) { //$NON-NLS-1$ + ninjaGenButton.setSelection(true); + } else { + unixGenButton.setSelection(true); + } + } + + @Override + public void performApply(ILaunchConfigurationWorkingCopy configuration) { + super.performApply(configuration); + + ICBuildConfiguration buildConfig = getBuildConfiguration(); + + buildConfig.setProperty(IMesonConstants.MESON_GENERATOR, + ninjaGenButton.getSelection() ? "Ninja" : "Unix Makefiles"); //$NON-NLS-1$ //$NON-NLS-2$ + + String mesonArgs = mesonArgsText.getText().trim(); + if (!mesonArgs.isEmpty()) { + buildConfig.setProperty(IMesonConstants.MESON_ARGUMENTS, mesonArgs); + } else { + buildConfig.removeProperty(IMesonConstants.MESON_ARGUMENTS); + } + + String buildCommand = buildCommandText.getText().trim(); + if (!buildCommand.isEmpty()) { + buildConfig.setProperty(IMesonConstants.BUILD_COMMAND, buildCommand); + } else { + buildConfig.removeProperty(IMesonConstants.BUILD_COMMAND); + } + + String cleanCommand = cleanCommandText.getText().trim(); + if (!cleanCommand.isEmpty()) { + buildConfig.setProperty(IMesonConstants.CLEAN_COMMAND, cleanCommand); + } else { + buildConfig.removeProperty(IMesonConstants.CLEAN_COMMAND); + } + } + + @Override + protected void saveProperties(Map<String, String> properties) { + super.saveProperties(properties); + properties.put(IMesonConstants.MESON_GENERATOR, + ninjaGenButton.getSelection() ? "Ninja" : "Unix Makefiles"); //$NON-NLS-1$ //$NON-NLS-2$ + + properties.put(IMesonConstants.MESON_ARGUMENTS, mesonArgsText.getText().trim()); + properties.put(IMesonConstants.BUILD_COMMAND, buildCommandText.getText().trim()); + properties.put(IMesonConstants.CLEAN_COMMAND, cleanCommandText.getText().trim()); + } + + @Override + protected void restoreProperties(Map<String, String> properties) { + super.restoreProperties(properties); + + String gen = properties.get(IMesonConstants.MESON_GENERATOR); + if (gen != null) { + switch (gen) { + case "Ninja": //$NON-NLS-1$ + ninjaGenButton.setSelection(true); + unixGenButton.setSelection(false); + break; + case "Unix Makefiles": //$NON-NLS-1$ + ninjaGenButton.setSelection(false); + unixGenButton.setSelection(true); + break; + } + } + + String mesonArgs = properties.get(IMesonConstants.MESON_ARGUMENTS); + if (mesonArgs != null) { + mesonArgsText.setText(mesonArgs); + } else { + mesonArgsText.setText(""); //$NON-NLS-1$ + } + + String buildCmd = properties.get(IMesonConstants.BUILD_COMMAND); + if (buildCmd != null) { + buildCommandText.setText(buildCmd); + } else { + buildCommandText.setText(""); //$NON-NLS-1$ + } + + String cleanCmd = properties.get(IMesonConstants.CLEAN_COMMAND); + if (cleanCmd != null) { + cleanCommandText.setText(cleanCmd); + } else { + cleanCommandText.setText(""); //$NON-NLS-1$ + } + } + + @Override + public String getName() { + return Messages.MesonBuildTab_Meson; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonPreferencePage.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonPreferencePage.java new file mode 100644 index 00000000000..487dc326e47 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/MesonPreferencePage.java @@ -0,0 +1,196 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.cdt.meson.core.IMesonToolChainManager; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Group; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +public class MesonPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { + + private IMesonToolChainManager manager; + private Table filesTable; + private Button removeButton; + + private Map<Path, IMesonToolChainFile> filesToAdd = new HashMap<>(); + private Map<Path, IMesonToolChainFile> filesToRemove = new HashMap<>(); + + @Override + public void init(IWorkbench workbench) { + manager = Activator.getService(IMesonToolChainManager.class); + } + + @Override + protected Control createContents(Composite parent) { + Composite control = new Composite(parent, SWT.NONE); + control.setLayout(new GridLayout()); + + Group filesGroup = new Group(control, SWT.NONE); + filesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + filesGroup.setText(Messages.MesonPreferencePage_Files); + filesGroup.setLayout(new GridLayout(2, false)); + + Composite filesComp = new Composite(filesGroup, SWT.NONE); + filesComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + filesTable = new Table(filesComp, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION); + filesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + filesTable.setHeaderVisible(true); + filesTable.setLinesVisible(true); + filesTable.addListener(SWT.Selection, e -> { + TableItem[] items = filesTable.getSelection(); + removeButton.setEnabled(items.length > 0); + }); + + TableColumn pathColumn = new TableColumn(filesTable, SWT.NONE); + pathColumn.setText(Messages.MesonPreferencePage_Path); + + TableColumn tcColumn = new TableColumn(filesTable, SWT.NONE); + tcColumn.setText(Messages.MesonPreferencePage_Toolchain); + + TableColumnLayout tableLayout = new TableColumnLayout(); + tableLayout.setColumnData(pathColumn, new ColumnWeightData(50, 350, true)); + tableLayout.setColumnData(tcColumn, new ColumnWeightData(50, 350, true)); + filesComp.setLayout(tableLayout); + + Composite buttonsComp = new Composite(filesGroup, SWT.NONE); + buttonsComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); + buttonsComp.setLayout(new GridLayout()); + + Button addButton = new Button(buttonsComp, SWT.PUSH); + addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); + addButton.setText(Messages.MesonPreferencePage_Add); + addButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + NewMesonToolChainFileWizard wizard = new NewMesonToolChainFileWizard(); + WizardDialog dialog = new WizardDialog(getShell(), wizard); + if (dialog.open() == Window.OK) { + IMesonToolChainFile file = wizard.getNewFile(); + if (filesToRemove.containsKey(file.getPath())) { + filesToRemove.remove(file.getPath()); + } else { + filesToAdd.put(file.getPath(), file); + } + updateTable(); + } + } + }); + + removeButton = new Button(buttonsComp, SWT.PUSH); + removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); + removeButton.setText(Messages.MesonPreferencePage_Remove); + removeButton.setEnabled(false); + removeButton.addListener(SWT.Selection, e -> { + if (MessageDialog.openConfirm(getShell(), Messages.MesonPreferencePage_ConfirmRemoveTitle, + Messages.MesonPreferencePage_ConfirmRemoveDesc)) { + for (TableItem item : filesTable.getSelection()) { + IMesonToolChainFile file = (IMesonToolChainFile) item.getData(); + if (filesToAdd.containsKey(file.getPath())) { + filesToAdd.remove(file.getPath()); + } else { + filesToRemove.put(file.getPath(), file); + } + updateTable(); + } + } + }); + + updateTable(); + + return control; + } + + private void updateTable() { + List<IMesonToolChainFile> sorted = new ArrayList<>(getFiles().values()); + Collections.sort(sorted, (o1, o2) -> o1.getPath().toString().compareToIgnoreCase(o2.getPath().toString())); + + filesTable.removeAll(); + for (IMesonToolChainFile file : sorted) { + TableItem item = new TableItem(filesTable, SWT.NONE); + item.setText(0, file.getPath().toString()); + + try { + IToolChain tc = file.getToolChain(); + if (tc != null) { + item.setText(1, tc.getName()); + } + } catch (CoreException e) { + Activator.log(e.getStatus()); + } + + item.setData(file); + } + } + + private Map<Path, IMesonToolChainFile> getFiles() { + Map<Path, IMesonToolChainFile> files = new HashMap<>(); + for (IMesonToolChainFile file : manager.getToolChainFiles()) { + files.put(file.getPath(), file); + } + + for (IMesonToolChainFile file : filesToAdd.values()) { + files.put(file.getPath(), file); + } + + for (IMesonToolChainFile file : filesToRemove.values()) { + files.remove(file.getPath()); + } + + return files; + } + + @Override + public boolean performOk() { + for (IMesonToolChainFile file : filesToAdd.values()) { + manager.addToolChainFile(file); + } + + for (IMesonToolChainFile file : filesToRemove.values()) { + manager.removeToolChainFile(file); + } + + filesToAdd.clear(); + filesToRemove.clear(); + + return true; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/Messages.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/Messages.java new file mode 100644 index 00000000000..92099b16775 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/Messages.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + + public static String MesonBuildTab_BuildCommand; + public static String MesonBuildTab_CleanCommand; + public static String MesonBuildTab_Meson; + public static String MesonBuildTab_MesonArgs; + public static String MesonBuildTab_Generator; + public static String MesonBuildTab_Ninja; + public static String MesonBuildTab_NoneAvailable; + public static String MesonBuildTab_Settings; + public static String MesonBuildTab_Toolchain; + public static String MesonBuildTab_UnixMakefiles; + public static String MesonPreferencePage_Add; + public static String MesonPreferencePage_ConfirmRemoveDesc; + public static String MesonPreferencePage_ConfirmRemoveTitle; + public static String MesonPreferencePage_Files; + public static String MesonPreferencePage_Path; + public static String MesonPreferencePage_Remove; + public static String MesonPreferencePage_Toolchain; + public static String MesonPropertyPage_FailedToStartMesonGui_Body; + public static String MesonPropertyPage_FailedToStartMesonGui_Title; + public static String MesonPropertyPage_LaunchMesonGui; + + + public static String NewMesonProjectWizard_Description; + public static String NewMesonProjectWizard_PageTitle; + public static String NewMesonProjectWizard_WindowTitle; + + public static String NewMesonToolChainFilePage_Browse; + public static String NewMesonToolChainFilePage_NoPath; + public static String NewMesonToolChainFilePage_Path; + public static String NewMesonToolChainFilePage_Select; + public static String NewMesonToolChainFilePage_Title; + public static String NewMesonToolChainFilePage_Toolchain; + + + static { + // initialize resource bundle + NLS.initializeMessages("org.eclipse.cdt.internal.meson.ui.messages", Messages.class); //$NON-NLS-1$ + } + + private Messages() { + } +} + diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonProjectWizard.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonProjectWizard.java new file mode 100644 index 00000000000..772d6af7392 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonProjectWizard.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import org.eclipse.cdt.meson.core.MesonProjectGenerator; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.tools.templates.core.IGenerator; +import org.eclipse.tools.templates.ui.TemplateWizard; +import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; + +public class NewMesonProjectWizard extends TemplateWizard { + + private WizardNewProjectCreationPage mainPage; + + @Override + public void setContainer(IWizardContainer wizardContainer) { + super.setContainer(wizardContainer); + setWindowTitle(Messages.NewMesonProjectWizard_WindowTitle); + } + + @Override + public void addPages() { + mainPage = new WizardNewProjectCreationPage("basicNewProjectPage") { //$NON-NLS-1$ + @Override + public void createControl(Composite parent) { + super.createControl(parent); + createWorkingSetGroup((Composite) getControl(), getSelection(), + new String[] { "org.eclipse.ui.resourceWorkingSetPage" }); //$NON-NLS-1$ + Dialog.applyDialogFont(getControl()); + } + }; + mainPage.setTitle(Messages.NewMesonProjectWizard_PageTitle); + mainPage.setDescription(Messages.NewMesonProjectWizard_Description); + this.addPage(mainPage); + } + + @Override + protected IGenerator getGenerator() { + MesonProjectGenerator generator = new MesonProjectGenerator("templates/simple/manifest.xml"); //$NON-NLS-1$ + generator.setProjectName(mainPage.getProjectName()); + if (!mainPage.useDefaults()) { + generator.setLocationURI(mainPage.getLocationURI()); + } + return generator; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFilePage.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFilePage.java new file mode 100644 index 00000000000..89d02ca1fd8 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFilePage.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import java.nio.file.Paths; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.cdt.meson.core.IMesonToolChainManager; +import org.eclipse.cdt.meson.core.Activator; +import org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class NewMesonToolChainFilePage extends WizardPage { + + private Text pathText; + private Combo tcCombo; + + private IToolChain[] toolchains; + + public NewMesonToolChainFilePage() { + super("NewMesonToolChainFilePage", Messages.NewMesonToolChainFilePage_Title, null); //$NON-NLS-1$ + } + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + comp.setLayout(new GridLayout(2, false)); + + Label pathLabel = new Label(comp, SWT.NONE); + pathLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + pathLabel.setText(Messages.NewMesonToolChainFilePage_Path); + + Composite pathComp = new Composite(comp, SWT.NONE); + pathComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + GridLayout layout = new GridLayout(2, false); + layout.marginHeight = layout.marginWidth = 0; + pathComp.setLayout(layout); + + pathText = new Text(pathComp, SWT.BORDER); + pathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + pathText.addModifyListener(e -> validate()); + + Button pathButton = new Button(pathComp, SWT.PUSH); + pathButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); + pathButton.setText(Messages.NewMesonToolChainFilePage_Browse); + pathButton.addListener(SWT.Selection, e -> { + FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); + dialog.setText(Messages.NewMesonToolChainFilePage_Select); + String path = dialog.open(); + if (path != null) { + pathText.setText(path); + } + }); + + Label tcLabel = new Label(comp, SWT.NONE); + tcLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + tcLabel.setText(Messages.NewMesonToolChainFilePage_Toolchain); + + tcCombo = new Combo(comp, SWT.READ_ONLY); + tcCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + try { + IToolChainManager tcManager = Activator.getService(IToolChainManager.class); + toolchains = tcManager.getAllToolChains().toArray(new IToolChain[0]); + for (IToolChain tc : toolchains) { + tcCombo.add(tc.getName()); + } + tcCombo.select(0); + } catch (CoreException e) { + Activator.log(e.getStatus()); + } + + setControl(comp); + validate(); + } + + private void validate() { + setPageComplete(false); + + String path = pathText.getText(); + if (path.isEmpty()) { + setErrorMessage(Messages.NewMesonToolChainFilePage_NoPath); + return; + } + + setPageComplete(true); + setErrorMessage(null); + } + + public IMesonToolChainFile getNewFile() { + IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class); + IMesonToolChainFile file = manager.newToolChainFile(Paths.get(pathText.getText())); + + IToolChain tc = toolchains[tcCombo.getSelectionIndex()]; + file.setProperty(MesonBuildConfiguration.TOOLCHAIN_TYPE, tc.getTypeId()); + file.setProperty(MesonBuildConfiguration.TOOLCHAIN_ID, tc.getId()); + + return file; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFileWizard.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFileWizard.java new file mode 100644 index 00000000000..d8294d16834 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/NewMesonToolChainFileWizard.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2016, 2018 QNX Software Systems and others. + * 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. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.internal.meson.ui; + +import org.eclipse.cdt.meson.core.IMesonToolChainFile; +import org.eclipse.jface.wizard.Wizard; + +public class NewMesonToolChainFileWizard extends Wizard { + + private IMesonToolChainFile newFile; + private NewMesonToolChainFilePage page; + + @Override + public void addPages() { + page = new NewMesonToolChainFilePage(); + addPage(page); + } + + @Override + public boolean performFinish() { + newFile = page.getNewFile(); + return true; + } + + public IMesonToolChainFile getNewFile() { + return newFile; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/messages.properties b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/messages.properties new file mode 100644 index 00000000000..fd9488c4a57 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/internal/meson/ui/messages.properties @@ -0,0 +1,39 @@ +################################################################################ +# Copyright (c) 2018 Red Hat Inc. and others. +# 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 implementation +################################################################################ +MesonBuildTab_BuildCommand=Build command +MesonBuildTab_CleanCommand=Clean command +MesonBuildTab_Meson=Meson +MesonBuildTab_MesonArgs=Additional Meson arguments: +MesonBuildTab_Generator=Generator +MesonBuildTab_Ninja=Ninja +MesonBuildTab_NoneAvailable=No Toolchains Available for this Target +MesonBuildTab_Settings=Meson Settings +MesonBuildTab_Toolchain=Toolchain +MesonBuildTab_UnixMakefiles=Unix Makefiles +MesonPreferencePage_Add=Add... +MesonPreferencePage_ConfirmRemoveDesc=Do you wish to deregister the selected files? +MesonPreferencePage_ConfirmRemoveTitle=Deregister Meson ToolChain File +MesonPreferencePage_Files=Toolchain Files +MesonPreferencePage_Path=Toolchain File +MesonPreferencePage_Remove=Remove +MesonPreferencePage_Toolchain=Toolchain +MesonPropertyPage_FailedToStartMesonGui_Body=Failed to run the Meson GUI: +MesonPropertyPage_FailedToStartMesonGui_Title=Failed to run Meson GUI +MesonPropertyPage_LaunchMesonGui=Launch Meson GUI... +NewMesonProjectWizard_Description=Specify properties of new Meson project. +NewMesonProjectWizard_PageTitle=New Meson Project +NewMesonProjectWizard_WindowTitle=New Meson Project +NewMesonToolChainFilePage_Browse=Browse... +NewMesonToolChainFilePage_NoPath=Please set the path to the Meson toolchain file. +NewMesonToolChainFilePage_Path=Path: +NewMesonToolChainFilePage_Select=Select location for Meson toolchain file +NewMesonToolChainFilePage_Title=New Meson ToolChain File +NewMesonToolChainFilePage_Toolchain=Toolchain: diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/Activator.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/Activator.java new file mode 100644 index 00000000000..304e9138ebf --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/Activator.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; + +public class Activator extends AbstractUIPlugin { + + private static Activator plugin; + public static final String PLUGIN_ID = "org.eclipse.cdt.meson.ui"; //$NON-NLS-1$ + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + @Override + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + public static Activator getPlugin() { + return plugin; + } + + public static IStatus errorStatus(String message, Throwable cause) { + return new Status(IStatus.ERROR, PLUGIN_ID, message, cause); + } + + public static void log(IStatus status) { + plugin.getLog().log(status); + } + + public static void log(Exception e) { + if (e instanceof CoreException) { + log(((CoreException) e).getStatus()); + } else { + plugin.getLog().log(errorStatus(e.getLocalizedMessage(), e)); + } + } + + public static <T> T getService(Class<T> service) { + if (plugin != null) { + BundleContext context = plugin.getBundle().getBundleContext(); + ServiceReference<T> ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } + return null; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/IMesonPropertyPageControl.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/IMesonPropertyPageControl.java new file mode 100644 index 00000000000..df3b3ab6358 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/IMesonPropertyPageControl.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +public interface IMesonPropertyPageControl { + + /** + * Get the value of the field + * @return field value + */ + String getFieldValue(); + + /** + * Get the name of the field to set for meson command + * @return field name + */ + String getFieldName(); + + /** + * Has the initial value changed + * @return + */ + boolean isValueChanged(); + + /** + * Is this field valid? + * @return + */ + boolean isValid(); + + /** + * Get the command line parameter if already configured + * @return String containing command-line for configured build dir + */ + public default String getConfiguredString() { + return "-D" + getFieldName() + "=" + getFieldValue(); //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * Get the command line parameter if never configured + * @return String containing command-line parm for configured build dir + */ + public default String getUnconfiguredString() { + // TODO Auto-generated method stub + return "--" + getFieldName() + "=" + getFieldValue(); //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * Get any error message for the control + * @return error message + */ + String getErrorMessage(); + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyArgs.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyArgs.java new file mode 100644 index 00000000000..cc18dc9648e --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyArgs.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.swt.widgets.Composite; + +public class MesonPropertyArgs extends MesonPropertyText { + + public MesonPropertyArgs(Composite composite, String name, String initialValue, String tooltip) { + super(composite, name, initialValue, tooltip); + } + + @Override + public String getConfiguredString() { + // TODO Auto-generated method stub + return "-D" + getFieldName() + "='" + getFieldValue() + "'"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCheckbox.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCheckbox.java new file mode 100644 index 00000000000..31d45e07318 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCheckbox.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; + +public class MesonPropertyCheckbox implements IMesonPropertyPageControl { + + private String name; + private boolean initialValue; + protected Button checkbox; + + public MesonPropertyCheckbox(Composite composite, String name, boolean initialValue, String tooltip) { + this.name = name; + this.initialValue = initialValue; + checkbox = new Button(composite, SWT.CHECK); + GridData data = new GridData(GridData.FILL, GridData.FILL, true, false); + data.horizontalSpan = 2; + checkbox.setText(name); + checkbox.setLayoutData(data); + checkbox.setSelection(initialValue); + checkbox.setToolTipText(tooltip); + } + + + + @Override + public String getFieldValue() { + return Boolean.toString(checkbox.getSelection()); + } + + @Override + public String getFieldName() { + return name; + } + + @Override + public boolean isValueChanged() { + return checkbox.getSelection() != initialValue; + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public String getErrorMessage() { + return null; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCombo.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCombo.java new file mode 100644 index 00000000000..a37a3260de1 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyCombo.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +public class MesonPropertyCombo implements IMesonPropertyPageControl { + + private String name; + private String initialValue; + private Combo combo; + + public MesonPropertyCombo(Composite composite, String name, String[] values, String initialValue, String tooltip) { + this.name = name; + this.initialValue = initialValue; + Label label = new Label(composite, SWT.NONE); + label.setText(name); + label.setLayoutData(new GridData()); + combo = new Combo(composite, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY); + GridData data = new GridData(GridData.FILL_BOTH); + data.grabExcessHorizontalSpace = true; + combo.setLayoutData(data); + combo.setItems(values); + combo.setText(initialValue); + combo.setToolTipText(tooltip); + } + + + @Override + public String getFieldValue() { + return combo.getText(); + } + + @Override + public String getFieldName() { + return name; + } + + @Override + public boolean isValueChanged() { + return !combo.getText().equals(initialValue); + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public String getErrorMessage() { + return null; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyInteger.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyInteger.java new file mode 100644 index 00000000000..7b94ab93328 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyInteger.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.widgets.Composite; + +public class MesonPropertyInteger extends MesonPropertyText { + + @SuppressWarnings("unused") + private MesonPropertyPage page; + private String errorMessage; + + public MesonPropertyInteger(Composite composite, MesonPropertyPage page, String name, String initialValue, String tooltip) { + super(composite, name, initialValue, tooltip); + this.page = page; + text.addModifyListener((e) -> { + if (isValid() != page.isValid()) { + page.update(); + } + }); + } + + + @Override + public boolean isValid() { + errorMessage = null; + try { + Integer.parseInt(getFieldValue()); + return true; + } catch (NumberFormatException e) { + errorMessage = NLS.bind(Messages.MesonPropertyPage_not_an_integer, getFieldName()); + } + return false; + } + + @Override + public String getErrorMessage() { + return errorMessage; + } + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyPage.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyPage.java new file mode 100644 index 00000000000..518fa6362bf --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyPage.java @@ -0,0 +1,459 @@ +/******************************************************************************* + * Copyright (c) 2016,2018 IAR Systems AB + * 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: + * IAR Systems - initial API and implementation + * Red Hat Inc. - modified for use in Meson build + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.CommandLauncherManager; +import org.eclipse.cdt.core.ICommandLauncher; +import org.eclipse.cdt.core.build.CBuildConfiguration; +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.core.resources.IConsole; +import org.eclipse.cdt.meson.core.IMesonConstants; +import org.eclipse.cdt.meson.ui.Activator; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Group; +import org.eclipse.ui.dialogs.PropertyPage; + +/** + * Property page for CMake projects. The only thing we have here at the moment is a button + * to launch the CMake GUI configurator (cmake-qt-gui). + * + * We assume that the build directory is in project/build/configname, which is where + * the CMake project wizard puts it. We also assume that "cmake-gui" is in the user's + * PATH. + */ +public class MesonPropertyPage extends PropertyPage { + + private IProject project; + private List<IMesonPropertyPageControl> componentList = new ArrayList<>(); + private boolean configured; + private CBuildConfiguration buildConfig; + + @Override + protected Control createContents(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, true)); + + project = (IProject) getElement(); + String configName; + try { + buildConfig = ((CBuildConfiguration)project.getActiveBuildConfig().getAdapter(ICBuildConfiguration.class)); + configName = ((CBuildConfiguration)project.getActiveBuildConfig().getAdapter(ICBuildConfiguration.class)).getName(); + IPath sourceDir = project.getLocation(); + String buildDir = project.getLocation().append("build").append(configName).toOSString(); //$NON-NLS-1$ + IPath buildPath = new Path(buildDir).append("build.ninja"); //$NON-NLS-1$ + configured = buildPath.toFile().exists(); + if (configured) { + + ICommandLauncher launcher = CommandLauncherManager.getInstance().getCommandLauncher(project.getActiveBuildConfig().getAdapter(ICBuildConfiguration.class)); + Process p = launcher.execute(new Path("meson"), new String[] { "configure", buildDir}, new String[0], sourceDir, new NullProgressMonitor()); + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + ByteArrayOutputStream stderr = new ByteArrayOutputStream(); + int rc = -1; + try { + if (launcher.waitAndRead(stdout, stderr, new NullProgressMonitor()) == ICommandLauncher.OK) { + p.waitFor(); + } + rc = p.exitValue(); + } catch (InterruptedException e) { + // ignore for now + } + if (rc == 0) { + componentList = parseConfigureOutput(stdout, composite); + } + + } else { + Map<String, String> argMap = new HashMap<>(); + String mesonArgs = buildConfig.getProperty(IMesonConstants.MESON_ARGUMENTS); + if (mesonArgs != null) { + String[] argStrings = mesonArgs.split("\\s+"); + for (String argString : argStrings) { + String[] s = argString.split("="); + if (s.length == 2) { + argMap.put(s[0], s[1]); + } else { + argMap.put(argString, "true"); + } + } + } + + String defaultBuildType = "release"; + if (configName.contains("debug")) { //$NON-NLS-1$ + defaultBuildType = "debug"; //$NON-NLS-1$ + } + componentList = defaultOptions(composite, argMap, defaultBuildType); + } + } catch (CoreException e2) { + // TODO Auto-generated catch block + e2.printStackTrace(); + } + + return composite; + } + + public void update() { + setErrorMessage(null); + for (IMesonPropertyPageControl control : componentList) { + if (!control.isValid()) { + setValid(false); + setErrorMessage(control.getErrorMessage()); + } + } + } + + public enum ParseState { + INIT, GROUP, OPTION, OPTION_WITH_VALUES, ARGS + }; + + @Override + public boolean performOk() { + List<String> args = new ArrayList<>(); + if (configured) { + args.add("configure"); //$NON-NLS-1$ + for (IMesonPropertyPageControl control : componentList) { + if (control.isValueChanged()) { + args.add(control.getConfiguredString()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + if (args.size() == 1) { + return true; + } + try { + String configName = ((CBuildConfiguration)project.getActiveBuildConfig().getAdapter(ICBuildConfiguration.class)).getName(); + IPath sourceDir = project.getLocation(); + String buildDir = project.getLocation().append("build").append(configName).toOSString(); //$NON-NLS-1$ + ICommandLauncher launcher = CommandLauncherManager.getInstance().getCommandLauncher(project.getActiveBuildConfig().getAdapter(ICBuildConfiguration.class)); + args.add(buildDir); + Process p = launcher.execute(new Path("meson"), args.toArray(new String[0]), new String[0], sourceDir, new NullProgressMonitor()); + int rc = -1; + IConsole console = CCorePlugin.getDefault().getConsole(); + console.start(project); + try (OutputStream stdout = console.getOutputStream()) { + OutputStream stderr = stdout; + StringBuilder buf = new StringBuilder(); + buf.append("meson"); + for (String arg : args) { + buf.append(" "); //$NON-NLS-1$ + buf.append(arg); + } + buf.append(System.lineSeparator()); + stdout.write(buf.toString().getBytes()); + stdout.flush(); + try { + + if (launcher.waitAndRead(stdout, stderr, new NullProgressMonitor()) == ICommandLauncher.OK) { + p.waitFor(); + } + rc = p.exitValue(); + stdout.write(NLS.bind(Messages.MesonPropertyPage_terminated_rc, rc).getBytes()); + stdout.flush(); + if (rc != 0) { + Display.getDefault().syncExec(() -> { + MessageDialog.openError(getShell(), null, Messages.MesonPropertyPage_configure_failed); + }); + } + } catch (InterruptedException e) { + // ignore for now + } + } catch (IOException e2) { + Activator.log(e2); + return false; + } + } catch (CoreException e3) { + // TODO Auto-generated catch block + Activator.log(e3); + return false; + } + } else { + StringBuilder mesonargs = new StringBuilder(); + for (IMesonPropertyPageControl control : componentList) { + System.out.println(control.getUnconfiguredString()); + mesonargs.append(control.getUnconfiguredString()); + mesonargs.append(" "); //$NON-NLS-1$ + } + buildConfig.setProperty(IMesonConstants.MESON_ARGUMENTS, mesonargs.toString()); + } + return true; + } + + /** + * Parse output of meson configure call to determine options to show to user + * @param stdout - ByteArrayOutputStream containing output of command + * @param composite - Composite to add Controls to + * @return - list of Controls + */ + List<IMesonPropertyPageControl> parseConfigureOutput(ByteArrayOutputStream stdout, Composite composite) { + List<IMesonPropertyPageControl> controls = new ArrayList<>(); + + try { + String[] lines = stdout.toString(StandardCharsets.UTF_8.name()).split("\\r?\\n"); //$NON-NLS-1$ + ParseState state = ParseState.INIT; + Pattern optionPattern = Pattern.compile(Messages.MesonPropertyPage_option_pattern); + Pattern optionWithValuesPattern = Pattern.compile(Messages.MesonPropertyPage_option_with_values_pattern); + Pattern optionLine = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(.*)$"); //$NON-NLS-1$ + Pattern optionWithValuesLine = Pattern.compile("(\\w+)\\s+(\\w+)\\s+\\[(\\w+)((,\\s+\\w+)*)\\]\\s+(.*)$"); + Pattern compilerOrLinkerArgs = Pattern.compile(Messages.MesonPropertyPage_compiler_or_link_args); + Pattern argLine = Pattern.compile("(\\w+)\\s+\\[([^\\]]*)\\]"); //$NON-NLS-1$ + Pattern groupPattern = Pattern.compile("(([^:]*)):"); //$NON-NLS-1$ + String groupName = ""; //$NON-NLS-1$ + Composite parent = composite; + for (String line : lines) { + line = line.trim(); + switch (state) { + case INIT: + Matcher argMatcher = compilerOrLinkerArgs.matcher(line); + if (argMatcher.matches()) { + state = ParseState.ARGS; + Group group = new Group(composite, SWT.BORDER); + group.setLayout(new GridLayout(2, true)); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + group.setText(argMatcher.group(1)); + parent = group; + } else { + Matcher groupMatcher = groupPattern.matcher(line); + if (groupMatcher.matches()) { + groupName = groupMatcher.group(1); + state = ParseState.GROUP; + } + parent = composite; + } + break; + case GROUP: + Matcher m = optionPattern.matcher(line); + if (m.matches()) { + state = ParseState.OPTION; + Group group = new Group(composite, SWT.BORDER); + group.setLayout(new GridLayout(2, true)); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + group.setText(groupName); + parent = group; + break; + } + m = optionWithValuesPattern.matcher(line); + if (m.matches()) { + state = ParseState.OPTION_WITH_VALUES; + Group group = new Group(composite, SWT.BORDER); + group.setLayout(new GridLayout(2, true)); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + group.setText(groupName); + parent = group; + } + + break; + case ARGS: + Matcher m2 = argLine.matcher(line); + if (m2.matches()) { + String argName = m2.group(1); + String argValue = m2.group(2); + argValue = argValue.replaceAll("',", ""); //$NON-NLS-1$ //$NON-NLS-2$ + argValue = argValue.replaceAll("'", ""); //$NON-NLS-1$ //$NON-NLS-2$ + String argDescription = Messages.MesonPropertyPage_arg_description; + IMesonPropertyPageControl argControl = new MesonPropertyText(parent, argName, argValue, argDescription); + controls.add(argControl); + } + state = ParseState.INIT; + parent = composite; + break; + case OPTION: + Matcher m3 = optionLine.matcher(line); + if (line.startsWith("----")) { //$NON-NLS-1$ + break; + } + if (line.isEmpty()) { + state = ParseState.INIT; + parent = composite; + break; + } + if (m3.matches()) { + String name = m3.group(1); + String value = m3.group(2); + String description = m3.group(3); + boolean isInteger = false; + try { + Integer.parseInt(value); + isInteger = true; + } catch (NumberFormatException e) { + // do nothing + } + if (isInteger) { + IMesonPropertyPageControl control = new MesonPropertyInteger(parent, this, name, value, description); + controls.add(control); + } else if (Messages.MesonPropertyPage_true.equals(value) || + Messages.MesonPropertyPage_false.equals(value)) { + IMesonPropertyPageControl control = new MesonPropertyCheckbox(parent, name, Boolean.getBoolean(value), description); + controls.add(control); + } else { + IMesonPropertyPageControl control = new MesonPropertyText(parent, name, value, description); + controls.add(control); + } + } + break; + case OPTION_WITH_VALUES: + Matcher m4 = optionWithValuesLine.matcher(line); + if (line.startsWith("----")) { //$NON-NLS-1$ + break; + } + if (line.isEmpty()) { + state = ParseState.INIT; + parent = composite; + break; + } + if (m4.matches()) { + String name = m4.group(1); + String value = m4.group(2); + String possibleValue = m4.group(3); + String extraValues = m4.group(4); + String description = m4.group(6); + String[] values = new String[] {possibleValue}; + if (!extraValues.isEmpty()) { + values = extraValues.split(",\\s+"); + values[0] = possibleValue; + } + IMesonPropertyPageControl control = new MesonPropertyCombo(parent, name, values, value, description); + controls.add(control); + } + break; + } + } + } catch (UnsupportedEncodingException e) { + return controls; + } + return controls; + } + + /** + * Create list of options for initial meson call + * @param stdout - ByteArrayOutputStream containing output of command + * @param composite - Composite to add Controls to + * @return - list of Controls + */ + List<IMesonPropertyPageControl> defaultOptions(Composite composite, Map<String, String> argMap, String defaultBuildType) { + List<IMesonPropertyPageControl> controls = new ArrayList<>(); + + Group group = new Group(composite, SWT.BORDER); + group.setLayout(new GridLayout(2, true)); + group.setLayoutData(new GridData(GridData.FILL_BOTH)); + group.setText("Options"); + + IMesonPropertyPageControl prefix = new MesonPropertyText(group, "prefix", argMap.get("--prefix"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_prefix_tooltip); + controls.add(prefix); + IMesonPropertyPageControl libdir = new MesonPropertyText(group, "libdir", argMap.get("--libdir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_libdir_tooltip); + controls.add(libdir); + IMesonPropertyPageControl libexecdir = new MesonPropertyText(group, "libexecdir", argMap.get("--libexecdir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_libexecdir_tooltip); + controls.add(libexecdir); + IMesonPropertyPageControl bindir = new MesonPropertyText(group, "bindir", argMap.get("--bindir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_bindir_tooltip); + controls.add(bindir); + IMesonPropertyPageControl sbindir = new MesonPropertyText(group, "sbindir", argMap.get("--sbindir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_sbindir_tooltip); + controls.add(sbindir); + IMesonPropertyPageControl includedir = new MesonPropertyText(group, "includedir", argMap.get("--includedir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_includedir_tooltip); + controls.add(includedir); + IMesonPropertyPageControl datadir = new MesonPropertyText(group, "datadir", argMap.get("--datadir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_datadir_tooltip); + controls.add(datadir); + IMesonPropertyPageControl mandir = new MesonPropertyText(group, "mandir", argMap.get("--mandir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_mandir_tooltip); + controls.add(mandir); + IMesonPropertyPageControl infodir = new MesonPropertyText(group, "infodir", argMap.get("--infodir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_infodir_tooltip); + controls.add(infodir); + IMesonPropertyPageControl localedir = new MesonPropertyText(group, "localedir", argMap.get("--localedir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_localedir_tooltip); + controls.add(localedir); + IMesonPropertyPageControl sysconfdir = new MesonPropertyText(group, "sysconfdir", argMap.get("--sysconfdir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_sysconfdir_tooltip); + controls.add(sysconfdir); + IMesonPropertyPageControl localstatedir = new MesonPropertyText(group, "localstatedir", argMap.get("--localstatedir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_localstatedir_tooltip); + controls.add(localstatedir); + IMesonPropertyPageControl sharedstatedir = new MesonPropertyText(group, "sharedstatedir", argMap.get("--sharedstatedir"), //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_sharedstatedir_tooltip); + controls.add(sharedstatedir); + IMesonPropertyPageControl buildtype = new MesonPropertyCombo(group, "buildtype", //$NON-NLS-1$ + new String[] {"plain", "debug", "debugoptimized", "release", "minsize"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + argMap.get("--buildtype") != null ? argMap.get("--buildtype") : defaultBuildType, //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_buildtype_tooltip); + controls.add(buildtype); + IMesonPropertyPageControl strip = new MesonPropertySpecialCheckbox(group, "strip", argMap.get("--strip") != null, //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_strip_tooltip); + controls.add(strip); + IMesonPropertyPageControl unity = new MesonPropertyCombo(group, "unity", //$NON-NLS-1$ + new String[] {"on", "off", "subprojects"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + argMap.get("--unity") != null ? argMap.get("--unity") : "off", //$NON-NLS-1$ //$NON-NLS-2$ + Messages.MesonPropertyPage_unity_tooltip); + controls.add(unity); + IMesonPropertyPageControl werror = new MesonPropertySpecialCheckbox(group, "werror", //$NON-NLS-1$ + argMap.get("--werror") != null, Messages.MesonPropertyPage_werror_tooltip); //$NON-NLS-1$ + controls.add(werror); + IMesonPropertyPageControl layout = new MesonPropertyCombo(group, "layout", //$NON-NLS-1$ + new String[] {"mirror", "flat"}, //$NON-NLS-1$ //$NON-NLS-2$ + argMap.get("--mirror") != null ? argMap.get("--mirror") : "mirror", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Messages.MesonPropertyPage_layout_tooltip); + controls.add(layout); + IMesonPropertyPageControl default_library = new MesonPropertyCombo(group, "default-library", //$NON-NLS-1$ + new String[] {"shared", "static"}, //$NON-NLS-1$ //$NON-NLS-2$ + argMap.get("--default-library") != null ? argMap.get("--default-library") : "shared", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Messages.MesonPropertyPage_default_library_tooltip); + controls.add(default_library); + IMesonPropertyPageControl warnlevel = new MesonPropertyCombo(group, "warnlevel", //$NON-NLS-1$ + new String[] {"1","2","3"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + argMap.get("--warnlevel") != null ? argMap.get("--warnlevel") : "1", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Messages.MesonPropertyPage_warnlevel_tooltip); + controls.add(warnlevel); + IMesonPropertyPageControl stdsplit = new MesonPropertySpecialCheckbox(group, "stdsplit", //$NON-NLS-1$ + argMap.get("--stdsplit") != null, Messages.MesonPropertyPage_stdsplit_tooltip); //$NON-NLS-1$ + controls.add(stdsplit); + IMesonPropertyPageControl errorlogs = new MesonPropertySpecialCheckbox(group, "errorlogs", //$NON-NLS-1$ + argMap.get("--errorlogs") != null, Messages.MesonPropertyPage_errorlogs_tooltip); //$NON-NLS-1$ + controls.add(errorlogs); + IMesonPropertyPageControl cross_file = new MesonPropertyText(group, "cross-file", //$NON-NLS-1$ + argMap.get("--cross-file"), Messages.MesonPropertyPage_cross_file_tooltip); //$NON-NLS-1$ + controls.add(cross_file); + IMesonPropertyPageControl wrap_mode = new MesonPropertyCombo(group, "wrap-mode", //$NON-NLS-1$ + new String[] {"default", "nofallback", "nodownload"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + argMap.get("--wrap-mode") != null ? argMap.get("--wrap-mode") : "default", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + Messages.MesonPropertyPage_wrap_mode_tooltip); + controls.add(wrap_mode); + + return controls; + } +}
\ No newline at end of file diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertySpecialCheckbox.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertySpecialCheckbox.java new file mode 100644 index 00000000000..65344066f6e --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertySpecialCheckbox.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.swt.widgets.Composite; + +public class MesonPropertySpecialCheckbox extends MesonPropertyCheckbox { + + public MesonPropertySpecialCheckbox(Composite composite, String name, boolean initialValue, String tooltip) { + super(composite, name, initialValue, tooltip); + } + + @Override + public String getUnconfiguredString() { + if (checkbox.getSelection()) { + return "--" + getFieldName(); //$NON-NLS-1$ + } + return ""; + } + + +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyText.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyText.java new file mode 100644 index 00000000000..49075560644 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/MesonPropertyText.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class MesonPropertyText implements IMesonPropertyPageControl { + + private String name; + private String initialValue; + protected Text text; + + public MesonPropertyText(Composite composite, String name, String initialValue, String tooltip) { + this.name = name; + if (initialValue == null) { + initialValue = ""; //$NON-NLS-1$ + } + this.initialValue = initialValue; + Label label = new Label(composite, SWT.NONE); + label.setText(name); + label.setLayoutData(new GridData()); + text = new Text(composite, SWT.SINGLE | SWT.BORDER); + GridData data = new GridData(GridData.FILL_BOTH); + data.grabExcessHorizontalSpace = true; + text.setLayoutData(data); + text.setText(initialValue); + text.setToolTipText(tooltip); + } + + @Override + public String getFieldValue() { + return text.getText(); + } + + @Override + public String getFieldName() { + return name; + } + + @Override + public boolean isValueChanged() { + return !text.getText().equals(initialValue); + } + + @Override + public boolean isValid() { + return true; + } + + @Override + public String getUnconfiguredString() { + String value = getFieldValue(); + if (value != null && !value.isEmpty()) { + return "--" + getFieldName() + "=" + getFieldValue(); //$NON-NLS-1$ //$NON-NLS-2$ + } + return ""; + } + + @Override + public String getErrorMessage() { + return null; + } +} diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/Messages.java b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/Messages.java new file mode 100644 index 00000000000..7e3ec684443 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/Messages.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat Inc. and others. + * 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 implementation + *******************************************************************************/ +package org.eclipse.cdt.meson.ui.properties; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + + public static String MesonPropertyPage_not_an_integer; + public static String MesonPropertyPage_option_pattern; + public static String MesonPropertyPage_option_with_values_pattern; + public static String MesonPropertyPage_compiler_or_link_args; + public static String MesonPropertyPage_arg_description; + public static String MesonPropertyPage_meson_error; + public static String MesonPropertyPage_configure_failed; + public static String MesonPropertyPage_terminated_rc; + + public static String MesonPropertyPage_prefix_tooltip; + public static String MesonPropertyPage_libdir_tooltip; + public static String MesonPropertyPage_libexecdir_tooltip; + public static String MesonPropertyPage_bindir_tooltip; + public static String MesonPropertyPage_sbindir_tooltip; + public static String MesonPropertyPage_includedir_tooltip; + public static String MesonPropertyPage_datadir_tooltip; + public static String MesonPropertyPage_mandir_tooltip; + public static String MesonPropertyPage_infodir_tooltip; + public static String MesonPropertyPage_localedir_tooltip; + public static String MesonPropertyPage_sysconfdir_tooltip; + public static String MesonPropertyPage_localstatedir_tooltip; + public static String MesonPropertyPage_sharedstatedir_tooltip; + public static String MesonPropertyPage_buildtype_tooltip; + public static String MesonPropertyPage_strip_tooltip; + public static String MesonPropertyPage_unity_tooltip; + public static String MesonPropertyPage_werror_tooltip; + public static String MesonPropertyPage_layout_tooltip; + public static String MesonPropertyPage_default_library_tooltip; + public static String MesonPropertyPage_warnlevel_tooltip; + public static String MesonPropertyPage_stdsplit_tooltip; + public static String MesonPropertyPage_errorlogs_tooltip; + public static String MesonPropertyPage_cross_file_tooltip; + public static String MesonPropertyPage_wrap_mode_tooltip; + + public static String MesonPropertyPage_true; + public static String MesonPropertyPage_false; + + static { + // initialize resource bundle + NLS.initializeMessages("org.eclipse.cdt.meson.ui.properties.messages", Messages.class); //$NON-NLS-1$ + } + + private Messages() { + } +} + diff --git a/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/messages.properties b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/messages.properties new file mode 100644 index 00000000000..55734e34786 --- /dev/null +++ b/build/org.eclipse.cdt.meson.ui/src/org/eclipse/cdt/meson/ui/properties/messages.properties @@ -0,0 +1,46 @@ +################################################################################ +# Copyright (c) 2018 Red Hat Inc. and others. +# 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 implementation +################################################################################ +MesonPropertyPage_not_an_integer=Error: field {0} must be an integer +MesonPropertyPage_option_pattern=Option\\s+Current.Value\\s+Description.*$ +MesonPropertyPage_option_with_values_pattern = Option\\s+Current.Value\\s+Possible.Values\\s+Description.*$ +MesonPropertyPage_compiler_or_link_args=((Compiler arguments:)|(Linker args:)) +MesonPropertyPage_arg_description=Compiler / linker arguments +MesonPropertyPage_meson_error=Meson configurator encountered an error: +MesonPropertyPage_configure_failed=Meson configure command failed (see console output) +MesonPropertyPage_terminated_rc=Command terminated with rc={0}\n + +MesonPropertyPage_prefix_tooltip=Installation prefix +MesonPropertyPage_libdir_tooltip=Library directory +MesonPropertyPage_libexecdir_tooltip=Library executable directory +MesonPropertyPage_bindir_tooltip=Executable directory +MesonPropertyPage_sbindir_tooltip=System executable directory +MesonPropertyPage_includedir_tooltip=Header file directory +MesonPropertyPage_datadir_tooltip=Data file directory +MesonPropertyPage_mandir_tooltip=Manual page directory +MesonPropertyPage_infodir_tooltip=Info page directory +MesonPropertyPage_localedir_tooltip=Locale data directory +MesonPropertyPage_sysconfdir_tooltip=Sysconf data directory +MesonPropertyPage_localstatedir_tooltip=Localstate data directory +MesonPropertyPage_sharedstatedir_tooltip=Architecture-independent data directory +MesonPropertyPage_buildtype_tooltip=Build type to use +MesonPropertyPage_strip_tooltip=Strip targets on install +MesonPropertyPage_unity_tooltip=Unity build +MesonPropertyPage_werror_tooltip=Treat warnings as errors +MesonPropertyPage_layout_tooltip=Build directory layout +MesonPropertyPage_default_library_tooltip=Default library type +MesonPropertyPage_warnlevel_tooltip=Compiler warning level to use +MesonPropertyPage_stdsplit_tooltip=Split stdout and stderr in test logs +MesonPropertyPage_errorlogs_tooltip=Whether to print the logs from failing tests +MesonPropertyPage_cross_file_tooltip=File describing cross compilation environment +MesonPropertyPage_wrap_mode_tooltip=Special wrap mode to use + +MesonPropertyPage_true=true +MesonPropertyPage_false=false
\ No newline at end of file |