1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

Add UI for user to control build type (#1090)

User can control the value of the CMake built type (CMAKE_BUILD_TYPE),
for example Debug or Release via new UI in CMakeBuildTab
 Added UT for ICMakeProperties.getBuildType()

Addresses Issue: CDT CMake Improvements #1000, IDE-82683-REQ-013
This commit is contained in:
DangMinhTam382 2025-02-20 01:36:13 +07:00 committed by GitHub
parent 47b1978568
commit e819f8a35c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 177 additions and 8 deletions

View file

@ -35,6 +35,7 @@ import org.eclipse.cdt.utils.CommandLineUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
import org.junit.jupiter.api.BeforeEach;
@ -91,6 +92,106 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 {
assertThat(cMakeProperties.getGenerator(), is(CMakeGenerator.WatcomWMake));
}
/**
* Test for IDE_82683_REQ_013 part of #1000
* <br>
* Testing {@link ICMakeProperties#getBuildType()} <br>
* <br>
* This test verify default build type is used in case:
* {@link ICMakeBuildConfiguration#CMAKE_USE_DEFAULT_CMAKE_SETTINGS} is <code>true<code>
*/
@Test
public void getCMakePropertiesTestGetDefaultBuildType() {
// CMAKE_USE_DEFAULT_CMAKE_SETTINGS = "true"
CMakeBuildConfiguration cmBuildConfig;
ICMakeProperties cMakeProperties;
// Test for ILaunchManager.RUN_MODE
cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", mockToolchain, null,
ILaunchManager.RUN_MODE, LOCAL_LAUNCH_TARGET);
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("Release"));
// Test for ILaunchManager.DEBUG_MODE
cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", mockToolchain, null,
ILaunchManager.DEBUG_MODE, LOCAL_LAUNCH_TARGET);
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("Debug"));
// Test for ILaunchManager.PROFILE_MODE
cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", mockToolchain, null,
ILaunchManager.PROFILE_MODE, LOCAL_LAUNCH_TARGET);
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("Release"));
}
/**
* Test for IDE_82683_REQ_013 part of #1000
* <br>
* This test verify default build type is used in case:
* {@link ICMakeBuildConfiguration#CMAKE_USE_DEFAULT_CMAKE_SETTINGS} is <code>true<code>
*/
@Test
public void getCMakePropertiesLoadISVSelectBuildType_UseDefaultBuildType_1() {
ICMakeProperties cMakeProperties;
CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName",
mockToolchain, null, ILaunchManager.RUN_MODE, LOCAL_LAUNCH_TARGET);
// Setup ISV properties for CMakeBuildConfiguration
// CMAKE_USE_DEFAULT_CMAKE_SETTINGS = "true"
// CMAKE_BUILD_TYPE = "RelWithDebInfo"
cmBuildConfig.removeProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE);
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_USE_DEFAULT_CMAKE_SETTINGS, "true");
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, "RelWithDebInfo");
// Expected: default build type is used (in this case: "Release" for ILaunchManager.RUN_MODE)
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("Release"));
}
/**
* Test for IDE_82683_REQ_013 part of #1000
* <br>
* This test verify default build type is used in case ISV build type is blank:
* {@link ICMakeBuildConfiguration#CMAKE_USE_DEFAULT_CMAKE_SETTINGS} is <code>false<code> and
* {@link ICMakeBuildConfiguration#CMAKE_BUILD_TYPE} is blank
*/
@Test
public void getCMakePropertiesLoadISVSelectBuildType_ISVBuildTypeIsBlank() {
ICMakeProperties cMakeProperties;
CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName",
mockToolchain, null, ILaunchManager.RUN_MODE, LOCAL_LAUNCH_TARGET);
// Setup ISV properties for CMakeBuildConfiguration
// CMAKE_USE_DEFAULT_CMAKE_SETTINGS = "false"
// CMAKE_BUILD_TYPE = ""
cmBuildConfig.removeProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE);
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_USE_DEFAULT_CMAKE_SETTINGS, "false");
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, "");
// Expected: "Release" build type is used (in this case: "Release" for ILaunchManager.RUN_MODE)
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("Release"));
}
/**
* Test for IDE_82683_REQ_013 part of #1000
* <br>
* This test verify ISV's selected build type is used in case:
* {@link ICMakeBuildConfiguration#CMAKE_USE_DEFAULT_CMAKE_SETTINGS} is <code>false<code> and
* {@link ICMakeBuildConfiguration#CMAKE_BUILD_TYPE} is NOT blank
*/
@Test
public void getCMakePropertiesLoadISVSelectBuildType_UseISVBuildTypeNotBlank() {
ICMakeProperties cMakeProperties;
CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName",
mockToolchain, null, ILaunchManager.RUN_MODE, LOCAL_LAUNCH_TARGET);
// Setup ISV properties for CMakeBuildConfiguration
// CMAKE_USE_DEFAULT_CMAKE_SETTINGS = "false"
// CMAKE_BUILD_TYPE = "RelWithDebInfo"
cmBuildConfig.removeProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE);
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_USE_DEFAULT_CMAKE_SETTINGS, "false");
cmBuildConfig.setProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, "RelWithDebInfo");
// Expected: "RelWithDebInfo" build type is used
cMakeProperties = cmBuildConfig.getCMakeProperties();
assertThat(cMakeProperties.getBuildType(), is("RelWithDebInfo"));
}
/**
* Test for {@link ICMakeProperties#setExtraArguments()}
*

View file

@ -139,6 +139,12 @@ public class CMakeBuildConfiguration extends CBuildConfiguration implements ICMa
cmakeProperties.setAllTarget(allTarget);
}
String buildType = properties.get(CMAKE_BUILD_TYPE);
if (buildType == null || buildType.isBlank()) {
buildType = getDefaultProperties().get(CMAKE_BUILD_TYPE);
}
cmakeProperties.setBuildType(buildType);
return cmakeProperties;
}
@ -178,13 +184,6 @@ public class CMakeBuildConfiguration extends CBuildConfiguration implements ICMa
runCMake |= !Files.exists(buildDir.resolve("CMakeCache.txt")); //$NON-NLS-1$
// Causes CMAKE_BUILD_TYPE to be set according to the launch mode
if (ILaunchManager.DEBUG_MODE.equals(getLaunchMode())) {
cmakeProperties.setBuildType("Debug"); //$NON-NLS-1$
} else {
cmakeProperties.setBuildType("Release"); //$NON-NLS-1$
}
if (!runCMake) {
ICMakeGenerator generator = cmakeProperties.getGenerator();
String makefileName = generator.getMakefileName();
@ -571,7 +570,8 @@ public class CMakeBuildConfiguration extends CBuildConfiguration implements ICMa
CMAKE_ARGUMENTS, CMAKE_ARGUMENTS_DEFAULT, //
CMAKE_BUILD_COMMAND, CMAKE_BUILD_COMMAND_DEFAULT, //
CMAKE_ALL_TARGET, CMAKE_ALL_TARGET_DEFAULT, //
CMAKE_CLEAN_TARGET, CMAKE_CLEAN_TARGET_DEFAULT //
CMAKE_CLEAN_TARGET, CMAKE_CLEAN_TARGET_DEFAULT, //
CMAKE_BUILD_TYPE, ILaunchManager.DEBUG_MODE.equals(getLaunchMode()) ? "Debug" : "Release" //$NON-NLS-1$ //$NON-NLS-2$
);
}

View file

@ -70,6 +70,12 @@ public interface ICMakeBuildConfiguration {
public static final String CMAKE_CLEAN_TARGET = "cmake.target.clean"; //$NON-NLS-1$
public static final String CMAKE_CLEAN_TARGET_DEFAULT = "clean"; //$NON-NLS-1$
/**
* Name of the build type set by user. Default of this value will be set based on Launch Mode
* (i.e. Debug for Debug launch mode, Release for Run and other launch modes)
*/
public static final String CMAKE_BUILD_TYPE = "cmake.build.type"; //$NON-NLS-1$
/**
* Converts the {@link ICBuildConfiguration}'s properties, using the keys defined above
* into an {@link ICMakeProperties} that configures the CMake build processes.

View file

@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.cdt.cmake.ui.internal;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Map;
@ -18,8 +19,11 @@ import org.eclipse.cdt.cmake.core.CMakeBuildConfigurationProvider;
import org.eclipse.cdt.cmake.core.properties.CMakeGenerator;
import org.eclipse.cdt.core.build.ICBuildConfiguration;
import org.eclipse.cdt.launch.ui.corebuild.CommonBuildTab;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.ILaunchMode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
@ -35,6 +39,8 @@ import org.eclipse.swt.widgets.Text;
public class CMakeBuildTab extends CommonBuildTab {
private static final String[] buildTypes = { "Debug", "Release", "RelWithDebInfo", "MinSizeRel" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
private Button useDefaultCmakeSettings;
private Combo generatorCombo;
private Text cmakeArgsText;
@ -46,6 +52,9 @@ public class CMakeBuildTab extends CommonBuildTab {
private Label buildCommandLabel;
private Label allTargetLabel;
private Label cleanTargetLabel;
private Combo buildTypeCombo;
private Label buildTypeLabel;
private Label usedForLaunchModeLabel;
@Override
protected String getBuildConfigProviderId() {
@ -121,6 +130,25 @@ public class CMakeBuildTab extends CommonBuildTab {
cleanTargetText = new Text(cmakeGroup, SWT.BORDER);
cleanTargetText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
cleanTargetText.addModifyListener(e -> updateLaunchConfigurationDialog());
Composite buildTypeComp = new Composite(cmakeGroup, SWT.NONE);
buildTypeComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
buildTypeComp.setLayout(new GridLayout(3, false));
buildTypeLabel = new Label(buildTypeComp, SWT.NONE);
buildTypeLabel.setText(Messages.CMakeBuildTab_BuildType);
buildTypeLabel.setToolTipText(Messages.CMakeBuildTab_BuildType_Tooltip);
buildTypeCombo = new Combo(buildTypeComp, SWT.DROP_DOWN);
buildTypeCombo.setItems(buildTypes);
buildTypeCombo.setToolTipText(Messages.CMakeBuildTab_BuildTypeCombo_Tooltip);
buildTypeCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateLaunchConfigurationDialog();
}
});
usedForLaunchModeLabel = new Label(buildTypeComp, SWT.NONE);
}
/**
@ -148,6 +176,9 @@ public class CMakeBuildTab extends CommonBuildTab {
allTargetText.setEnabled(enabled);
cleanTargetLabel.setEnabled(enabled);
cleanTargetText.setEnabled(enabled);
buildTypeLabel.setEnabled(enabled);
buildTypeCombo.setEnabled(enabled);
usedForLaunchModeLabel.setEnabled(enabled);
}
@Override
@ -217,6 +248,13 @@ public class CMakeBuildTab extends CommonBuildTab {
boolean isDefaultCMakeProperties = useDefaultCmakeSettings.getSelection();
buildConfig.setProperty(CMakeBuildConfiguration.CMAKE_USE_DEFAULT_CMAKE_SETTINGS,
Boolean.toString(isDefaultCMakeProperties));
String buildType = buildTypeCombo.getText().trim();
if (!(buildType.isBlank() || isDefaultCMakeProperties)) {
buildConfig.setProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, buildType);
} else {
buildConfig.removeProperty(CMakeBuildConfiguration.CMAKE_BUILD_TYPE);
}
}
@Override
@ -227,6 +265,7 @@ public class CMakeBuildTab extends CommonBuildTab {
properties.put(CMakeBuildConfiguration.CMAKE_BUILD_COMMAND, buildCommandText.getText().trim());
properties.put(CMakeBuildConfiguration.CMAKE_ALL_TARGET, allTargetText.getText().trim());
properties.put(CMakeBuildConfiguration.CMAKE_CLEAN_TARGET, cleanTargetText.getText().trim());
properties.put(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, buildTypeCombo.getText().trim());
}
@Override
@ -252,6 +291,16 @@ public class CMakeBuildTab extends CommonBuildTab {
String cleanTarget = properties.getOrDefault(CMakeBuildConfiguration.CMAKE_CLEAN_TARGET,
CMakeBuildConfiguration.CMAKE_CLEAN_TARGET_DEFAULT);
cleanTargetText.setText(cleanTarget);
// Default build type: Debug for Debug launch mode, Release for Run and other launch modes.
String defaultBuildType = getDefaultBuildType();
String buildType = properties.getOrDefault(CMakeBuildConfiguration.CMAKE_BUILD_TYPE, defaultBuildType);
buildTypeCombo.setText(buildType);
ILaunchMode launchMode = DebugPlugin.getDefault().getLaunchManager()
.getLaunchMode(getBuildConfiguration().getLaunchMode());
String launchModeLabel = launchMode != null ? launchMode.getLabel() : getBuildConfiguration().getLaunchMode();
usedForLaunchModeLabel.setText(MessageFormat.format(Messages.CMakeBuildTab_UsedForLaunchMode, launchModeLabel));
}
@Override
@ -259,4 +308,9 @@ public class CMakeBuildTab extends CommonBuildTab {
return Messages.CMakeBuildTab_Cmake;
}
private String getDefaultBuildType() {
return ILaunchManager.DEBUG_MODE.equals(getBuildConfiguration().getLaunchMode()) ? buildTypes[0]
: buildTypes[1];
}
}

View file

@ -15,6 +15,9 @@ import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
public static String CMakeBuildTab_BuildCommand;
public static String CMakeBuildTab_BuildType;
public static String CMakeBuildTab_BuildType_Tooltip;
public static String CMakeBuildTab_BuildTypeCombo_Tooltip;
public static String CMakeBuildTab_AllTarget;
public static String CMakeBuildTab_CleanTarget;
public static String CMakeBuildTab_Cmake;
@ -25,6 +28,7 @@ public class Messages extends NLS {
public static String CMakeBuildTab_Toolchain;
public static String CMakeBuildTab_useDefaultCmakeSettings;
public static String CMakeBuildTab_useDefaultCmakeSettingsTip;
public static String CMakeBuildTab_UsedForLaunchMode;
public static String CMakePreferencePage_Add;
public static String CMakePreferencePage_ConfirmRemoveDesc;
public static String CMakePreferencePage_ConfirmRemoveTitle;

View file

@ -1,4 +1,7 @@
CMakeBuildTab_BuildCommand=Build command
CMakeBuildTab_BuildType=Build type:
CMakeBuildTab_BuildType_Tooltip=The build type (CMAKE_BUILD_TYPE) used by the generator.
CMakeBuildTab_BuildTypeCombo_Tooltip=Typical build types (CMAKE_BUILD_TYPE) are listed. A custom build type can be entered.
CMakeBuildTab_AllTarget=Build all target
CMakeBuildTab_CleanTarget=Clean target
CMakeBuildTab_Cmake=CMake
@ -9,6 +12,7 @@ CMakeBuildTab_Settings=CMake Settings
CMakeBuildTab_Toolchain=Toolchain
CMakeBuildTab_useDefaultCmakeSettings=Use default CMake settings
CMakeBuildTab_useDefaultCmakeSettingsTip=Use the default CMake settings that are provided by the toolchain and Core Build System
CMakeBuildTab_UsedForLaunchMode=used for launch mode: {0}
CMakePreferencePage_Add=Add...
CMakePreferencePage_ConfirmRemoveDesc=Do you wish to deregister the selected files?
CMakePreferencePage_ConfirmRemoveTitle=Deregister CMake ToolChain File