Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java')
-rw-r--r--build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java354
1 files changed, 0 insertions, 354 deletions
diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java
deleted file mode 100644
index 31e9d3c8a0f..00000000000
--- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015, 2016 QNX Software Systems and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-package org.eclipse.cdt.cmake.core.internal;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.cdt.cmake.core.ICMakeToolChainFile;
-import org.eclipse.cdt.cmake.core.ICMakeToolChainManager;
-import org.eclipse.cdt.core.ConsoleOutputStream;
-import org.eclipse.cdt.core.ErrorParserManager;
-import org.eclipse.cdt.core.IConsoleParser;
-import org.eclipse.cdt.core.build.CBuildConfiguration;
-import org.eclipse.cdt.core.build.IToolChain;
-import org.eclipse.cdt.core.envvar.EnvironmentVariable;
-import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
-import org.eclipse.cdt.core.model.ICModelMarker;
-import org.eclipse.cdt.core.resources.IConsole;
-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.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-
-import com.google.gson.Gson;
-
-public class CMakeBuildConfiguration extends CBuildConfiguration {
-
- public static final String CMAKE_GENERATOR = "cmake.generator"; //$NON-NLS-1$
- public static final String CMAKE_ARGUMENTS = "cmake.arguments"; //$NON-NLS-1$
- public static final String CMAKE_ENV = "cmake.environment"; //$NON-NLS-1$
- public static final String BUILD_COMMAND = "cmake.command.build"; //$NON-NLS-1$
- public static final String CLEAN_COMMAND = "cmake.command.clean"; //$NON-NLS-1$
-
- private ICMakeToolChainFile toolChainFile;
-
- public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
- super(config, name);
-
- ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class);
- toolChainFile = manager.getToolChainFileFor(getToolChain());
- }
-
- public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) {
- this(config, name, toolChain, null, "run"); //$NON-NLS-1$
- }
-
- public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain,
- ICMakeToolChainFile toolChainFile, String launchMode) {
- super(config, name, toolChain, launchMode);
- this.toolChainFile = toolChainFile;
- }
-
- public ICMakeToolChainFile getToolChainFile() {
- return toolChainFile;
- }
-
- private boolean isLocal() throws CoreException {
- IToolChain toolchain = getToolChain();
- return (Platform.getOS().equals(toolchain.getProperty(IToolChain.ATTR_OS))
- || "linux-container".equals(toolchain.getProperty(IToolChain.ATTR_OS))) //$NON-NLS-1$
- && (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 {
- String generator = getProperty(CMAKE_GENERATOR);
- if (generator == null) {
- generator = "Ninja"; //$NON-NLS-1$
- }
-
- project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
-
- ConsoleOutputStream outStream = console.getOutputStream();
-
- Path buildDir = getBuildDirectory();
-
- outStream.write(String.format(Messages.CMakeBuildConfiguration_BuildingIn, buildDir.toString()));
-
- // Make sure we have a toolchain file if cross
- if (toolChainFile == null && !isLocal()) {
- ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class);
- toolChainFile = manager.getToolChainFileFor(getToolChain());
-
- if (toolChainFile == null) {
- // error
- console.getErrorStream().write(Messages.CMakeBuildConfiguration_NoToolchainFile);
- return null;
- }
- }
-
- boolean runCMake;
- switch (generator) {
- case "Ninja": //$NON-NLS-1$
- runCMake = !Files.exists(buildDir.resolve("build.ninja")); //$NON-NLS-1$
- break;
- case "Unix Makefiles": //$NON-NLS-1$
- runCMake = !Files.exists(buildDir.resolve("Makefile")); //$NON-NLS-1$
- break;
- default:
- runCMake = !Files.exists(buildDir.resolve("CMakeFiles")); //$NON-NLS-1$
- }
-
- if (runCMake) { // $NON-NLS-1$
-
- console.getOutputStream().write(String.format(Messages.CMakeBuildConfiguration_Configuring, buildDir));
- // clean output to make sure there is no content
- // incompatible with current settings (cmake config would fail)
- cleanBuildDirectory(buildDir);
-
- List<String> command = new ArrayList<>();
-
- command.add("cmake"); //$NON-NLS-1$
- command.add("-G"); //$NON-NLS-1$
- command.add(generator);
-
- if (toolChainFile != null) {
- command.add("-DCMAKE_TOOLCHAIN_FILE=" + toolChainFile.getPath().toString()); //$NON-NLS-1$
- }
-
- switch (getLaunchMode()) {
- // TODO what to do with other modes
- case "debug": //$NON-NLS-1$
- command.add("-DCMAKE_BUILD_TYPE=Debug"); //$NON-NLS-1$
- break;
- case "run": //$NON-NLS-1$
- command.add("-DCMAKE_BUILD_TYPE=Release"); //$NON-NLS-1$
- break;
- }
- command.add("-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"); //$NON-NLS-1$
-
- String userArgs = getProperty(CMAKE_ARGUMENTS);
- if (userArgs != null) {
- command.addAll(Arrays.asList(userArgs.trim().split("\\s+"))); //$NON-NLS-1$
- }
-
- command.add(new File(project.getLocationURI()).getAbsolutePath());
-
- outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$
-
- org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(
- getBuildDirectory().toString());
- Process p = startBuildProcess(command, new IEnvironmentVariable[0], workingDir, console, monitor);
- if (p == null) {
- console.getErrorStream().write(String.format(Messages.CMakeBuildConfiguration_Failure, "")); //$NON-NLS-1$
- return null;
- }
-
- watchProcess(p, console);
- }
-
- try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this,
- getToolChain().getErrorParserIds())) {
- epm.setOutputStream(console.getOutputStream());
-
- List<String> command = new ArrayList<>();
-
- String envStr = getProperty(CMAKE_ENV);
- List<IEnvironmentVariable> envVars = new ArrayList<>();
- if (envStr != null) {
- List<String> envList = CMakeUtils.stripEnvVars(envStr);
- for (String s : envList) {
- int index = s.indexOf("="); //$NON-NLS-1$
- if (index == -1) {
- envVars.add(new EnvironmentVariable(s));
- } else {
- envVars.add(new EnvironmentVariable(s.substring(0, index), s.substring(index + 1)));
- }
- }
- }
-
- String buildCommand = getProperty(BUILD_COMMAND);
- if (buildCommand == null) {
- command.add("cmake"); //$NON-NLS-1$
- command.add("--build"); //$NON-NLS-1$
- command.add("."); //$NON-NLS-1$
- if ("Ninja".equals(generator)) { //$NON-NLS-1$
- command.add("--"); //$NON-NLS-1$
- command.add("-v"); //$NON-NLS-1$
- }
- } else {
- command.addAll(Arrays.asList(buildCommand.split(" "))); //$NON-NLS-1$
- }
-
- outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$
-
- org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(
- getBuildDirectory().toString());
- Process p = startBuildProcess(command, envVars.toArray(new IEnvironmentVariable[0]), workingDir,
- console, monitor);
- if (p == null) {
- console.getErrorStream().write(String.format(Messages.CMakeBuildConfiguration_Failure, "")); //$NON-NLS-1$
- return null;
- }
-
- watchProcess(p, new IConsoleParser[] { epm });
-
- project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-
- // Load compile_commands.json file
- processCompileCommandsFile(monitor);
-
- outStream.write(String.format(Messages.CMakeBuildConfiguration_BuildingComplete, epm.getErrorCount(),
- epm.getWarningCount(), buildDir.toString()));
- }
-
- return new IProject[] { project };
- } catch (IOException e) {
- throw new CoreException(Activator
- .errorStatus(String.format(Messages.CMakeBuildConfiguration_Building, project.getName()), e));
- }
- }
-
- @Override
- public void clean(IConsole console, IProgressMonitor monitor) throws CoreException {
- IProject project = getProject();
- try {
- String generator = getProperty(CMAKE_GENERATOR);
-
- project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
-
- ConsoleOutputStream outStream = console.getOutputStream();
-
- Path buildDir = getBuildDirectory();
-
- if (!Files.exists(buildDir.resolve("CMakeFiles"))) { //$NON-NLS-1$
- outStream.write(Messages.CMakeBuildConfiguration_NotFound);
- return;
- }
-
- List<String> command = new ArrayList<>();
- String cleanCommand = getProperty(CLEAN_COMMAND);
- if (cleanCommand == null) {
- if (generator == null || generator.equals("Ninja")) { //$NON-NLS-1$
- command.add("ninja"); //$NON-NLS-1$
- command.add("clean"); //$NON-NLS-1$
- } else {
- command.add("make"); //$NON-NLS-1$
- command.add("clean"); //$NON-NLS-1$
- }
- } else {
- command.addAll(Arrays.asList(cleanCommand.split(" "))); //$NON-NLS-1$
- }
-
- IEnvironmentVariable[] env = new IEnvironmentVariable[0];
-
- outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$
-
- org.eclipse.core.runtime.Path workingDir = new org.eclipse.core.runtime.Path(
- getBuildDirectory().toString());
- Process p = startBuildProcess(command, env, workingDir, console, monitor);
- if (p == null) {
- console.getErrorStream().write(String.format(Messages.CMakeBuildConfiguration_Failure, "")); //$NON-NLS-1$
- return;
- }
-
- watchProcess(p, console);
-
- outStream.write(Messages.CMakeBuildConfiguration_BuildComplete);
-
- project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
- } catch (IOException e) {
- throw new CoreException(Activator
- .errorStatus(String.format(Messages.CMakeBuildConfiguration_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)) {
- List<Job> jobsList = new ArrayList<>();
- monitor.setTaskName(Messages.CMakeBuildConfiguration_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(), jobsList);
- }
- for (Job j : jobsList) {
- try {
- j.join();
- } catch (InterruptedException e) {
- // ignore
- }
- }
- shutdown();
- } catch (IOException e) {
- throw new CoreException(Activator.errorStatus(
- String.format(Messages.CMakeBuildConfiguration_ProcCompCmds, project.getName()), e));
- }
- }
- }
-
- /** Recursively removes any files and directories found in the specified Path.
- */
- private static void cleanDirectory(Path dir) throws IOException {
- SimpleFileVisitor<Path> deltor = new SimpleFileVisitor<Path>() {
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
- Files.delete(file);
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
- super.postVisitDirectory(dir, exc);
- Files.delete(dir);
- return FileVisitResult.CONTINUE;
- }
- };
- Path[] files = Files.list(dir).toArray(Path[]::new);
- for (Path file : files) {
- Files.walkFileTree(file, deltor);
- }
- }
-
- private void cleanBuildDirectory(Path buildDir) throws IOException {
- if (!Files.exists(buildDir))
- return;
- if (Files.isDirectory(buildDir))
- cleanDirectory(buildDir);
- // TODO: not a directory should we do something?
- }
-}

Back to the top