core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/BuildContextSBSv2.java
1) Reworking cconfiguration 'id' to be separate from the config display name
2) For SBSv2, show configs that live in the project but are otherwise filtered out when managing configs (still needs cleanup)
Support for building older 2.x SBSv2 projects not working yet.
package com.nokia.carbide.cpp.internal.api.sdk;
import java.io.File;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.osgi.framework.Version;
import com.nokia.carbide.cpp.epoc.engine.preprocessor.IDefine;
import com.nokia.carbide.cpp.sdk.core.IBSFCatalog;
import com.nokia.carbide.cpp.sdk.core.IBSFPlatform;
import com.nokia.carbide.cpp.sdk.core.IRVCTToolChainInfo;
import com.nokia.carbide.cpp.sdk.core.ISBSv2BuildContext;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
public class BuildContextSBSv2 implements ISBSv2BuildContext {
private String platform;
private String target;
private String sbsv2Alias;
private ISymbianSDK sdk;
private String displayString;
private String configID; // cconfiguration 'id' attribute from .cproject
public BuildContextSBSv2(ISymbianSDK theSDK, String thePlatform, String theTarget, String theSBSv2Alias, String displayName, String configID) {
this.sdk = theSDK;
this.platform = thePlatform.toUpperCase();
this.target = theTarget.toUpperCase();
this.sbsv2Alias = theSBSv2Alias;
this.displayString = displayName;
this.configID = configID;
}
@Override
public ISymbianSDK getSDK() {
return sdk;
}
@Override
public String getPlatformString() {
return platform;
}
@Override
public String getTargetString() {
return target;
}
public String getConfigID(){
return configID;
}
@Override
public String getDisplayString() {
// TODO: Still need to decide on how to set display string
// and how it's used for legacy SBSv2 configs
if (displayString != null && !displayString.equals(configID)){
return displayString;
}
// TODO: else fallback for old configs, we should convert
String EMULATOR_DISPLAY_TEXT = "Emulator"; //$NON-NLS-1$
String PHONE_DISPLAY_TEXT = "Phone"; //$NON-NLS-1$
String DEBUG_DISPLAY_TEXT = "Debug"; //$NON-NLS-1$
String RELEASE_DISPLAY_TEXT = "Release"; //$NON-NLS-1$
String SPACE_DISPLAY_TEXT = " "; //$NON-NLS-1$
String SDK_NOT_INSTALLED = "SDK not installed"; //$NON-NLS-1$
String displayString = null;
if (displayString == null) {
// in the form Emulation Debug (WINSCW) [S60_3rd_MR] or
// Phone Release (GCCE) [S60_3rd_MR]
if (platform.compareTo(ISymbianBuildContext.EMULATOR_PLATFORM) == 0) {
displayString = EMULATOR_DISPLAY_TEXT;
} else {
displayString = PHONE_DISPLAY_TEXT;
}
if (target.compareTo(ISymbianBuildContext.DEBUG_TARGET) == 0) {
displayString = displayString + SPACE_DISPLAY_TEXT + DEBUG_DISPLAY_TEXT;
} else {
displayString = displayString + SPACE_DISPLAY_TEXT + RELEASE_DISPLAY_TEXT;
}
String basePlatform = sbsv2Alias;
displayString = displayString + " (" + basePlatform + ") [" + getSDK().getUniqueId() + "]"; //$NON-NLS-1$
}
return displayString;
}
@Override
public String toString() {
return getConfigID();
}
@Override
public String getDefaultDefFileDirectoryName(boolean isASSP) {
// TOOD: THIS IS ABLD STUFF. isASSP does not belong with Raptor
// TODO: How the ASSP option affects the path?
String dirName = getDefFileDirectoryNameForPlatform(platform);
if (dirName == null) {
// check BSF's
IBSFCatalog catalog = getSDK().getBSFCatalog();
if (catalog != null) {
for (IBSFPlatform plat : catalog.getPlatforms()) {
if (plat.getName().compareToIgnoreCase(platform) == 0) {
String mainPlatform = catalog.getReleasePlatform(platform);
if (mainPlatform != null) {
dirName = getDefFileDirectoryNameForPlatform(mainPlatform);
if (dirName == null || dirName.length() < 1) {
// fallback - all BSF's should be EABI anyway
return "EABI"; //$NON-NLS-1$
}
}
}
}
}
}
if (dirName == null) {
// fallback for unknown cases
dirName = platform;
}
return dirName;
}
private String getDefFileDirectoryNameForPlatform(String platform) {
// TODO: This is still ABLD stype stuff
if (platform.equals(EMULATOR_PLATFORM)) {
return "BWINS"; //$NON-NLS-1$
} else if (platform.equals(ARMV5_PLATFORM)
|| platform.equals(ARMV5_ABIV2_PLATFORM)
|| platform.equals(ARMV6_PLATFORM)
|| platform.equals(ARMV6_ABIV2_PLATFORM)
|| platform.equals(GCCE_PLATFORM)) {
return "EABI"; //$NON-NLS-1$
}
return null;
}
@Override
public IPath getCompilerPrefixFile() {
// TODO: This is ABLD hard-code mechanism. Should be able to get from Raptor query mechanism
if (platform.equals(GCCE_PLATFORM)) {
return getGCCEPrefixFilePath();
} else if (platform.equals(ARMV5_PLATFORM)
|| platform.equals(ARMV5_ABIV2_PLATFORM)
|| platform.equals(ARMV6_PLATFORM)
|| platform.equals(ARMV6_ABIV2_PLATFORM)) {
return getRVCTPrefixFilePath();
} else {
// check BSF's
IBSFCatalog catalog = getSDK().getBSFCatalog();
if (catalog != null) {
for (IBSFPlatform plat : catalog.getPlatforms()) {
if (plat.getName().compareToIgnoreCase(platform) == 0) {
String mainPlatform = catalog.getReleasePlatform(platform);
if (mainPlatform != null) {
if (mainPlatform.equals(GCCE_PLATFORM)) {
return getGCCEPrefixFilePath();
} else if (mainPlatform.equals(ARMV5_PLATFORM)
|| mainPlatform.equals(ARMV5_ABIV2_PLATFORM)
|| mainPlatform.equals(ARMV6_PLATFORM)
|| mainPlatform.equals(ARMV6_ABIV2_PLATFORM)) {
return getRVCTPrefixFilePath();
} else {
// fallback - all BSF's should be EABI anyway
return getRVCTPrefixFilePath();
}
}
}
}
}
}
// fallback for WINSCW, MSVC, etc.
return null;
}
private IPath getGCCEPrefixFilePath() {
// TOOD: Should get from Raptor query when available
return getSDK().getIncludePath().append("gcce/gcce.h"); //$NON-NLS-1$
}
private IPath getRVCTPrefixFilePath() {
// TODO: Should get this from query mechanism
IRVCTToolChainInfo[] installedRVCTTools = SDKCorePlugin.getSDKManager().getInstalledRVCTTools();
// use default in case tools aren't installed
String rvctFragment = "rvct2_2"; //$NON-NLS-1$
if (installedRVCTTools.length > 0) {
rvctFragment = getRVCTFragment(installedRVCTTools[0]);
}
IPath prefixFilePath = getSDK().getIncludePath().append(rvctFragment).append(rvctFragment + ".h"); //$NON-NLS-1$
if (prefixFilePath.toFile().exists()){
return prefixFilePath;
} else {
// SF kits around SF^3 started to only use a single rvct.h header instead of specific versioned ones
// based on the default installation
return getSDK().getIncludePath().append("rvct").append("rvct" + ".h");
}
}
private String getRVCTFragment(IRVCTToolChainInfo info) {
// TODO: This should not be needed when raptor query is complete
int major = 0, minor = 0;
if (info != null) {
Version rvctToolsVersion = info.getRvctToolsVersion();
if (rvctToolsVersion != null) {
major = info.getRvctToolsVersion().getMajor();
minor = info.getRvctToolsVersion().getMinor();
}
}
return "rvct" + major + "_" + minor; //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public List<IDefine> getVariantHRHDefines() {
// TODO: Should get from raptor query
return getCachedData().getVariantHRHDefines();
}
@Override
public List<File> getPrefixFileIncludes() {
// TODO: Should get from raptor query
return getCachedData().getPrefixFileIncludes();
}
@Override
public List<IDefine> getCompilerMacros() {
// TODO: Should get from raptor query
// we parse the compiler prefix file to gather macros. this can be time consuming so do it
// once and cache the values. only reset the cache when the compiler prefix has changed.
IPath prefixFile = getCompilerPrefixFile();
if (prefixFile == null) {
return Collections.emptyList();
}
return getCachedData().getCompilerMacros(prefixFile);
}
@Override
public String getBuildVariationName() {
// TODO: This should not be needed for Raptor
return "";
}
@Override
public boolean isSymbianBinaryVariation() {
// This should not be needed for Raptor. We do need a check
// in the MPP for the featurevariant keyword perhaps
return false;
}
/**
* See if the build configuration is an SBSv2 alias, and if so get the build-able alias name
* @param displayName
* @return The full SBSv2 alias that can be used with -c, otherwise null if not SBSv2
*/
private static String getSBSv2AliasFromConfigName(String displayName) {
int indexBegin = displayName.indexOf("("); //$NON-NLS-1$
int indexEnd = displayName.indexOf(")"); //$NON-NLS-1$
if (indexBegin > 0 && indexEnd > 0){
String configPart = displayName.substring(indexBegin+1, indexEnd);
if (configPart.split("_").length > 1){
return configPart;
}
}
return null;
}
@Override
public String getSBSv2Alias() {
return sbsv2Alias;
}
/**
* Get the cache holding the data that applies to this build context globally.
* A build context is subclassed by CarbideBuildConfiguration, which has multiple
* instances at runtime, thus, a SymbianBuildContext instance should not hold a cache itself.
* @return cache, never <code>null</code>
*/
private SymbianBuildContextDataCache getCachedData() {
// TODO: Still need to consider this for SBSv2 refactoring / Raptor query
return SymbianBuildContextDataCache.getCache(this);
}
/**
* Get the list of #include paths detected for this context.
* @return List or <code>null</code>
*/
public List<File> getCachedSystemIncludePaths() {
// TODO: Still need to consider this for SBSv2 refactoring / Raptor query
return getCachedData().getSystemIncludePaths();
}
// Fall-back to get SDK id from old config name
public static String getSDKIDFromConfigName(String configName) {
int indexBegin = configName.indexOf("["); //$NON-NLS-1$
int indexEnd = configName.indexOf("]"); //$NON-NLS-1$
if (indexBegin > 0 && indexEnd > 0){
return configName.substring(indexBegin+1, indexEnd);
} else {
return ""; //$NON-NLS-1$
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((platform == null) ? 0 : platform.hashCode());
result = prime * result + ((getSDK() == null) ? 0 : getSDK().getEPOCROOT().hashCode());
result = prime * result + ((target == null) ? 0 : target.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof BuildContextSBSv2))
return false;
final BuildContextSBSv2 other = (BuildContextSBSv2) obj;
if (sbsv2Alias == null) {
if (other.sbsv2Alias != null)
return false;
} else if (!sbsv2Alias.equals(other.sbsv2Alias))
return false;
if (getSDK() == null) {
if (other.getSDK() != null)
return false;
} else if (!getSDK().getEPOCROOT().equals(other.getSDK().getEPOCROOT()))
return false;
if (target == null) {
if (other.target != null)
return false;
} else if (!target.equals(other.target)) {
return false;
} else if (!configID.equals(other.configID)){
// TODO: Do we really need anything other than a config ID comparison?
return false;
}
return true;
}
}