Skip to content

Commit

Permalink
Add API to set CMake generator default (eg Ninja)
Browse files Browse the repository at this point in the history
ISV can set their desired CMake generator default (eg Ninja).

Addresses Issue: CDT CMake Improvements eclipse-cdt#1000, IDE-82683-REQ-012 CMake
generator default
  • Loading branch information
betamaxbandit committed Jan 22, 2025
1 parent 1abb990 commit 50f36a3
Show file tree
Hide file tree
Showing 16 changed files with 190 additions and 66 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.eclipse.cdt.cmake.core;

import org.eclipse.cdt.cmake.core.properties.ICMakeProperties;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.runtime.CoreException;
import org.junit.Test;

public class CMakeBuildConfigurationTests {

/**
* TODO: TBC
*/
@Test
public void getDefaultCMakeProperties00() {

org.eclipse.cdt.cmake.core.properties.CMakePropertiesFactory.createProperties();

}

private class CMakeBuildConfigurationExtended extends CMakeBuildConfiguration {

public CMakeBuildConfigurationExtended(IBuildConfiguration config, String name) throws CoreException {
super(config, name);
// TODO Auto-generated constructor stub
}

@Override
public ICMakeProperties getCMakeProperties() {
// get the built-in CDT defaults
ICMakeProperties properties = super.getCMakeProperties();

// provide my customizations (I don't know what Renesas/extenders may actually want to do here)
properties.setWarnUnitialized(true);
return properties;
}
}
}
2 changes: 1 addition & 1 deletion cmake/org.eclipse.cdt.cmake.core/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.cmake.core;singleton:=true
Bundle-Version: 1.6.0.qualifier
Bundle-Version: 2.0.0.qualifier
Bundle-Activator: org.eclipse.cdt.cmake.core.internal.Activator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.runtime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.eclipse.cdt.cmake.core.internal.CommandDescriptorBuilder.CommandDescriptor;
import org.eclipse.cdt.cmake.core.internal.IOsOverridesSelector;
import org.eclipse.cdt.cmake.core.properties.CMakeGenerator;
import org.eclipse.cdt.cmake.core.properties.CMakePropertiesFactory;
import org.eclipse.cdt.cmake.core.properties.ICMakeProperties;
import org.eclipse.cdt.cmake.core.properties.ICMakePropertiesController;
import org.eclipse.cdt.cmake.core.properties.IOsOverrides;
Expand Down Expand Up @@ -72,13 +73,14 @@
import org.osgi.service.prefs.Preferences;

/**
* @since 1.6
* @since 2.0
*/
public class CMakeBuildConfiguration extends CBuildConfiguration {
public class CMakeBuildConfiguration extends CBuildConfiguration implements ICMakeBuildConfiguration {

public static final String CMAKE_USE_UI_OVERRIDES = "cmake.use.ui.overrides"; //$NON-NLS-1$
public static final boolean CMAKE_USE_UI_OVERRIDES_DEFAULT = false;
public static final String CMAKE_GENERATOR = "cmake.generator"; //$NON-NLS-1$
public static final String CMAKE_GENERATOR_DEFAULT = "Ninja"; //$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$
Expand Down Expand Up @@ -124,6 +126,51 @@ public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolCha
this.toolChainFile = toolChainFile;
}

@Override
public ICMakeProperties getCMakeProperties() {
// Create CMake default properties
ICMakeProperties properties = CMakePropertiesFactory.createProperties();
// Set defaults for both platforms
IOsOverrides windowsOverrides = properties.getWindowsOverrides();
windowsOverrides.setDefaultGenerator(CMakeGenerator.Ninja);
IOsOverrides linuxOverrides = properties.getLinuxOverrides();
linuxOverrides.setDefaultGenerator(CMakeGenerator.Ninja);
// reset(true) causes the CMake generator to be reset to it's default value.
properties.reset(true);

/*
* Set values for this OS platform for CMake defaults and if UI overrides is enable for UI property values
*/
IOsOverrides osOverrides = ICMakeProperties.getPlatformOsOverrides(properties);
// CMAKE_GENERATOR
String cmakeGeneratorCmakeDefault = osOverrides.getGenerator().getCMakeName();
// CMAKE_ARGUMENTS
String extraArgsCmakeDefault = osOverrides.getExtraArguments().stream().map(String::trim)
.collect(Collectors.joining(" ")); //$NON-NLS-1$

String useUiOverrides = getProperty(CMAKE_USE_UI_OVERRIDES);
if (Boolean.parseBoolean(useUiOverrides)) {
// UI overrides are enabled so UI overridden values take precedence if not null otherwise use CMake default
// CMAKE_GENERATOR
String cmakeGeneratorUiValue = getProperty(CMakeBuildConfiguration.CMAKE_GENERATOR);
String cmakeGenerator = cmakeGeneratorUiValue == null ? cmakeGeneratorCmakeDefault : cmakeGeneratorUiValue;
setProperty(CMakeBuildConfiguration.CMAKE_GENERATOR, cmakeGenerator);
osOverrides.setGenerator(CMakeGenerator.getGenerator(cmakeGenerator));
// CMAKE_ARGUMENTS
String extraArgsUiValue = getProperty(CMAKE_ARGUMENTS);
String extraArgs = extraArgsUiValue == null ? extraArgsCmakeDefault : extraArgsUiValue;
setProperty(CMAKE_ARGUMENTS, extraArgs);
List<String> extraArgsList = Arrays.stream(extraArgs.split("\\s+")).map(entry -> entry.trim()) //$NON-NLS-1$
.collect(Collectors.toList());
osOverrides.setExtraArguments(extraArgsList);
} else {
// UI overrides are disabled so CMake default take precedence (UI overridden values should be ignored).
setProperty(CMakeBuildConfiguration.CMAKE_GENERATOR, cmakeGeneratorCmakeDefault);
setProperty(CMAKE_ARGUMENTS, extraArgsCmakeDefault);
}
return properties;
}

/**
* Gets the tool-chain description file to pass to the cmake command-line.
*
Expand Down Expand Up @@ -162,7 +209,8 @@ public IProject[] build(int kind, Map<String, String> args, IConsole console, IP
runCMake = true;
}

ICMakeProperties cmakeProperties = getPropertiesController().load();
ICMakeProperties cmakeProperties = getCMakeProperties();

runCMake |= !Files.exists(buildDir.resolve("CMakeCache.txt")); //$NON-NLS-1$

// Causes CMAKE_BUILD_TYPE to be set according to the launch mode
Expand Down Expand Up @@ -303,7 +351,7 @@ public void clean(IConsole console, IProgressMonitor monitor) throws CoreExcepti

project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);

ICMakeProperties cmakeProperties = getPropertiesController().load();
ICMakeProperties cmakeProperties = getCMakeProperties();
CommandDescriptorBuilder cmdBuilder = new CommandDescriptorBuilder(cmakeProperties,
new SimpleOsOverridesSelector());
CommandDescriptor command = cmdBuilder.makeCMakeBuildCommandline(getCleanCommand());
Expand Down Expand Up @@ -405,7 +453,8 @@ private ICMakePropertiesController getPropertiesController() {
@SuppressWarnings("unchecked")
public <T> T getAdapter(Class<T> adapter) {
if (ICMakePropertiesController.class.equals(adapter)) {
return (T) pc;
// return (T) pc;
return (T) getPropertiesController();
}
return super.getAdapter(adapter);
}
Expand Down Expand Up @@ -582,50 +631,11 @@ public void shutdown() {
}
} // CMakeIndexerInfoConsumer

/**
* Supports OS overrides and also User Interface (UI) overrides, provided in the CMakeBuildTab. The UI
* overrides are stored in the intermediary CBuildConfiguration Preferences (CBuildConfiguration.getSettings())
* and used only when CMAKE_USE_UI_OVERRIDES is true.
*/
private class SimpleOsOverridesSelector implements IOsOverridesSelector {

@Override
public IOsOverrides getOsOverrides(ICMakeProperties cmakeProperties) {
IOsOverrides overrides;
// get overrides. Simplistic approach ATM, probably a strategy might fit better.
// see comment in CMakeIndexerInfoConsumer#getFileForCMakePath()
final String os = Platform.getOS();
if (Platform.OS_WIN32.equals(os)) {
overrides = cmakeProperties.getWindowsOverrides();
} else {
// fall back to linux, if OS is unknown
overrides = cmakeProperties.getLinuxOverrides();
}
return getUiOrOsOverrides(overrides);
}

private IOsOverrides getUiOrOsOverrides(IOsOverrides osOverrides) {
IOsOverrides retVal = Objects.requireNonNull(osOverrides, "osOverrides must not be null"); //$NON-NLS-1$
Preferences settings = getSettings();
boolean useUiOverrides = settings.getBoolean(CMAKE_USE_UI_OVERRIDES, CMAKE_USE_UI_OVERRIDES_DEFAULT);
if (useUiOverrides) {
// Set UI override for generator
String gen = settings.get(CMAKE_GENERATOR, ""); //$NON-NLS-1$
retVal.setGenerator(CMakeGenerator.getGenerator(gen));
// Set UI override for Extra Arguments
String extraArgsStr = settings.get(CMAKE_ARGUMENTS, ""); //$NON-NLS-1$
// Convert String of args, separated by 1 or more spaces, into list of Strings
List<String> extraArgs = Arrays.stream(extraArgsStr.split("\\s+")).map(entry -> entry.trim()) //$NON-NLS-1$
.collect(Collectors.toList());
retVal.setExtraArguments(extraArgs);
// Set UI override for cmake build command, unless it's the default
String buildCommand = settings.get(BUILD_COMMAND, BUILD_COMMAND_DEFAULT);
if (!buildCommand.isBlank() && !BUILD_COMMAND_DEFAULT.equals(buildCommand)) {
retVal.setUseDefaultCommand(false);
retVal.setCommand(buildCommand);
}
}
return retVal;
return ICMakeProperties.getPlatformOsOverrides(cmakeProperties);
}
} // SimpleOsOverridesSelector
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*******************************************************************************
* Copyright (c) 2025 Renesas Electronics Europe.
*
* 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;

import org.eclipse.cdt.cmake.core.properties.ICMakeProperties;

/**
* @since 2.0
*/
public interface ICMakeBuildConfiguration {

/**
* Provides a set of default CMake properties. The ICMakeProperties can then, for
* example, provide a default value for the CMake generator.
* @return A ICMakeProperties object containing default values. Must not be null.
*/
ICMakeProperties getCMakeProperties();
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
* @noreference This class is not intended to be referenced by clients.
* @since 1.6
* @since 2.0
*/
public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.cdt.cmake.core.messages"; //$NON-NLS-1$
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
* us to delete file CMakeCache.txt to avoid complaints by cmake.
* @author Martin Weber
*/
@Deprecated
public class CMakePropertiesController implements ICMakePropertiesController {

private final Path storageFile;
Expand Down Expand Up @@ -158,4 +159,5 @@ private boolean hasExtraArgumentChanged(List<String> expected, List<String> actu
}
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import java.util.List;

import org.eclipse.cdt.cmake.core.properties.ICMakeProperties;
import org.eclipse.cdt.cmake.core.properties.LinuxOverrides;
import org.eclipse.cdt.cmake.core.properties.WindowsOverrides;

/**
* Holds project Properties for cmake. Follows the Java-Beans pattern to make (de-)serialization easier.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,29 @@
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/

package org.eclipse.cdt.cmake.core.internal.properties;
package org.eclipse.cdt.cmake.core.properties;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.eclipse.cdt.cmake.core.CMakeBuildConfiguration;
import org.eclipse.cdt.cmake.core.properties.CMakeGenerator;
import org.eclipse.cdt.cmake.core.properties.IOsOverrides;

/**
* Preferences that override/augment the generic properties when running under a
* specific OS.
*
* @author Martin Weber
* @since 2.0
*/
public abstract class AbstractOsOverrides implements IOsOverrides {

private String command;
private boolean useDefaultCommand;
private CMakeGenerator generator;
private List<String> extraArguments = new ArrayList<>(0);
private CMakeGenerator defaultGenerator = CMakeGenerator
.getGenerator(CMakeBuildConfiguration.CMAKE_GENERATOR_DEFAULT);

/**
* Creates a new object, initialized with all default values.
Expand All @@ -45,7 +46,7 @@ public AbstractOsOverrides() {
public void reset() {
setCommand(CMakeBuildConfiguration.BUILD_COMMAND_DEFAULT);
useDefaultCommand = true;
setGenerator(CMakeGenerator.UnixMakefiles);
setGenerator(defaultGenerator);
extraArguments.clear();
}

Expand Down Expand Up @@ -89,4 +90,8 @@ public void setExtraArguments(List<String> extraArguments) {
this.extraArguments = extraArguments;
}

}
@Override
public void setDefaultGenerator(CMakeGenerator defaultGenerator) {
this.defaultGenerator = defaultGenerator;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 2025 Renesas Electronics Europe.
*
* 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.properties;

import org.eclipse.cdt.cmake.core.internal.properties.CMakePropertiesBean;

/**
* @since 2.0
*/
public class CMakePropertiesFactory {
public static ICMakeProperties createProperties() {
return new CMakePropertiesBean();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

import java.util.List;

import org.eclipse.core.runtime.Platform;

/**
* Holds project Properties for cmake.
*
Expand Down Expand Up @@ -159,4 +161,15 @@ public interface ICMakeProperties {
* should be specified.
*/
void reset(boolean resetOsOverrides);

/**
* @since 2.0
*/
static IOsOverrides getPlatformOsOverrides(ICMakeProperties cmakeProperties) {
if (Platform.OS_WIN32.equals(Platform.getOS())) {
return cmakeProperties.getWindowsOverrides();
} else {
return cmakeProperties.getLinuxOverrides();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* @author Martin Weber
* @since 1.4
*/
@Deprecated
public interface ICMakePropertiesController {

/** Creates a new {@code ICMakeProperties} object, initialized from the persistence store.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,11 @@ public interface IOsOverrides {
* Sets the list of extra arguments to pass on the cmake command-line.
*/
void setExtraArguments(List<String> extraArguments);

/**
* Sets a value that is used when a {@link ICMakeProperties#reset(true)} call is performed, setting the value
* of the CMake generator (see {@link #getGenerator()}) to it's default value.
* @since 2.0
*/
void setDefaultGenerator(CMakeGenerator defaultGenerator);
}
Loading

0 comments on commit 50f36a3

Please sign in to comment.