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 #1000, IDE-82683-REQ-012 CMake
generator default
  • Loading branch information
betamaxbandit committed Jan 17, 2025
1 parent 1abb990 commit c8d0797
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 33 deletions.
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,10 +73,11 @@
import org.osgi.service.prefs.Preferences;

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

private static final String CMAKE_PROPERTIES_INITIALSED = "cmake.properties.initialised"; //$NON-NLS-1$
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$
Expand All @@ -91,6 +93,8 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
// lazily instantiated..
private ICMakePropertiesController pc;

ICMakeProperties defaultProperties;

private Map<IResource, IScannerInfo> infoPerResource;
/**
* whether one of the CMakeLists.txt files in the project has been modified and saved by the
Expand All @@ -112,6 +116,7 @@ public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws C

ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class);
toolChainFile = manager.getToolChainFileFor(getToolChain());
setDefaultCMakeProperties();
}

public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) {
Expand All @@ -122,6 +127,30 @@ public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolCha
ICMakeToolChainFile toolChainFile, String launchMode) {
super(config, name, toolChain, launchMode);
this.toolChainFile = toolChainFile;
// // moule
setDefaultCMakeProperties();
}

private void setDefaultCMakeProperties() {
// Only set defaults on initial construction
if (getProperty(CMAKE_PROPERTIES_INITIALSED) == null) {
ICMakeProperties properties = CMakePropertiesFactory.getProperties();
IOsOverrides windowsOverrides = properties.getWindowsOverrides();
windowsOverrides.setDefaultGenerator(CMakeGenerator.UnixMakefiles);

IOsOverrides linuxOverrides = properties.getLinuxOverrides();
linuxOverrides.setDefaultGenerator(CMakeGenerator.UnixMakefiles);
// reset(true) causes the CMake generator to be reset to it's default value.
properties.reset(true);
setDefaultCMakeProperties(properties);
}
}

@Override
public void setDefaultCMakeProperties(ICMakeProperties defaultProperties) {
this.defaultProperties = defaultProperties;
setProperty(CMAKE_GENERATOR, getOsOverrides(defaultProperties).getGenerator().getCMakeName());
setProperty(CMAKE_PROPERTIES_INITIALSED, Boolean.TRUE.toString());
}

/**
Expand Down Expand Up @@ -162,7 +191,8 @@ public IProject[] build(int kind, Map<String, String> args, IConsole console, IP
runCMake = true;
}

ICMakeProperties cmakeProperties = getPropertiesController().load();
// ICMakeProperties cmakeProperties = getPropertiesController().load();
ICMakeProperties cmakeProperties = getPropertiesController().load(defaultProperties);
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 +333,8 @@ 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 = getPropertiesController().load();
ICMakeProperties cmakeProperties = getPropertiesController().load(defaultProperties);
CommandDescriptorBuilder cmdBuilder = new CommandDescriptorBuilder(cmakeProperties,
new SimpleOsOverridesSelector());
CommandDescriptor command = cmdBuilder.makeCMakeBuildCommandline(getCleanCommand());
Expand Down Expand Up @@ -405,7 +436,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,6 +614,15 @@ public void shutdown() {
}
} // CMakeIndexerInfoConsumer

private IOsOverrides getOsOverrides(ICMakeProperties cmakeProperties) {
if (Platform.OS_WIN32.equals(Platform.getOS())) {
return cmakeProperties.getWindowsOverrides();

} else {
return cmakeProperties.getLinuxOverrides();
}
}

/**
* 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())
Expand All @@ -591,17 +632,9 @@ 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);
return getUiOrOsOverrides(getOsOverrides(cmakeProperties));
}

private IOsOverrides getUiOrOsOverrides(IOsOverrides osOverrides) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.eclipse.cdt.cmake.core;

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

/**
* @since 2.0
*/
public interface ICMakeBuildConfiguration {
/**
* Provides a CBuildConfiguration with a set of default CMake properties. The ICMakeProperties can then, for
* example, provide a default value for the CMake generator.
* The CMake generator can then be set using {@link ICBuildConfiguration#setProperty(String, String)}, using
* {@link CMakeBuildConfiguration#CMAKE_GENERATOR}. The CMake generator property can then be accessed using
* the {@link ICBuildConfiguration#getProperty(String)}.
*/
void setDefaultCMakeProperties(ICMakeProperties defaultProperties);
}
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 @@ -93,6 +93,32 @@ public ICMakeProperties load() throws IOException {
return props;
}

@Override
public ICMakeProperties load(ICMakeProperties defaults) throws IOException {
ICMakeProperties props = null;
if (Files.exists(storageFile)) {
try (InputStream is = Files.newInputStream(storageFile)) {
var classLoader = this.getClass().getClassLoader();

var loaderoptions = new LoaderOptions();
TagInspector taginspector = tag -> tag.getClassName().equals(CMakePropertiesBean.class.getName());
loaderoptions.setTagInspector(taginspector);

var clConstructor = new CustomClassLoaderConstructor(classLoader, loaderoptions);

props = new Yaml(clConstructor).loadAs(is, CMakePropertiesBean.class);
// props is null here if if no document was available in the file
}
}
if (props == null) {
// nothing was persisted, return default properties
props = defaults;
}

setupModifyDetection(props);
return props;
}

@Override
public void save(ICMakeProperties properties) throws IOException {
// detect whether changes force us to delete file CMakeCache.txt to avoid complaints by cmake
Expand Down Expand Up @@ -158,4 +184,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,28 @@
* 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.Ninja;

/**
* Creates a new object, initialized with all default values.
Expand All @@ -45,7 +45,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 +89,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,9 @@
package org.eclipse.cdt.cmake.core.properties;

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

public class CMakePropertiesFactory {
public static ICMakeProperties getProperties() {
return new CMakePropertiesBean();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,17 @@ public interface ICMakePropertiesController {
*
* @throws IOException if the persistence store exists but could not be read
*/
@Deprecated
ICMakeProperties load() throws IOException;

/** Creates a new {@code ICMakeProperties} object, initialized from the persistence store.
* If the persistence store does not exist, an object initialized to the default values is returned.
*
* @throws IOException if the persistence store exists but could not be read
* @since 2.0
*/
ICMakeProperties load(ICMakeProperties defaults) throws IOException;

/** Saves the specified {@code ICMakeProperties} object to the persistence store.
*
* @throws IOException if the persistence store could not be written to
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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,18 @@
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/

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

/**
* Preferences that override/augment the generic properties when running under
* Linux.
*
* @author Martin Weber
* @since 2.0
*/
public class LinuxOverrides extends AbstractOsOverrides {

/**
* Creates a new object, initialized with all default values.
*/
public LinuxOverrides() {
super();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,18 @@
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/

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

import org.eclipse.cdt.cmake.core.properties.CMakeGenerator;
package org.eclipse.cdt.cmake.core.properties;

/**
* Preferences that override/augment the generic properties when running under
* Windows.
*
* @author Martin Weber
* @since 2.0
*/
public class WindowsOverrides extends AbstractOsOverrides {

/** Overridden to set a sensible generator. */
@Override
public void reset() {
super.reset();
setGenerator(CMakeGenerator.MinGWMakefiles);
public WindowsOverrides() {
super();
}
}

0 comments on commit c8d0797

Please sign in to comment.