12 */ |
12 */ |
13 |
13 |
14 package com.nokia.carbide.cpp.internal.sdk.core.model; |
14 package com.nokia.carbide.cpp.internal.sdk.core.model; |
15 |
15 |
16 import java.io.File; |
16 import java.io.File; |
|
17 import java.io.FileReader; |
17 import java.io.IOException; |
18 import java.io.IOException; |
18 import java.net.URL; |
19 import java.io.Reader; |
19 import java.util.ArrayList; |
20 import java.util.ArrayList; |
20 import java.util.Collections; |
21 import java.util.Collections; |
21 import java.util.Date; |
22 import java.util.HashMap; |
22 import java.util.Iterator; |
23 import java.util.Iterator; |
23 import java.util.List; |
24 import java.util.List; |
|
25 import java.util.Map; |
24 import java.util.Set; |
26 import java.util.Set; |
|
27 import java.util.regex.Matcher; |
25 |
28 |
26 import org.eclipse.core.runtime.IPath; |
29 import org.eclipse.core.runtime.IPath; |
27 import org.eclipse.core.runtime.Path; |
30 import org.eclipse.core.runtime.Path; |
28 import org.osgi.framework.Version; |
|
29 |
31 |
30 import com.nokia.carbide.cpp.internal.api.sdk.BuildContextSBSv1; |
32 import com.nokia.carbide.cpp.internal.api.sdk.BuildContextSBSv1; |
31 import com.nokia.carbide.cpp.internal.api.sdk.BuildPlat; |
33 import com.nokia.carbide.cpp.internal.api.sdk.BuildPlat; |
32 import com.nokia.carbide.cpp.internal.api.sdk.ISBSv1BuildInfo; |
34 import com.nokia.carbide.cpp.internal.api.sdk.ISBSv1BuildInfo; |
33 import com.nokia.carbide.cpp.internal.api.sdk.SBSv2Utils; |
35 import com.nokia.carbide.cpp.internal.api.sdk.SBSv2Utils; |
34 import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DefaultType; |
|
35 import com.nokia.carbide.cpp.internal.sdk.core.gen.Devices.DeviceType; |
|
36 import com.nokia.carbide.cpp.sdk.core.IBSFCatalog; |
36 import com.nokia.carbide.cpp.sdk.core.IBSFCatalog; |
37 import com.nokia.carbide.cpp.sdk.core.IBSFPlatform; |
37 import com.nokia.carbide.cpp.sdk.core.IBSFPlatform; |
38 import com.nokia.carbide.cpp.sdk.core.ISBVCatalog; |
38 import com.nokia.carbide.cpp.sdk.core.ISBVCatalog; |
39 import com.nokia.carbide.cpp.sdk.core.ISBVPlatform; |
39 import com.nokia.carbide.cpp.sdk.core.ISBVPlatform; |
40 import com.nokia.carbide.cpp.sdk.core.ISDKManager; |
40 import com.nokia.carbide.cpp.sdk.core.ISDKManager; |
41 import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext; |
41 import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext; |
42 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK; |
42 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK; |
43 import com.nokia.carbide.cpp.sdk.core.ISymbianSDKFeatures; |
43 import com.nokia.carbide.cpp.sdk.core.ISymbianSDKFeatures; |
44 import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin; |
44 import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin; |
|
45 import com.nokia.cpp.internal.api.utils.core.PathUtils; |
45 |
46 |
46 /** |
47 /** |
47 * SBSv1 specific build information. |
48 * SBSv1 specific build information. |
48 * |
49 * |
49 */ |
50 */ |
50 public class SBSv1BuildInfo implements ISBSv1BuildInfo { |
51 public class SBSv1BuildInfo implements ISBSv1BuildInfo { |
51 |
52 |
52 private Date createDate; |
53 private ISymbianSDK sdk; |
53 private File licenseFile; |
|
54 private File prefixFile; |
|
55 private Version sdkVersion; |
|
56 private String sdkOSBranch; |
|
57 private String sdkDescription; |
|
58 private String publisherName; |
|
59 private URL publisherURL; |
|
60 private IBSFCatalog bsfCatalog; |
54 private IBSFCatalog bsfCatalog; |
61 private ISBVCatalog sbvCatalog; |
55 private ISBVCatalog sbvCatalog; |
|
56 private boolean wasScanned = false; |
62 private List<ISymbianBuildContext> binaryVariantContextList = new ArrayList<ISymbianBuildContext>(0); |
57 private List<ISymbianBuildContext> binaryVariantContextList = new ArrayList<ISymbianBuildContext>(0); |
63 private List<ISymbianBuildContext> bsfContextList = new ArrayList<ISymbianBuildContext>(0); |
58 private List<ISymbianBuildContext> bsfContextList = new ArrayList<ISymbianBuildContext>(0); |
64 |
59 private Map<String, List<String>> cachedPlatformMacros = new HashMap<String, List<String>>(); |
65 public List<ISymbianBuildContext> getFilteredBuildConfigurations(ISymbianSDK sdk) { |
60 |
66 // This is probably a bug, but the filtering only uses SBSv1 preferences if SBSv1 is enabled... |
61 public SBSv1BuildInfo(ISymbianSDK sdk) { |
67 List<ISymbianBuildContext> filteredContexts; |
62 this.sdk = sdk; |
68 if (SBSv2Utils.enableSBSv1Support()) { |
63 } |
69 filteredContexts = getSBSv1FilteredBuildConfigurations(sdk); |
64 |
70 } else { |
65 public void clearPlatformMacros() { |
71 // be optimistic in this case... SBSv3? ;) |
66 cachedPlatformMacros.clear(); |
72 filteredContexts = getAllBuildConfigurations(sdk); |
67 } |
73 } |
68 |
74 return filteredContexts; |
69 public List<String> getAvailablePlatforms() { |
|
70 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
|
71 return sdkMgr.getSymbianMacroStore().getSupportedPlatforms(((SymbianSDK)sdk).getOSVersion(), "", getBSFCatalog()); |
75 } |
72 } |
76 |
73 |
77 @SuppressWarnings("rawtypes") |
74 @SuppressWarnings("rawtypes") |
78 public List<ISymbianBuildContext> getAllBuildConfigurations(ISymbianSDK sdk) { |
75 public List<ISymbianBuildContext> getAllBuildConfigurations() { |
79 Set sdkFeatures = sdk.getSupportedFeatures(); |
76 Set sdkFeatures = sdk.getSupportedFeatures(); |
80 List<ISymbianBuildContext> buildTargets = new ArrayList<ISymbianBuildContext>(); |
77 List<ISymbianBuildContext> buildTargets = new ArrayList<ISymbianBuildContext>(); |
81 |
78 |
82 // note that this gets variant platforms but not regular BSF's |
79 // note that this gets variant platforms but not regular BSF's |
83 List <String>buildPlats = getAvailablePlatforms(sdk); |
80 List <String>buildPlats = getAvailablePlatforms(); |
84 |
81 |
85 if (buildPlats.size() == 0){ |
82 if (buildPlats.size() == 0){ |
86 return Collections.emptyList(); |
83 return Collections.emptyList(); |
87 } |
84 } |
88 // TODO: Hard code build context hack |
85 // TODO: Hard code build context hack |
106 buildTargets.add(new BuildContextSBSv1(sdk, currPlat, ISymbianBuildContext.RELEASE_TARGET)); |
103 buildTargets.add(new BuildContextSBSv1(sdk, currPlat, ISymbianBuildContext.RELEASE_TARGET)); |
107 } |
104 } |
108 |
105 |
109 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
106 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
110 if (sdkMgr.getBSFScannerEnabled()){ |
107 if (sdkMgr.getBSFScannerEnabled()){ |
111 buildTargets.addAll(getBSFPlatformContexts(sdk)); |
108 buildTargets.addAll(getBSFPlatformContexts()); |
112 buildTargets.addAll(getBinaryVariationPlatformContexts(sdk)); // Symbian Binary Variation (.var) |
109 buildTargets.addAll(getBinaryVariationPlatformContexts()); // Symbian Binary Variation (.var) |
113 } |
110 } |
114 |
111 |
115 return buildTargets; |
112 return buildTargets; |
116 } |
113 } |
117 |
114 |
118 public List<String> getPlatformMacros(ISymbianSDK sdk, String platform) { |
115 public IBSFCatalog getBSFCatalog() { |
119 if (sdk instanceof SymbianSDK) { |
116 synchronized (sdk) { |
120 return ((SymbianSDK)sdk).getPlatformMacros(platform); |
117 if (bsfCatalog == null) { |
121 } |
118 bsfCatalog = BSFCatalogFactory.createCatalog(sdk); |
122 return null; |
119 } |
123 } |
120 } |
124 |
121 return bsfCatalog; |
125 public List<String> getVendorSDKMacros(ISymbianSDK sdk) { |
122 } |
126 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
123 |
127 return sdkMgr.getSymbianMacroStore().getVendorMacros(getSDKVersion(sdk), getName(sdk)); |
124 public List<ISymbianBuildContext> getFilteredBuildConfigurations() { |
128 } |
125 // This is probably a bug, but the filtering only uses SBSv1 preferences if SBSv1 is enabled... |
129 |
126 List<ISymbianBuildContext> filteredContexts; |
130 public List<String> getAvailablePlatforms(ISymbianSDK sdk) { |
127 if (SBSv2Utils.enableSBSv1Support()) { |
131 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
128 filteredContexts = getSBSv1FilteredBuildConfigurations(); |
132 return sdkMgr.getSymbianMacroStore().getSupportedPlatforms(((SymbianSDK)sdk).getOSVersion(), getSDKOSBranch(sdk), getBSFCatalog(sdk)); |
129 } else { |
133 } |
130 // be optimistic in this case... SBSv3? ;) |
134 |
131 filteredContexts = getAllBuildConfigurations(); |
135 public String getName(ISymbianSDK sdk) { |
132 } |
136 if (sdk instanceof SymbianSDK) { |
133 return filteredContexts; |
137 DeviceType deviceEntry = ((SymbianSDK)sdk).getDeviceEntry(); |
134 } |
138 if (deviceEntry != null) { |
135 |
139 return deviceEntry.getName(); |
136 public List<String> getPlatformMacros(String platform) { |
140 } |
137 List<String> platformMacros = cachedPlatformMacros.get(platform.toUpperCase()); |
141 } |
138 if (platformMacros == null) { |
142 return ""; |
139 synchronized (cachedPlatformMacros) { |
143 } |
140 IBSFCatalog bsfCatalog = getBSFCatalog(); |
144 |
141 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
145 public String getVendor(ISymbianSDK sdk) { |
142 platformMacros = sdkMgr.getSymbianMacroStore().getPlatformMacros(sdk.getOSVersion(), "", bsfCatalog, platform); |
146 String[] parts = getName(sdk).split("\\."); |
143 cachedPlatformMacros.put(platform.toUpperCase(), platformMacros); |
147 if (parts.length == 3) |
144 } |
148 return parts[1]; |
145 } |
149 |
146 return platformMacros; |
150 return ""; |
147 } |
151 } |
148 |
152 |
149 /** |
153 public String getFamily(ISymbianSDK sdk) { |
150 * Get the full path to the prefix file defined under \epoc32\tools\variant\variant.cfg |
154 String[] parts = getName(sdk).split("\\."); |
151 * @return A path object, or null if the variant.cfg does not exist. This routine does not check to see if the returned path exists. |
155 if (parts.length == 3){ |
152 */ |
156 if (getSDKVersion(sdk).getMajor() == 5 && getName(sdk).equalsIgnoreCase(NOKIA_SF_SDK_NAME)){ |
153 public IPath getPrefixFromVariantCfg(){ |
157 // A vendor of "symbian" and SDK major version 5 is the same as prior naming for "com.nokia.s60" & 5th Edition. |
154 File epocRoot = new File(sdk.getEPOCROOT()); |
158 // Return "s60" so that project template generation continues to work as it's a S60 5th ed. SDK. |
155 File variantCfg; |
159 return ISBSv1BuildInfo.S60_FAMILY_ID; |
156 variantCfg = new File(epocRoot, SymbianSDK.SPP_VARIANT_CFG_FILE); |
160 } else { |
157 if (!variantCfg.exists()) { |
161 return parts[2]; |
158 variantCfg = new File(epocRoot, SymbianSDK.VARIANT_CFG_FILE); |
162 } |
159 if (!variantCfg.exists()) |
163 } |
160 return null; |
164 |
161 } |
165 return ""; |
162 |
166 } |
163 String variantDir = null; |
167 |
164 String variantFile = null; |
168 public Version getSDKVersion(ISymbianSDK sdk) { |
165 try { |
169 if (sdkVersion == null){ |
166 char[] cbuf = new char[(int) variantCfg.length()]; |
170 return new Version("0.0"); |
167 Reader reader = new FileReader(variantCfg); |
171 } |
168 reader.read(cbuf); |
172 return sdkVersion; |
169 reader.close(); |
173 } |
170 String[] lines = new String(cbuf).split("\r\n|\r|\n"); |
174 |
171 for (int i = 0; i < lines.length; i++) { |
175 public File getPrefixFile(ISymbianSDK sdk) { |
172 // skip comments and blank lines |
176 return prefixFile; |
173 String line = SymbianSDK.removeComments(lines[i]); |
177 } |
174 if (line.matches("\\s*#.*") || line.trim().length() == 0) |
178 |
175 continue; |
179 public IPath getToolsPath(ISymbianSDK sdk) { |
176 |
180 String epocRoot = sdk.getEPOCROOT(); |
177 // parse the variant line, which is an EPOCROOT-relative |
181 if (epocRoot.length() > 0) { |
178 // path to a bldvariant.hrh file |
182 IPath epoc32ToolsPath = new Path(epocRoot).append("epoc32/tools"); |
179 Matcher matcher = SymbianSDK.VARIANT_HRH_LINE_PATTERN.matcher(line); |
183 // try to canonicalize it so it matches actual file system case |
180 if (matcher.matches()) { |
184 try { |
181 variantDir = matcher.group(1); |
185 epoc32ToolsPath = new Path(epoc32ToolsPath.toFile().getCanonicalPath()); |
182 variantFile = matcher.group(3); |
186 } catch (IOException e) { |
183 File variantFullPathFile = new File(epocRoot, variantDir + File.separator + variantFile); |
187 } |
184 IPath variantFilePath = new Path(PathUtils.convertPathToUnix(variantFullPathFile.getAbsolutePath())); |
188 return epoc32ToolsPath; |
185 return variantFilePath; |
189 } |
186 } |
190 return null; |
187 } |
191 } |
188 } catch (IOException e) { |
192 |
189 } |
193 public IPath getReleaseRoot(ISymbianSDK sdk) { |
190 |
194 String epocRoot = sdk.getEPOCROOT(); |
191 return null; // can't find the file... |
195 if (epocRoot.length() > 0) { |
192 } |
196 IPath epoc32RelPath = new Path(epocRoot).append("epoc32/release"); |
193 |
197 // try to canonicalize it so it matches actual file system case |
194 public ISBVCatalog getSBVCatalog() { |
198 try { |
195 synchronized (sdk) { |
199 epoc32RelPath = new Path(epoc32RelPath.toFile().getCanonicalPath()); |
196 if (sbvCatalog == null) { |
200 } catch (IOException e) { |
197 sbvCatalog = SBVCatalogFactory.createCatalog(sdk); |
201 } |
198 } |
202 return epoc32RelPath; |
199 } |
203 } |
200 return sbvCatalog; |
204 return null; |
201 } |
205 } |
202 |
206 |
203 public List<String> getTargetTypeMacros(String targettype) { |
207 public IPath getIncludePath(ISymbianSDK sdk) { |
|
208 String epocRoot = sdk.getEPOCROOT(); |
|
209 if (epocRoot.length() > 0) { |
|
210 IPath epoc32IncPath = new Path(epocRoot).append("epoc32/include"); |
|
211 // try to canonicalize it so it matches actual file system case |
|
212 try { |
|
213 epoc32IncPath = new Path(epoc32IncPath.toFile().getCanonicalPath()); |
|
214 } catch (IOException e) { |
|
215 } |
|
216 return epoc32IncPath; |
|
217 } |
|
218 return null; |
|
219 } |
|
220 |
|
221 public String getSDKDescription(ISymbianSDK sdk) { |
|
222 if (sdkDescription == null){ |
|
223 return ""; |
|
224 } |
|
225 return sdkDescription; |
|
226 } |
|
227 |
|
228 public Date getCreationDate(ISymbianSDK sdk) { |
|
229 return createDate; |
|
230 } |
|
231 |
|
232 public File getLicenseFile(ISymbianSDK sdk) { |
|
233 return licenseFile; |
|
234 } |
|
235 |
|
236 public String getSDKOSBranch(ISymbianSDK sdk) { |
|
237 if (sdkOSBranch == null){ |
|
238 return ""; |
|
239 } |
|
240 return sdkOSBranch; |
|
241 } |
|
242 |
|
243 public URL getPublisherURL(ISymbianSDK sdk) { |
|
244 return publisherURL; |
|
245 } |
|
246 |
|
247 public String getPublisherName(ISymbianSDK sdk) { |
|
248 return publisherName; |
|
249 } |
|
250 |
|
251 public List<String> getTargetTypeMacros(ISymbianSDK sdk, String targettype) { |
|
252 // this is based on \epoc32\tools\trgtype.pm which changes from |
204 // this is based on \epoc32\tools\trgtype.pm which changes from |
253 // OS version to OS version, but largely remains constant with |
205 // OS version to OS version, but largely remains constant with |
254 // regards to the basic type. |
206 // regards to the basic type. |
255 List<String> macros = new ArrayList<String>(); |
207 List<String> macros = new ArrayList<String>(); |
256 |
208 |
273 macros.add("__DLL__"); |
225 macros.add("__DLL__"); |
274 } |
226 } |
275 return macros; |
227 return macros; |
276 } |
228 } |
277 |
229 |
278 public IBSFCatalog getBSFCatalog(ISymbianSDK sdk) { |
230 public List<String> getVendorSDKMacros() { |
279 synchronized (sdk) { |
231 ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); |
280 if (bsfCatalog == null) { |
232 return sdkMgr.getSymbianMacroStore().getVendorMacros(sdk.getSDKVersion(), sdk.getName()); |
281 bsfCatalog = BSFCatalogFactory.createCatalog(sdk); |
233 } |
282 } |
234 |
283 } |
235 public boolean isS60() { |
284 return bsfCatalog; |
236 return sdk.getFamily().equals(ISBSv1BuildInfo.S60_FAMILY_ID) |
285 } |
237 || sdk.getFamily().equals(ISBSv1BuildInfo.SERIES60_FAMILY_ID); |
286 |
238 } |
287 public ISBVCatalog getSBVCatalog(ISymbianSDK sdk) { |
239 |
288 synchronized (sdk) { |
240 public boolean isPreviouslyScanned() { |
289 if (sbvCatalog == null) { |
241 return wasScanned; |
290 sbvCatalog = SBVCatalogFactory.createCatalog(sdk); |
242 } |
291 } |
243 |
292 } |
244 public void setPreviouslyScanned(boolean wasScanned) { |
293 return sbvCatalog; |
245 this.wasScanned = wasScanned; |
294 } |
246 } |
295 |
247 |
296 public boolean isDefaultSDK(ISymbianSDK sdk) { |
248 protected List<ISymbianBuildContext> getBinaryVariationPlatformContexts() { |
297 if (sdk instanceof SymbianSDK) { |
|
298 DeviceType deviceEntry = ((SymbianSDK)sdk).getDeviceEntry(); |
|
299 if (deviceEntry == null) { |
|
300 return false; |
|
301 } |
|
302 if (deviceEntry.getDefault().equals(DefaultType.YES_LITERAL)){ |
|
303 return true; |
|
304 } |
|
305 } |
|
306 return false; |
|
307 } |
|
308 |
|
309 public boolean isS60(ISymbianSDK sdk) { |
|
310 return getFamily(sdk).equals(ISBSv1BuildInfo.S60_FAMILY_ID) |
|
311 || getFamily(sdk).equals(ISBSv1BuildInfo.SERIES60_FAMILY_ID); |
|
312 } |
|
313 |
|
314 public boolean isPreviouslyScanned(ISymbianSDK sdk) { |
|
315 if (sdk instanceof SymbianSDK) { |
|
316 return ((SymbianSDK)sdk).isPreviouslyScanned(); |
|
317 } |
|
318 return true; |
|
319 } |
|
320 |
|
321 public void setLicenseFile(ISymbianSDK sdk, File licenseFile) { |
|
322 this.licenseFile = licenseFile; |
|
323 } |
|
324 |
|
325 public void setPrefixFile(ISymbianSDK sdk, IPath prefixFile) { |
|
326 this.prefixFile = new File(prefixFile.toOSString()); |
|
327 } |
|
328 |
|
329 public void setSDKVersion(ISymbianSDK sdk, Version sdkVers) { |
|
330 sdkVersion = sdkVers; |
|
331 } |
|
332 |
|
333 public void setPublisherURL(ISymbianSDK sdk, URL pubURL) { |
|
334 publisherURL = pubURL; |
|
335 } |
|
336 |
|
337 public void setCreateDate(ISymbianSDK sdk, Date createDate) { |
|
338 this.createDate = createDate; |
|
339 } |
|
340 |
|
341 public void setOSSDKBranch(ISymbianSDK sdk, String branch) { |
|
342 sdkOSBranch = branch; |
|
343 } |
|
344 |
|
345 public void setSDKDescription(ISymbianSDK sdk, String descr) { |
|
346 sdkDescription = descr; |
|
347 } |
|
348 |
|
349 public void setPublisherName(ISymbianSDK sdk, String pubName) { |
|
350 publisherName = pubName; |
|
351 } |
|
352 |
|
353 public void setName(ISymbianSDK sdk, String name) { |
|
354 if (sdk instanceof SymbianSDK) { |
|
355 DeviceType deviceEntry = ((SymbianSDK)sdk).getDeviceEntry(); |
|
356 if (deviceEntry != null) { |
|
357 deviceEntry.setName(name); |
|
358 } |
|
359 } |
|
360 } |
|
361 |
|
362 public void setIsDefaultSDK(ISymbianSDK sdk, boolean isDefault) { |
|
363 if (sdk instanceof SymbianSDK) { |
|
364 DeviceType deviceEntry = ((SymbianSDK)sdk).getDeviceEntry(); |
|
365 if (deviceEntry != null) { |
|
366 if (isDefault){ |
|
367 deviceEntry.setDefault(DefaultType.YES_LITERAL); |
|
368 } else { |
|
369 deviceEntry.setDefault(DefaultType.NO_LITERAL); |
|
370 } |
|
371 } |
|
372 } |
|
373 } |
|
374 |
|
375 public void setPreviouslyScanned(ISymbianSDK sdk, boolean wasScanned) { |
|
376 if (sdk instanceof SymbianSDK) { |
|
377 ((SymbianSDK)sdk).setPreviouslyScanned(wasScanned); |
|
378 } |
|
379 } |
|
380 |
|
381 protected List<ISymbianBuildContext> getBinaryVariationPlatformContexts(ISymbianSDK sdk) { |
|
382 synchronized (binaryVariantContextList) { |
249 synchronized (binaryVariantContextList) { |
383 if (!binaryVariantContextList.isEmpty()){ |
250 if (!binaryVariantContextList.isEmpty()){ |
384 return binaryVariantContextList; |
251 return binaryVariantContextList; |
385 } |
252 } |
386 |
253 |
387 ISBVCatalog catalog = getSBVCatalog(sdk); |
254 ISBVCatalog catalog = getSBVCatalog(); |
388 for (ISBVPlatform sbvPlatform : catalog.getPlatforms()) { |
255 for (ISBVPlatform sbvPlatform : catalog.getPlatforms()) { |
389 // Currently only variation of ARMV5 is supported... So just hard code the variated platform |
256 // Currently only variation of ARMV5 is supported... So just hard code the variated platform |
390 // Only add the build platform if it's not virtual. |
257 // Only add the build platform if it's not virtual. |
391 if (!sbvPlatform.isVirtual()){ |
258 if (!sbvPlatform.isVirtual()){ |
392 // TODO: Hard code build context hack |
259 // TODO: Hard code build context hack |