From 803b9890e2bd8f709ba8f84af169066216e096bb Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Mon, 10 Feb 2025 20:06:22 -0800 Subject: [PATCH 01/11] Beef custom properties proof of concept implementation. --- BeefBuild/src/BuildApp.bf | 16 ++++++ IDE/src/IDEApp.bf | 96 ++++++++++++++++++++++++++++++++++ IDE/src/Project.bf | 6 +++ IDE/src/ui/NewProjectDialog.bf | 3 +- 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/BeefBuild/src/BuildApp.bf b/BeefBuild/src/BuildApp.bf index e762303e..126752a6 100644 --- a/BeefBuild/src/BuildApp.bf +++ b/BeefBuild/src/BuildApp.bf @@ -110,6 +110,7 @@ namespace BeefBuild { mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); + LoadProperties(); LoadWorkspace(mVerb); } else @@ -303,6 +304,21 @@ namespace BeefBuild if (mPackMan.mCleanHashSet.TryAddAlt(value, var entryPtr)) *entryPtr = new .(value); return true; + case "-property": + int splitIdx = (int)value.IndexOf('='); + if (splitIdx != -1) + { + String propertyKey = new String(); + StringView propertyKeyView = value.Substring(0, splitIdx); + propertyKeyView.ToString(propertyKey); + + String propertyValue = new String(); + StringView propertyValueView = value.Substring(splitIdx + 1, value.Length - splitIdx - 1); + propertyValueView.ToString(propertyValue); + + mCustomProperties.Add(propertyKey, propertyValue); + return true; + } } } diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index a437bc52..be18fdc1 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -229,6 +229,7 @@ namespace IDE public HashSet mWantUpdateVersionLocks ~ DeleteContainerAndItems!(_); public Settings mSettings = new Settings() ~ delete _; public Workspace mWorkspace = new Workspace() ~ delete _; + public Dictionary mCustomProperties = new .() ~ DeleteDictionaryAndValues!(_); public FileWatcher mFileWatcher = new FileWatcher() ~ delete _; #if !CLI public FileRecovery mFileRecovery = new FileRecovery() ~ delete _; @@ -894,6 +895,8 @@ namespace IDE mExecutionPaused = false; } + ClearProperties(); + base.Shutdown(); } @@ -987,6 +990,7 @@ namespace IDE mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); + LoadProperties(true); LoadWorkspace(.OpenOrNew); FinishShowingNewWorkspace(); } @@ -2258,6 +2262,23 @@ namespace IDE outResult.Append(mInstallDir, "/DefaultLayout.toml"); } + void GetPropertiesFileName(String outResult) + { + String workspaceDir = scope String(); + + if (mWorkspace.mDir == null) + { + Directory.GetCurrentDirectory(workspaceDir); + } + else + { + workspaceDir = mWorkspace.mDir; + } + + outResult.Append(workspaceDir, "/BeefProperties.toml"); + IDEUtils.FixFilePath(outResult); + } + bool GetWorkspaceFileName(String outResult) { if (mWorkspace.mDir == null) @@ -2957,6 +2978,65 @@ namespace IDE FlushDeferredLoadProjects(); } + public void ClearProperties() + { + for (var entry in mCustomProperties) + { + delete entry.key; + delete entry.value; + } + + mCustomProperties.Clear(); + } + + public void LoadProperties(bool clear = false) + { + const char8* PROPERTIES_STR = "Properties"; + + if (clear) + { + ClearProperties(); + } + + String propertiesFileName = scope String(); + GetPropertiesFileName(propertiesFileName); + + if (!File.Exists(propertiesFileName)) + { + return; + } + + StructuredData data = scope StructuredData(); + if (StructuredLoad(data, propertiesFileName) case .Err(let err)) + { + OutputErrorLine("Failed to load properties '{0}'", propertiesFileName); + LoadFailed(); + return; + } + + if (!data.Contains(PROPERTIES_STR)) + { + return; + } + + for (var propertyName in data.Enumerate(PROPERTIES_STR)) + { + String propertyKey = new String(); + propertyName.ToString(propertyKey); + + if (mCustomProperties.ContainsKey(propertyKey)) + { + delete propertyKey; + continue; + } + + String propertyValue = new String(); + data.GetCurString(propertyValue); + + mCustomProperties.Add(propertyKey, propertyValue); + } + } + protected void LoadWorkspace(BeefVerb verb) { scope AutoBeefPerf("IDEApp.LoadWorkspace"); @@ -3135,6 +3215,15 @@ namespace IDE LoadFailed(); continue; } + else if (projSpec.mVerSpec case .Path(let projPath)) + { + String resolvedProjPath = scope String(); + if (gApp.ResolveConfigString(null, null, null, null, projPath, "custom properties", resolvedProjPath)) + { + projPath.Clear(); + projPath.Append(resolvedProjPath); + } + } switch (AddProject(projectName, projSpec.mVerSpec)) { @@ -3184,6 +3273,7 @@ namespace IDE CloseWorkspace(); mWorkspace.mDir = new String(workspaceDir); mWorkspace.mName = new String(workspaceName); + LoadProperties(true); LoadWorkspace(.Open); FinishShowingNewWorkspace(); } @@ -10920,6 +11010,12 @@ namespace IDE case "BeefPath": newString = gApp.mInstallDir; default: + // Check if any custom properties match the string. + if (mCustomProperties.ContainsKey(replaceStr)) + { + newString = scope:ReplaceBlock String(); + newString.Append(mCustomProperties[replaceStr]); + } } } diff --git a/IDE/src/Project.bf b/IDE/src/Project.bf index 02cb0733..d98a4ce1 100644 --- a/IDE/src/Project.bf +++ b/IDE/src/Project.bf @@ -1040,6 +1040,12 @@ namespace IDE data.GetString("Copyright", mCopyright); data.GetString("FileVersion", mFileVersion); data.GetString("ProductVersion", mProductVersion); + String resolvedProductVersion = scope String(); + if (gApp.ResolveConfigString(null, null, null, null, mProductVersion, "custom properties", resolvedProductVersion)) + { + mProductVersion.Clear(); + mProductVersion.Append(resolvedProductVersion); + } } public void Serialize(StructuredData data) diff --git a/IDE/src/ui/NewProjectDialog.bf b/IDE/src/ui/NewProjectDialog.bf index a3e10709..623eac71 100644 --- a/IDE/src/ui/NewProjectDialog.bf +++ b/IDE/src/ui/NewProjectDialog.bf @@ -142,7 +142,8 @@ namespace IDE.ui DeleteAndNullify!(app.mWorkspace.mDir); app.mWorkspace.mDir = new String(projDirectory); app.mWorkspace.mName = new String(projName); - + + app.LoadProperties(true); app.[Friend]LoadWorkspace(.OpenOrNew); app.[Friend]FinishShowingNewWorkspace(false); From b55f9805314cffadf816cd1b25bc732e2e99d182 Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Thu, 27 Mar 2025 15:28:12 -0700 Subject: [PATCH 02/11] Refactored code to resolve custom build properties in Beef projects. --- IDE/src/BuildContext.bf | 3 + IDE/src/CustomBuildProperties.bf | 580 +++++++++++++++++++++++++++++++ IDE/src/IDEApp.bf | 78 +---- IDE/src/ui/NewProjectDialog.bf | 1 - 4 files changed, 585 insertions(+), 77 deletions(-) create mode 100644 IDE/src/CustomBuildProperties.bf diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index 31f7a5a0..d4c42310 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -1375,6 +1375,9 @@ namespace IDE public bool QueueProjectCompile(Project project, Project hotProject, IDEApp.BuildCompletedCmd completedCompileCmd, List hotFileNames, CompileKind compileKind) { + CustomBuildProperties.ResolveProjectProperties(project); + defer CustomBuildProperties.UnresolveProjectProperties(project); + project.mLastDidBuild = false; TestManager.ProjectInfo testProjectInfo = null; diff --git a/IDE/src/CustomBuildProperties.bf b/IDE/src/CustomBuildProperties.bf new file mode 100644 index 00000000..2bcd8ec3 --- /dev/null +++ b/IDE/src/CustomBuildProperties.bf @@ -0,0 +1,580 @@ +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using Beefy.utils; + +namespace IDE +{ + class CustomBuildProperties + { + static String[?] BUILT_IN_PROPERTIES = .( + "Slash", + "Var", + "Arguments", + "BuildDir", + "LinkFlags", + "ProjectDir", + "ProjectName", + "TargetDir", + "TargetPath", + "WorkingDir", + "ProjectName", + "VSToolPath", + "VSToolPath_x86", + "VSToolPath_x64", + "EmccPath", + "ScriptDir", + "Configuration", + "Platform", + "WorkspaceDir", + "BeefPath" + ); + + static Dictionary mProperties = new .() ~ DeleteDictionaryAndKeysAndValues!(_); + static Dictionary mProjects = new .() ~ DeleteDictionaryAndValues!(_); + + static public void GetFileName(String outResult) + { + String workspaceDir = scope String(); + + if (gApp.mWorkspace.mDir == null) + Directory.GetCurrentDirectory(workspaceDir); + else + workspaceDir = gApp.mWorkspace.mDir; + + outResult.Append(workspaceDir, "/BeefProperties.toml"); + } + + static public void Clear() + { + for (var entry in mProperties) + { + delete entry.key; + delete entry.value; + } + + for (var entry in mProjects) + delete entry.value; + + mProperties.Clear(); + mProjects.Clear(); + } + + static public void Load() + { + const char8* PROPERTIES_STR = "Properties"; + + Clear(); + + String propertiesFileName = scope String(); + GetFileName(propertiesFileName); + + if (!File.Exists(propertiesFileName)) + return; + + StructuredData data = scope StructuredData(); + if (gApp.StructuredLoad(data, propertiesFileName) case .Err(let err)) + { + gApp.OutputErrorLine("Failed to load properties from: '{0}'", propertiesFileName); + return; + } + + if (!data.Contains(PROPERTIES_STR)) + return; + + for (var property in data.Enumerate(PROPERTIES_STR)) + { + String propertyStr = new String(); + property.ToString(propertyStr); + + if (Contains(propertyStr)) + { + delete propertyStr; + continue; + } + + String propertyValue = new String(); + data.GetCurString(propertyValue); + + mProperties.Add(propertyStr, propertyValue); + } + } + + static public bool Contains(String property) + { + return mProperties.ContainsKey(property); + } + + static public String Get(String property) + { + if (!Contains(property)) + return null; + + return mProperties[property]; + } + + static public void ResolveString(StringView configString, String outResult) + { + outResult.Set(configString); + + // Find the property to resolve (if any). + int i = 0; + for (; i < outResult.Length - 2; i++) + { + if ((outResult[i] == '$') && (outResult[i + 1] == '(')) + { + int parenPos = -1; + int openCount = 1; + bool inString = false; + char8 prevC = 0; + for (int checkIdx = i + 2; checkIdx < outResult.Length; checkIdx++) + { + char8 c = outResult[checkIdx]; + if (inString) + { + if (prevC == '\\') + { + // Slashed char + prevC = 0; + continue; + } + + if (c == '"') + inString = false; + } + else + { + if (c == '"') + inString = true; + else if (c == '(') + openCount++; + else if (c == ')') + { + openCount--; + if (openCount == 0) + { + parenPos = checkIdx; + break; + } + } + } + + prevC = c; + } + + if (parenPos != -1) + ReplaceBlock: + do + { + // If we reach here, a property has been found. + String replaceStr = scope String(outResult, i + 2, parenPos - i - 2); + + // Ignore built-in properties because they are resolved elsewhere. + if (BUILT_IN_PROPERTIES.Contains(replaceStr)) + continue; + + String newString = Get(replaceStr); + + // Resolve custom property value. + if (newString != null) + { + outResult.Remove(i, parenPos - i + 1); + outResult.Insert(i, newString); + i--; + } + } + } + } + } + + static public void ResolveWorkspaceProperties(Workspace workspace) + { + + } + + static public void ResolveProjectProperties(Project project) + { + if (project == null) + return; + + Project unresolvedProject = new Project(); + mProjects[project] = unresolvedProject; + + // Deep copy the project so unresolved custom build properties can be restored later, + // and resolve any custom build properties in place in the existing project. + if (project.mNamespace != null) + { + unresolvedProject.mNamespace.Set(project.mNamespace); + ResolveString(unresolvedProject.mNamespace, project.mNamespace); + } + + if (project.mProjectDir != null) + { + unresolvedProject.mProjectDir.Set(project.mProjectDir); + ResolveString(unresolvedProject.mProjectDir, project.mProjectDir); + } + + if (project.mProjectName != null) + { + unresolvedProject.mProjectName.Set(project.mProjectName); + ResolveString(unresolvedProject.mProjectName, project.mProjectName); + } + + if (project.mProjectPath != null) + { + unresolvedProject.mProjectPath.Set(project.mProjectPath); + ResolveString(unresolvedProject.mProjectPath, project.mProjectPath); + } + + if (project.mManagedInfo != null) + { + unresolvedProject.mManagedInfo = new Project.ManagedInfo(); + unresolvedProject.mManagedInfo.mVersion.mVersion.Set(project.mManagedInfo.mVersion.mVersion); + unresolvedProject.mManagedInfo.mInfo.Set(project.mManagedInfo.mInfo); + + ResolveString(unresolvedProject.mManagedInfo.mVersion.mVersion, project.mManagedInfo.mVersion.mVersion); + ResolveString(unresolvedProject.mManagedInfo.mInfo, project.mManagedInfo.mInfo); + } + + if (project.mConfigs != null) + { + DeleteDictionaryAndKeysAndValues!(unresolvedProject.mConfigs); + unresolvedProject.mConfigs = new Dictionary(); + + for (var config in project.mConfigs) + { + Project.Config unresolvedConfig = new Project.Config(); + + for (var platform in config.value.mPlatforms) + { + Project.Options unresolvedOptions = platform.value.Duplicate(); + unresolvedConfig.mPlatforms[new String(platform.key)] = unresolvedOptions; + + ResolveString(unresolvedOptions.mBuildOptions.mTargetDirectory, platform.value.mBuildOptions.mTargetDirectory); + ResolveString(unresolvedOptions.mBuildOptions.mTargetName, platform.value.mBuildOptions.mTargetName); + ResolveString(unresolvedOptions.mBuildOptions.mOtherLinkFlags, platform.value.mBuildOptions.mOtherLinkFlags); + + for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mLibPaths.Count; i++) + ResolveString(unresolvedOptions.mBuildOptions.mLibPaths[i], platform.value.mBuildOptions.mLibPaths[i]); + + for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mLinkDependencies.Count; i++) + ResolveString(unresolvedOptions.mBuildOptions.mLinkDependencies[i], platform.value.mBuildOptions.mLinkDependencies[i]); + + for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mPreBuildCmds.Count; i++) + ResolveString(unresolvedOptions.mBuildOptions.mPreBuildCmds[i], platform.value.mBuildOptions.mPreBuildCmds[i]); + + for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mPostBuildCmds.Count; i++) + ResolveString(unresolvedOptions.mBuildOptions.mPostBuildCmds[i], platform.value.mBuildOptions.mPostBuildCmds[i]); + + for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mCleanCmds.Count; i++) + ResolveString(unresolvedOptions.mBuildOptions.mCleanCmds[i], platform.value.mBuildOptions.mCleanCmds[i]); + + for (int32 i = 0; i < unresolvedOptions.mBeefOptions.mPreprocessorMacros.Count; i++) + ResolveString(unresolvedOptions.mBeefOptions.mPreprocessorMacros[i], platform.value.mBeefOptions.mPreprocessorMacros[i]); + + for (int32 i = 0; i < unresolvedOptions.mBeefOptions.mDistinctBuildOptions.Count; i++) + { + ResolveString(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mFilter, platform.value.mBeefOptions.mDistinctBuildOptions[i].mFilter); + ResolveString(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter, platform.value.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter); + } + + ResolveString(unresolvedOptions.mCOptions.mOtherCFlags, platform.value.mCOptions.mOtherCFlags); + ResolveString(unresolvedOptions.mCOptions.mOtherCPPFlags, platform.value.mCOptions.mOtherCPPFlags); + + for (int32 i = 0; i < unresolvedOptions.mCOptions.mIncludePaths.Count; i++) + ResolveString(unresolvedOptions.mCOptions.mIncludePaths[i], platform.value.mCOptions.mIncludePaths[i]); + + for (int32 i = 0; i < unresolvedOptions.mCOptions.mPreprocessorMacros.Count; i++) + ResolveString(unresolvedOptions.mCOptions.mPreprocessorMacros[i], platform.value.mCOptions.mPreprocessorMacros[i]); + + ResolveString(unresolvedOptions.mCOptions.mAddressSanitizer, platform.value.mCOptions.mAddressSanitizer); + + for (int32 i = 0; i < unresolvedOptions.mCOptions.mSpecificWarningsAsErrors.Count; i++) + ResolveString(unresolvedOptions.mCOptions.mSpecificWarningsAsErrors[i], platform.value.mCOptions.mSpecificWarningsAsErrors[i]); + + for (int32 i = 0; i < unresolvedOptions.mCOptions.mDisableSpecificWarnings.Count; i++) + ResolveString(unresolvedOptions.mCOptions.mDisableSpecificWarnings[i], platform.value.mCOptions.mDisableSpecificWarnings[i]); + + ResolveString(unresolvedOptions.mDebugOptions.mCommand, platform.value.mDebugOptions.mCommand); + ResolveString(unresolvedOptions.mDebugOptions.mCommandArguments, platform.value.mDebugOptions.mCommandArguments); + ResolveString(unresolvedOptions.mDebugOptions.mWorkingDirectory, platform.value.mDebugOptions.mWorkingDirectory); + + for (int32 i = 0; i < unresolvedOptions.mDebugOptions.mEnvironmentVars.Count; i++) + ResolveString(unresolvedOptions.mDebugOptions.mEnvironmentVars[i], platform.value.mDebugOptions.mEnvironmentVars[i]); + } + + unresolvedProject.mConfigs[new String(config.key)] = unresolvedConfig; + } + } + + if (project.mGeneralOptions != null) + { + unresolvedProject.mGeneralOptions.mProjectNameDecl.Set(project.mGeneralOptions.mProjectNameDecl); + ResolveString(unresolvedProject.mGeneralOptions.mProjectNameDecl, project.mGeneralOptions.mProjectNameDecl); + + unresolvedProject.mGeneralOptions.mVersion.mVersion.Set(project.mGeneralOptions.mVersion.mVersion); + ResolveString(unresolvedProject.mGeneralOptions.mVersion.mVersion, project.mGeneralOptions.mVersion.mVersion); + + unresolvedProject.mGeneralOptions.mAliases.Clear(); + for (String alias in project.mGeneralOptions.mAliases) + { + String unresolvedAlias = new String(alias); + unresolvedProject.mGeneralOptions.mAliases.Add(unresolvedAlias); + ResolveString(unresolvedAlias, alias); + } + } + + if (project.mBeefGlobalOptions != null) + { + unresolvedProject.mBeefGlobalOptions.mStartupObject.Set(project.mBeefGlobalOptions.mStartupObject); + ResolveString(unresolvedProject.mBeefGlobalOptions.mStartupObject, project.mBeefGlobalOptions.mStartupObject); + + unresolvedProject.mBeefGlobalOptions.mDefaultNamespace.Set(project.mBeefGlobalOptions.mDefaultNamespace); + ResolveString(unresolvedProject.mBeefGlobalOptions.mDefaultNamespace, project.mBeefGlobalOptions.mDefaultNamespace); + + unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros.Clear(); + for (String macro in project.mBeefGlobalOptions.mPreprocessorMacros) + { + String unresolvedMacro = new String(macro); + unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros.Add(unresolvedMacro); + ResolveString(unresolvedMacro, macro); + } + + unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions.Clear(); + for (DistinctBuildOptions options in project.mBeefGlobalOptions.mDistinctBuildOptions) + { + DistinctBuildOptions unresolvedOptions = new DistinctBuildOptions(); + + unresolvedOptions.mFilter.Set(options.mFilter); + unresolvedOptions.mReflectMethodFilter.Set(options.mReflectMethodFilter); + unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions.Add(unresolvedOptions); + + ResolveString(unresolvedOptions.mFilter, options.mFilter); + ResolveString(unresolvedOptions.mReflectMethodFilter, options.mReflectMethodFilter); + } + } + + if (project.mWindowsOptions != null) + { + unresolvedProject.mWindowsOptions.mIconFile.Set(project.mWindowsOptions.mIconFile); + unresolvedProject.mWindowsOptions.mManifestFile.Set(project.mWindowsOptions.mManifestFile); + unresolvedProject.mWindowsOptions.mDescription.Set(project.mWindowsOptions.mDescription); + unresolvedProject.mWindowsOptions.mComments.Set(project.mWindowsOptions.mComments); + unresolvedProject.mWindowsOptions.mCompany.Set(project.mWindowsOptions.mCompany); + unresolvedProject.mWindowsOptions.mProduct.Set(project.mWindowsOptions.mProduct); + unresolvedProject.mWindowsOptions.mCopyright.Set(project.mWindowsOptions.mCopyright); + unresolvedProject.mWindowsOptions.mFileVersion.Set(project.mWindowsOptions.mFileVersion); + unresolvedProject.mWindowsOptions.mProductVersion.Set(project.mWindowsOptions.mProductVersion); + + ResolveString(unresolvedProject.mWindowsOptions.mIconFile, project.mWindowsOptions.mIconFile); + ResolveString(unresolvedProject.mWindowsOptions.mManifestFile, project.mWindowsOptions.mManifestFile); + ResolveString(unresolvedProject.mWindowsOptions.mDescription, project.mWindowsOptions.mDescription); + ResolveString(unresolvedProject.mWindowsOptions.mComments, project.mWindowsOptions.mComments); + ResolveString(unresolvedProject.mWindowsOptions.mCompany, project.mWindowsOptions.mCompany); + ResolveString(unresolvedProject.mWindowsOptions.mProduct, project.mWindowsOptions.mProduct); + ResolveString(unresolvedProject.mWindowsOptions.mCopyright, project.mWindowsOptions.mCopyright); + ResolveString(unresolvedProject.mWindowsOptions.mFileVersion, project.mWindowsOptions.mFileVersion); + ResolveString(unresolvedProject.mWindowsOptions.mProductVersion, project.mWindowsOptions.mProductVersion); + } + + if (project.mLinuxOptions != null) + { + unresolvedProject.mLinuxOptions.mOptions.Set(project.mLinuxOptions.mOptions); + ResolveString(unresolvedProject.mLinuxOptions.mOptions, project.mLinuxOptions.mOptions); + } + + if (project.mDependencies != null) + { + unresolvedProject.mDependencies.Clear(); + for (Project.Dependency dependency in project.mDependencies) + { + Project.Dependency unresolvedDependency = new Project.Dependency(); + + unresolvedDependency.mVerSpec = dependency.mVerSpec.Duplicate(); + + if (dependency.mProjectName != null) + { + unresolvedDependency.mProjectName = new String(); + unresolvedDependency.mProjectName.Set(dependency.mProjectName); + ResolveString(unresolvedDependency.mProjectName, dependency.mProjectName); + } + + unresolvedProject.mDependencies.Add(unresolvedDependency); + } + } + } + + static public void UnresolveProjectProperties(Project project) + { + if (project == null) + return; + + if (!mProjects.ContainsKey(project)) + return; + + Project unresolvedProject = mProjects[project]; + + // Unpack unresolved strings into the project. + if (project.mNamespace != null) + project.mNamespace.Set(unresolvedProject.mNamespace); + + if (project.mProjectDir != null) + project.mProjectDir.Set(unresolvedProject.mProjectDir); + + if (project.mProjectName != null) + project.mProjectName.Set(unresolvedProject.mProjectName); + + if (project.mProjectPath != null) + project.mProjectPath.Set(unresolvedProject.mProjectPath); + + if (project.mManagedInfo != null) + { + project.mManagedInfo.mVersion.mVersion.Set(unresolvedProject.mManagedInfo.mVersion.mVersion); + project.mManagedInfo.mInfo.Set(unresolvedProject.mManagedInfo.mInfo); + } + + if (project.mConfigs != null) + { + for (var config in project.mConfigs) + { + Project.Config unresolvedConfig = null; + + for (var c in unresolvedProject.mConfigs) + { + if (config.key.Equals(c.key)) + { + unresolvedConfig = c.value; + break; + } + } + + if (unresolvedConfig == null) + continue; + + for (var platform in config.value.mPlatforms) + { + Project.Options unresolvedOptions = null; + + for (var p in unresolvedConfig.mPlatforms) + { + if (platform.key.Equals(p.key)) + { + unresolvedOptions = p.value; + break; + } + } + + if (unresolvedOptions == null) + continue; + + platform.value.mBuildOptions.mTargetDirectory.Set(unresolvedOptions.mBuildOptions.mTargetDirectory); + platform.value.mBuildOptions.mTargetName.Set(unresolvedOptions.mBuildOptions.mTargetName); + platform.value.mBuildOptions.mOtherLinkFlags.Set(unresolvedOptions.mBuildOptions.mOtherLinkFlags); + + for (int32 i = 0; i < platform.value.mBuildOptions.mLibPaths.Count; i++) + platform.value.mBuildOptions.mLibPaths[i].Set(unresolvedOptions.mBuildOptions.mLibPaths[i]); + + for (int32 i = 0; i < platform.value.mBuildOptions.mLinkDependencies.Count; i++) + platform.value.mBuildOptions.mLinkDependencies[i].Set(unresolvedOptions.mBuildOptions.mLinkDependencies[i]); + + for (int32 i = 0; i < platform.value.mBuildOptions.mPreBuildCmds.Count; i++) + platform.value.mBuildOptions.mPreBuildCmds[i].Set(unresolvedOptions.mBuildOptions.mPreBuildCmds[i]); + + for (int32 i = 0; i < platform.value.mBuildOptions.mPostBuildCmds.Count; i++) + platform.value.mBuildOptions.mPostBuildCmds[i].Set(unresolvedOptions.mBuildOptions.mPostBuildCmds[i]); + + for (int32 i = 0; i < platform.value.mBuildOptions.mCleanCmds.Count; i++) + platform.value.mBuildOptions.mCleanCmds[i].Set(unresolvedOptions.mBuildOptions.mCleanCmds[i]); + + for (int32 i = 0; i < platform.value.mBeefOptions.mPreprocessorMacros.Count; i++) + platform.value.mBeefOptions.mPreprocessorMacros[i].Set(unresolvedOptions.mBeefOptions.mPreprocessorMacros[i]); + + for (int32 i = 0; i < platform.value.mBeefOptions.mDistinctBuildOptions.Count; i++) + { + platform.value.mBeefOptions.mDistinctBuildOptions[i].mFilter.Set(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mFilter); + platform.value.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter.Set(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter); + } + + platform.value.mCOptions.mOtherCFlags.Set(unresolvedOptions.mCOptions.mOtherCFlags); + platform.value.mCOptions.mOtherCPPFlags.Set(unresolvedOptions.mCOptions.mOtherCPPFlags); + + for (int32 i = 0; i < platform.value.mCOptions.mIncludePaths.Count; i++) + platform.value.mCOptions.mIncludePaths[i].Set(unresolvedOptions.mCOptions.mIncludePaths[i]); + + for (int32 i = 0; i < platform.value.mCOptions.mPreprocessorMacros.Count; i++) + platform.value.mCOptions.mPreprocessorMacros[i].Set(unresolvedOptions.mCOptions.mPreprocessorMacros[i]); + + platform.value.mCOptions.mAddressSanitizer.Set(unresolvedOptions.mCOptions.mAddressSanitizer); + + for (int32 i = 0; i < platform.value.mCOptions.mSpecificWarningsAsErrors.Count; i++) + platform.value.mCOptions.mSpecificWarningsAsErrors[i].Set(unresolvedOptions.mCOptions.mSpecificWarningsAsErrors[i]); + + for (int32 i = 0; i < platform.value.mCOptions.mDisableSpecificWarnings.Count; i++) + platform.value.mCOptions.mDisableSpecificWarnings[i].Set(unresolvedOptions.mCOptions.mDisableSpecificWarnings[i]); + + platform.value.mDebugOptions.mCommand.Set(unresolvedOptions.mDebugOptions.mCommand); + platform.value.mDebugOptions.mCommandArguments.Set(unresolvedOptions.mDebugOptions.mCommandArguments); + platform.value.mDebugOptions.mWorkingDirectory.Set(unresolvedOptions.mDebugOptions.mWorkingDirectory); + + for (int32 i = 0; i < platform.value.mDebugOptions.mEnvironmentVars.Count; i++) + platform.value.mDebugOptions.mEnvironmentVars[i].Set(unresolvedOptions.mDebugOptions.mEnvironmentVars[i]); + } + } + } + + if (project.mGeneralOptions != null) + { + project.mGeneralOptions.mProjectNameDecl.Set(unresolvedProject.mGeneralOptions.mProjectNameDecl); + project.mGeneralOptions.mVersion.mVersion.Set(unresolvedProject.mGeneralOptions.mVersion.mVersion); + + for (int32 i = 0; i < project.mGeneralOptions.mAliases.Count; i++) + project.mGeneralOptions.mAliases[i].Set(unresolvedProject.mGeneralOptions.mAliases[i]); + } + + if (project.mBeefGlobalOptions != null) + { + project.mBeefGlobalOptions.mStartupObject.Set(unresolvedProject.mBeefGlobalOptions.mStartupObject); + project.mBeefGlobalOptions.mDefaultNamespace.Set(unresolvedProject.mBeefGlobalOptions.mDefaultNamespace); + + for (int32 i = 0; i < project.mBeefGlobalOptions.mPreprocessorMacros.Count; i++) + project.mBeefGlobalOptions.mPreprocessorMacros[i].Set(unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros[i]); + + for (int32 i = 0; i < project.mBeefGlobalOptions.mDistinctBuildOptions.Count; i++) + { + project.mBeefGlobalOptions.mDistinctBuildOptions[i].mFilter.Set(unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions[i].mFilter); + project.mBeefGlobalOptions.mDistinctBuildOptions[i].mReflectMethodFilter.Set(unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions[i].mReflectMethodFilter); + } + } + + if (project.mWindowsOptions != null) + { + project.mWindowsOptions.mIconFile.Set(unresolvedProject.mWindowsOptions.mIconFile); + project.mWindowsOptions.mManifestFile.Set(unresolvedProject.mWindowsOptions.mManifestFile); + project.mWindowsOptions.mDescription.Set(unresolvedProject.mWindowsOptions.mDescription); + project.mWindowsOptions.mComments.Set(unresolvedProject.mWindowsOptions.mComments); + project.mWindowsOptions.mCompany.Set(unresolvedProject.mWindowsOptions.mCompany); + project.mWindowsOptions.mProduct.Set(unresolvedProject.mWindowsOptions.mProduct); + project.mWindowsOptions.mCopyright.Set(unresolvedProject.mWindowsOptions.mCopyright); + project.mWindowsOptions.mFileVersion.Set(unresolvedProject.mWindowsOptions.mFileVersion); + project.mWindowsOptions.mProductVersion.Set(unresolvedProject.mWindowsOptions.mProductVersion); + } + + if (project.mLinuxOptions != null) + project.mLinuxOptions.mOptions.Set(unresolvedProject.mLinuxOptions.mOptions); + + if (project.mDependencies != null) + { + for (int32 i = 0; i < project.mDependencies.Count; i++) + { + if (project.mDependencies[i].mProjectName != null) + project.mDependencies[i].mProjectName.Set(unresolvedProject.mDependencies[i].mProjectName); + } + } + + // Clean up unresolved project. + delete mProjects[project]; + mProjects.Remove(project); + } + } +} diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index be18fdc1..98c98d80 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -229,7 +229,6 @@ namespace IDE public HashSet mWantUpdateVersionLocks ~ DeleteContainerAndItems!(_); public Settings mSettings = new Settings() ~ delete _; public Workspace mWorkspace = new Workspace() ~ delete _; - public Dictionary mCustomProperties = new .() ~ DeleteDictionaryAndValues!(_); public FileWatcher mFileWatcher = new FileWatcher() ~ delete _; #if !CLI public FileRecovery mFileRecovery = new FileRecovery() ~ delete _; @@ -895,8 +894,6 @@ namespace IDE mExecutionPaused = false; } - ClearProperties(); - base.Shutdown(); } @@ -990,7 +987,6 @@ namespace IDE mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); - LoadProperties(true); LoadWorkspace(.OpenOrNew); FinishShowingNewWorkspace(); } @@ -2267,16 +2263,11 @@ namespace IDE String workspaceDir = scope String(); if (mWorkspace.mDir == null) - { Directory.GetCurrentDirectory(workspaceDir); - } else - { workspaceDir = mWorkspace.mDir; - } outResult.Append(workspaceDir, "/BeefProperties.toml"); - IDEUtils.FixFilePath(outResult); } bool GetWorkspaceFileName(String outResult) @@ -2978,69 +2969,12 @@ namespace IDE FlushDeferredLoadProjects(); } - public void ClearProperties() - { - for (var entry in mCustomProperties) - { - delete entry.key; - delete entry.value; - } - - mCustomProperties.Clear(); - } - - public void LoadProperties(bool clear = false) - { - const char8* PROPERTIES_STR = "Properties"; - - if (clear) - { - ClearProperties(); - } - - String propertiesFileName = scope String(); - GetPropertiesFileName(propertiesFileName); - - if (!File.Exists(propertiesFileName)) - { - return; - } - - StructuredData data = scope StructuredData(); - if (StructuredLoad(data, propertiesFileName) case .Err(let err)) - { - OutputErrorLine("Failed to load properties '{0}'", propertiesFileName); - LoadFailed(); - return; - } - - if (!data.Contains(PROPERTIES_STR)) - { - return; - } - - for (var propertyName in data.Enumerate(PROPERTIES_STR)) - { - String propertyKey = new String(); - propertyName.ToString(propertyKey); - - if (mCustomProperties.ContainsKey(propertyKey)) - { - delete propertyKey; - continue; - } - - String propertyValue = new String(); - data.GetCurString(propertyValue); - - mCustomProperties.Add(propertyKey, propertyValue); - } - } - protected void LoadWorkspace(BeefVerb verb) { scope AutoBeefPerf("IDEApp.LoadWorkspace"); + CustomBuildProperties.Load(); + AddRecentFile(.OpenedWorkspace, mWorkspace.mDir); StructuredData data = null; @@ -3273,7 +3207,6 @@ namespace IDE CloseWorkspace(); mWorkspace.mDir = new String(workspaceDir); mWorkspace.mName = new String(workspaceName); - LoadProperties(true); LoadWorkspace(.Open); FinishShowingNewWorkspace(); } @@ -11009,13 +10942,6 @@ namespace IDE } case "BeefPath": newString = gApp.mInstallDir; - default: - // Check if any custom properties match the string. - if (mCustomProperties.ContainsKey(replaceStr)) - { - newString = scope:ReplaceBlock String(); - newString.Append(mCustomProperties[replaceStr]); - } } } diff --git a/IDE/src/ui/NewProjectDialog.bf b/IDE/src/ui/NewProjectDialog.bf index 623eac71..773b36ef 100644 --- a/IDE/src/ui/NewProjectDialog.bf +++ b/IDE/src/ui/NewProjectDialog.bf @@ -143,7 +143,6 @@ namespace IDE.ui app.mWorkspace.mDir = new String(projDirectory); app.mWorkspace.mName = new String(projName); - app.LoadProperties(true); app.[Friend]LoadWorkspace(.OpenOrNew); app.[Friend]FinishShowingNewWorkspace(false); From 275dbd14e8e1b9ceafce89d1395fb0a00b47637c Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Thu, 27 Mar 2025 15:42:00 -0700 Subject: [PATCH 03/11] Check custom build properties before outputting error message. --- IDE/src/IDEApp.bf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 98c98d80..95b6bc02 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -11062,7 +11062,9 @@ namespace IDE String errorString = scope String(); if (!DoResolveConfigString(platformName, workspaceOptions, project, options, configString, errorString, outResult)) { - OutputErrorLine("Invalid macro in {0}: {1}", errorContext, errorString); + if (!CustomBuildProperties.Contains(errorString)) + OutputErrorLine("Invalid macro in {0}: {1}", errorContext, errorString); + return false; } return true; From 80a72f991d5a0ab30bccc30378922937cad7fd97 Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Thu, 27 Mar 2025 17:13:08 -0700 Subject: [PATCH 04/11] Update BeefBuild to use new custom build properties API. --- BeefBuild/src/BuildApp.bf | 14 ++++++++++---- IDE/src/CustomBuildProperties.bf | 24 +++++++++++++++++------- IDE/src/IDEApp.bf | 25 ++----------------------- IDE/src/Project.bf | 5 ----- IDE/src/ui/NewProjectDialog.bf | 1 + 5 files changed, 30 insertions(+), 39 deletions(-) diff --git a/BeefBuild/src/BuildApp.bf b/BeefBuild/src/BuildApp.bf index 126752a6..3aaacb3e 100644 --- a/BeefBuild/src/BuildApp.bf +++ b/BeefBuild/src/BuildApp.bf @@ -110,7 +110,7 @@ namespace BeefBuild { mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); - LoadProperties(); + CustomBuildProperties.Load(false); LoadWorkspace(mVerb); } else @@ -308,15 +308,21 @@ namespace BeefBuild int splitIdx = (int)value.IndexOf('='); if (splitIdx != -1) { - String propertyKey = new String(); + String propertyName = new String(); StringView propertyKeyView = value.Substring(0, splitIdx); - propertyKeyView.ToString(propertyKey); + propertyKeyView.ToString(propertyName); String propertyValue = new String(); StringView propertyValueView = value.Substring(splitIdx + 1, value.Length - splitIdx - 1); propertyValueView.ToString(propertyValue); - mCustomProperties.Add(propertyKey, propertyValue); + if (!CustomBuildProperties.TryAddProperty(propertyName, propertyValue)) + { + delete propertyName; + delete propertyValue; + return false; + } + return true; } } diff --git a/IDE/src/CustomBuildProperties.bf b/IDE/src/CustomBuildProperties.bf index 2bcd8ec3..5cb76865 100644 --- a/IDE/src/CustomBuildProperties.bf +++ b/IDE/src/CustomBuildProperties.bf @@ -61,11 +61,12 @@ namespace IDE mProjects.Clear(); } - static public void Load() + static public void Load(bool clearExistingProperties = true) { const char8* PROPERTIES_STR = "Properties"; - Clear(); + if (clearExistingProperties) + Clear(); String propertiesFileName = scope String(); GetFileName(propertiesFileName); @@ -85,22 +86,31 @@ namespace IDE for (var property in data.Enumerate(PROPERTIES_STR)) { - String propertyStr = new String(); - property.ToString(propertyStr); + String propertyName = new String(); + property.ToString(propertyName); - if (Contains(propertyStr)) + if (Contains(propertyName)) { - delete propertyStr; + delete propertyName; continue; } String propertyValue = new String(); data.GetCurString(propertyValue); - mProperties.Add(propertyStr, propertyValue); + TryAddProperty(propertyName, propertyValue); } } + static public bool TryAddProperty(String propertyName, String propertyValue) + { + if (Contains(propertyName)) + return false; + + mProperties.Add(propertyName, propertyValue); + return true; + } + static public bool Contains(String property) { return mProperties.ContainsKey(property); diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 95b6bc02..509480e9 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -987,6 +987,7 @@ namespace IDE mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); + CustomBuildProperties.Load(); LoadWorkspace(.OpenOrNew); FinishShowingNewWorkspace(); } @@ -2258,18 +2259,6 @@ namespace IDE outResult.Append(mInstallDir, "/DefaultLayout.toml"); } - void GetPropertiesFileName(String outResult) - { - String workspaceDir = scope String(); - - if (mWorkspace.mDir == null) - Directory.GetCurrentDirectory(workspaceDir); - else - workspaceDir = mWorkspace.mDir; - - outResult.Append(workspaceDir, "/BeefProperties.toml"); - } - bool GetWorkspaceFileName(String outResult) { if (mWorkspace.mDir == null) @@ -2973,8 +2962,6 @@ namespace IDE { scope AutoBeefPerf("IDEApp.LoadWorkspace"); - CustomBuildProperties.Load(); - AddRecentFile(.OpenedWorkspace, mWorkspace.mDir); StructuredData data = null; @@ -3149,15 +3136,6 @@ namespace IDE LoadFailed(); continue; } - else if (projSpec.mVerSpec case .Path(let projPath)) - { - String resolvedProjPath = scope String(); - if (gApp.ResolveConfigString(null, null, null, null, projPath, "custom properties", resolvedProjPath)) - { - projPath.Clear(); - projPath.Append(resolvedProjPath); - } - } switch (AddProject(projectName, projSpec.mVerSpec)) { @@ -3207,6 +3185,7 @@ namespace IDE CloseWorkspace(); mWorkspace.mDir = new String(workspaceDir); mWorkspace.mName = new String(workspaceName); + CustomBuildProperties.Load(); LoadWorkspace(.Open); FinishShowingNewWorkspace(); } diff --git a/IDE/src/Project.bf b/IDE/src/Project.bf index d98a4ce1..d2b82f6b 100644 --- a/IDE/src/Project.bf +++ b/IDE/src/Project.bf @@ -1041,11 +1041,6 @@ namespace IDE data.GetString("FileVersion", mFileVersion); data.GetString("ProductVersion", mProductVersion); String resolvedProductVersion = scope String(); - if (gApp.ResolveConfigString(null, null, null, null, mProductVersion, "custom properties", resolvedProductVersion)) - { - mProductVersion.Clear(); - mProductVersion.Append(resolvedProductVersion); - } } public void Serialize(StructuredData data) diff --git a/IDE/src/ui/NewProjectDialog.bf b/IDE/src/ui/NewProjectDialog.bf index 773b36ef..89345e28 100644 --- a/IDE/src/ui/NewProjectDialog.bf +++ b/IDE/src/ui/NewProjectDialog.bf @@ -143,6 +143,7 @@ namespace IDE.ui app.mWorkspace.mDir = new String(projDirectory); app.mWorkspace.mName = new String(projName); + CustomBuildProperties.Load(); app.[Friend]LoadWorkspace(.OpenOrNew); app.[Friend]FinishShowingNewWorkspace(false); From da31757fa776ffc6b4ba0b74c7e47b87739cd739 Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Thu, 27 Mar 2025 17:16:26 -0700 Subject: [PATCH 05/11] Missed a couple places where custom build properties should be loaded. --- IDE/src/IDEApp.bf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 509480e9..149552c7 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -12831,12 +12831,14 @@ namespace IDE { mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); + CustomBuildProperties.Load(); LoadWorkspace(mVerb); } else if (mWorkspace.IsSingleFileWorkspace) { mWorkspace.mName = new String(); Path.GetFileNameWithoutExtension(mWorkspace.mCompositeFile.mFilePath, mWorkspace.mName); + CustomBuildProperties.Load(); LoadWorkspace(mVerb); } From d929e1bfe91d66bcb0a2ee59f12f0918203dd023 Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Thu, 27 Mar 2025 18:17:28 -0700 Subject: [PATCH 06/11] Resolve custom build properties specified in workspace project specs. --- IDE/src/CustomBuildProperties.bf | 5 ----- IDE/src/IDEApp.bf | 21 +++++++++++++++++++++ IDE/src/Project.bf | 1 - 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/IDE/src/CustomBuildProperties.bf b/IDE/src/CustomBuildProperties.bf index 5cb76865..b3830895 100644 --- a/IDE/src/CustomBuildProperties.bf +++ b/IDE/src/CustomBuildProperties.bf @@ -198,11 +198,6 @@ namespace IDE } } - static public void ResolveWorkspaceProperties(Workspace workspace) - { - - } - static public void ResolveProjectProperties(Project project) { if (project == null) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 149552c7..b0c15b7f 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -3241,6 +3241,27 @@ namespace IDE public Result AddProject(StringView projectName, VerSpec verSpec) { VerSpec useVerSpec = verSpec; + + switch (useVerSpec) + { + case .None: + + case .SemVer(let ver): + String unresolvedVersion = scope String(ver.mVersion); + CustomBuildProperties.ResolveString(unresolvedVersion, ver.mVersion); + + case .Path(let path): + String unresolvedPath = scope String(path); + CustomBuildProperties.ResolveString(unresolvedPath, path); + + case .Git(let url, let ver): + String unresolvedUrl = scope String(url); + CustomBuildProperties.ResolveString(unresolvedUrl, url); + + String unresolvedVersion = scope String(ver.mVersion); + CustomBuildProperties.ResolveString(unresolvedVersion, ver.mVersion); + } + String verConfigDir = mWorkspace.mDir; if (let project = mWorkspace.FindProject(projectName)) diff --git a/IDE/src/Project.bf b/IDE/src/Project.bf index d2b82f6b..02cb0733 100644 --- a/IDE/src/Project.bf +++ b/IDE/src/Project.bf @@ -1040,7 +1040,6 @@ namespace IDE data.GetString("Copyright", mCopyright); data.GetString("FileVersion", mFileVersion); data.GetString("ProductVersion", mProductVersion); - String resolvedProductVersion = scope String(); } public void Serialize(StructuredData data) From fe967e6a04a0c345a5a6e8faeb33627bf61bf142 Mon Sep 17 00:00:00 2001 From: "LAPTOP-NV8MPI8C\\Yuvan Wickramasinghe" Date: Fri, 28 Mar 2025 10:51:18 -0700 Subject: [PATCH 07/11] Check for custom build properties in DoResolveConfigString. --- IDE/src/IDEApp.bf | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index b0c15b7f..9a59a847 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -10942,6 +10942,13 @@ namespace IDE } case "BeefPath": newString = gApp.mInstallDir; + default: + // Check if any custom properties match the string. + if (CustomBuildProperties.Contains(replaceStr)) + { + newString = scope:ReplaceBlock String(); + newString.Append(CustomBuildProperties.Get(replaceStr)); + } } } @@ -11062,9 +11069,7 @@ namespace IDE String errorString = scope String(); if (!DoResolveConfigString(platformName, workspaceOptions, project, options, configString, errorString, outResult)) { - if (!CustomBuildProperties.Contains(errorString)) - OutputErrorLine("Invalid macro in {0}: {1}", errorContext, errorString); - + OutputErrorLine("Invalid macro in {0}: {1}", errorContext, errorString); return false; } return true; From 0cf382532c4903d5592ca32d45170706dfb2505a Mon Sep 17 00:00:00 2001 From: Yuvan Wickramasinghe <127251097+es-yuvanw@users.noreply.github.com> Date: Tue, 13 May 2025 15:29:01 -0700 Subject: [PATCH 08/11] Removed temporary member resolution logic from custom build properties --- IDE/src/BuildContext.bf | 3 - IDE/src/CustomBuildProperties.bf | 486 ------------------------------- IDE/src/IDEApp.bf | 4 - 3 files changed, 493 deletions(-) diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index 9d758036..7796a9e1 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -1383,9 +1383,6 @@ namespace IDE public bool QueueProjectCompile(Project project, Project hotProject, IDEApp.BuildCompletedCmd completedCompileCmd, List hotFileNames, CompileKind compileKind) { - CustomBuildProperties.ResolveProjectProperties(project); - defer CustomBuildProperties.UnresolveProjectProperties(project); - project.mLastDidBuild = false; TestManager.ProjectInfo testProjectInfo = null; diff --git a/IDE/src/CustomBuildProperties.bf b/IDE/src/CustomBuildProperties.bf index b3830895..ec66fbc2 100644 --- a/IDE/src/CustomBuildProperties.bf +++ b/IDE/src/CustomBuildProperties.bf @@ -8,31 +8,7 @@ namespace IDE { class CustomBuildProperties { - static String[?] BUILT_IN_PROPERTIES = .( - "Slash", - "Var", - "Arguments", - "BuildDir", - "LinkFlags", - "ProjectDir", - "ProjectName", - "TargetDir", - "TargetPath", - "WorkingDir", - "ProjectName", - "VSToolPath", - "VSToolPath_x86", - "VSToolPath_x64", - "EmccPath", - "ScriptDir", - "Configuration", - "Platform", - "WorkspaceDir", - "BeefPath" - ); - static Dictionary mProperties = new .() ~ DeleteDictionaryAndKeysAndValues!(_); - static Dictionary mProjects = new .() ~ DeleteDictionaryAndValues!(_); static public void GetFileName(String outResult) { @@ -54,11 +30,7 @@ namespace IDE delete entry.value; } - for (var entry in mProjects) - delete entry.value; - mProperties.Clear(); - mProjects.Clear(); } static public void Load(bool clearExistingProperties = true) @@ -123,463 +95,5 @@ namespace IDE return mProperties[property]; } - - static public void ResolveString(StringView configString, String outResult) - { - outResult.Set(configString); - - // Find the property to resolve (if any). - int i = 0; - for (; i < outResult.Length - 2; i++) - { - if ((outResult[i] == '$') && (outResult[i + 1] == '(')) - { - int parenPos = -1; - int openCount = 1; - bool inString = false; - char8 prevC = 0; - for (int checkIdx = i + 2; checkIdx < outResult.Length; checkIdx++) - { - char8 c = outResult[checkIdx]; - if (inString) - { - if (prevC == '\\') - { - // Slashed char - prevC = 0; - continue; - } - - if (c == '"') - inString = false; - } - else - { - if (c == '"') - inString = true; - else if (c == '(') - openCount++; - else if (c == ')') - { - openCount--; - if (openCount == 0) - { - parenPos = checkIdx; - break; - } - } - } - - prevC = c; - } - - if (parenPos != -1) - ReplaceBlock: - do - { - // If we reach here, a property has been found. - String replaceStr = scope String(outResult, i + 2, parenPos - i - 2); - - // Ignore built-in properties because they are resolved elsewhere. - if (BUILT_IN_PROPERTIES.Contains(replaceStr)) - continue; - - String newString = Get(replaceStr); - - // Resolve custom property value. - if (newString != null) - { - outResult.Remove(i, parenPos - i + 1); - outResult.Insert(i, newString); - i--; - } - } - } - } - } - - static public void ResolveProjectProperties(Project project) - { - if (project == null) - return; - - Project unresolvedProject = new Project(); - mProjects[project] = unresolvedProject; - - // Deep copy the project so unresolved custom build properties can be restored later, - // and resolve any custom build properties in place in the existing project. - if (project.mNamespace != null) - { - unresolvedProject.mNamespace.Set(project.mNamespace); - ResolveString(unresolvedProject.mNamespace, project.mNamespace); - } - - if (project.mProjectDir != null) - { - unresolvedProject.mProjectDir.Set(project.mProjectDir); - ResolveString(unresolvedProject.mProjectDir, project.mProjectDir); - } - - if (project.mProjectName != null) - { - unresolvedProject.mProjectName.Set(project.mProjectName); - ResolveString(unresolvedProject.mProjectName, project.mProjectName); - } - - if (project.mProjectPath != null) - { - unresolvedProject.mProjectPath.Set(project.mProjectPath); - ResolveString(unresolvedProject.mProjectPath, project.mProjectPath); - } - - if (project.mManagedInfo != null) - { - unresolvedProject.mManagedInfo = new Project.ManagedInfo(); - unresolvedProject.mManagedInfo.mVersion.mVersion.Set(project.mManagedInfo.mVersion.mVersion); - unresolvedProject.mManagedInfo.mInfo.Set(project.mManagedInfo.mInfo); - - ResolveString(unresolvedProject.mManagedInfo.mVersion.mVersion, project.mManagedInfo.mVersion.mVersion); - ResolveString(unresolvedProject.mManagedInfo.mInfo, project.mManagedInfo.mInfo); - } - - if (project.mConfigs != null) - { - DeleteDictionaryAndKeysAndValues!(unresolvedProject.mConfigs); - unresolvedProject.mConfigs = new Dictionary(); - - for (var config in project.mConfigs) - { - Project.Config unresolvedConfig = new Project.Config(); - - for (var platform in config.value.mPlatforms) - { - Project.Options unresolvedOptions = platform.value.Duplicate(); - unresolvedConfig.mPlatforms[new String(platform.key)] = unresolvedOptions; - - ResolveString(unresolvedOptions.mBuildOptions.mTargetDirectory, platform.value.mBuildOptions.mTargetDirectory); - ResolveString(unresolvedOptions.mBuildOptions.mTargetName, platform.value.mBuildOptions.mTargetName); - ResolveString(unresolvedOptions.mBuildOptions.mOtherLinkFlags, platform.value.mBuildOptions.mOtherLinkFlags); - - for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mLibPaths.Count; i++) - ResolveString(unresolvedOptions.mBuildOptions.mLibPaths[i], platform.value.mBuildOptions.mLibPaths[i]); - - for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mLinkDependencies.Count; i++) - ResolveString(unresolvedOptions.mBuildOptions.mLinkDependencies[i], platform.value.mBuildOptions.mLinkDependencies[i]); - - for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mPreBuildCmds.Count; i++) - ResolveString(unresolvedOptions.mBuildOptions.mPreBuildCmds[i], platform.value.mBuildOptions.mPreBuildCmds[i]); - - for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mPostBuildCmds.Count; i++) - ResolveString(unresolvedOptions.mBuildOptions.mPostBuildCmds[i], platform.value.mBuildOptions.mPostBuildCmds[i]); - - for (int32 i = 0; i < unresolvedOptions.mBuildOptions.mCleanCmds.Count; i++) - ResolveString(unresolvedOptions.mBuildOptions.mCleanCmds[i], platform.value.mBuildOptions.mCleanCmds[i]); - - for (int32 i = 0; i < unresolvedOptions.mBeefOptions.mPreprocessorMacros.Count; i++) - ResolveString(unresolvedOptions.mBeefOptions.mPreprocessorMacros[i], platform.value.mBeefOptions.mPreprocessorMacros[i]); - - for (int32 i = 0; i < unresolvedOptions.mBeefOptions.mDistinctBuildOptions.Count; i++) - { - ResolveString(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mFilter, platform.value.mBeefOptions.mDistinctBuildOptions[i].mFilter); - ResolveString(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter, platform.value.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter); - } - - ResolveString(unresolvedOptions.mCOptions.mOtherCFlags, platform.value.mCOptions.mOtherCFlags); - ResolveString(unresolvedOptions.mCOptions.mOtherCPPFlags, platform.value.mCOptions.mOtherCPPFlags); - - for (int32 i = 0; i < unresolvedOptions.mCOptions.mIncludePaths.Count; i++) - ResolveString(unresolvedOptions.mCOptions.mIncludePaths[i], platform.value.mCOptions.mIncludePaths[i]); - - for (int32 i = 0; i < unresolvedOptions.mCOptions.mPreprocessorMacros.Count; i++) - ResolveString(unresolvedOptions.mCOptions.mPreprocessorMacros[i], platform.value.mCOptions.mPreprocessorMacros[i]); - - ResolveString(unresolvedOptions.mCOptions.mAddressSanitizer, platform.value.mCOptions.mAddressSanitizer); - - for (int32 i = 0; i < unresolvedOptions.mCOptions.mSpecificWarningsAsErrors.Count; i++) - ResolveString(unresolvedOptions.mCOptions.mSpecificWarningsAsErrors[i], platform.value.mCOptions.mSpecificWarningsAsErrors[i]); - - for (int32 i = 0; i < unresolvedOptions.mCOptions.mDisableSpecificWarnings.Count; i++) - ResolveString(unresolvedOptions.mCOptions.mDisableSpecificWarnings[i], platform.value.mCOptions.mDisableSpecificWarnings[i]); - - ResolveString(unresolvedOptions.mDebugOptions.mCommand, platform.value.mDebugOptions.mCommand); - ResolveString(unresolvedOptions.mDebugOptions.mCommandArguments, platform.value.mDebugOptions.mCommandArguments); - ResolveString(unresolvedOptions.mDebugOptions.mWorkingDirectory, platform.value.mDebugOptions.mWorkingDirectory); - - for (int32 i = 0; i < unresolvedOptions.mDebugOptions.mEnvironmentVars.Count; i++) - ResolveString(unresolvedOptions.mDebugOptions.mEnvironmentVars[i], platform.value.mDebugOptions.mEnvironmentVars[i]); - } - - unresolvedProject.mConfigs[new String(config.key)] = unresolvedConfig; - } - } - - if (project.mGeneralOptions != null) - { - unresolvedProject.mGeneralOptions.mProjectNameDecl.Set(project.mGeneralOptions.mProjectNameDecl); - ResolveString(unresolvedProject.mGeneralOptions.mProjectNameDecl, project.mGeneralOptions.mProjectNameDecl); - - unresolvedProject.mGeneralOptions.mVersion.mVersion.Set(project.mGeneralOptions.mVersion.mVersion); - ResolveString(unresolvedProject.mGeneralOptions.mVersion.mVersion, project.mGeneralOptions.mVersion.mVersion); - - unresolvedProject.mGeneralOptions.mAliases.Clear(); - for (String alias in project.mGeneralOptions.mAliases) - { - String unresolvedAlias = new String(alias); - unresolvedProject.mGeneralOptions.mAliases.Add(unresolvedAlias); - ResolveString(unresolvedAlias, alias); - } - } - - if (project.mBeefGlobalOptions != null) - { - unresolvedProject.mBeefGlobalOptions.mStartupObject.Set(project.mBeefGlobalOptions.mStartupObject); - ResolveString(unresolvedProject.mBeefGlobalOptions.mStartupObject, project.mBeefGlobalOptions.mStartupObject); - - unresolvedProject.mBeefGlobalOptions.mDefaultNamespace.Set(project.mBeefGlobalOptions.mDefaultNamespace); - ResolveString(unresolvedProject.mBeefGlobalOptions.mDefaultNamespace, project.mBeefGlobalOptions.mDefaultNamespace); - - unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros.Clear(); - for (String macro in project.mBeefGlobalOptions.mPreprocessorMacros) - { - String unresolvedMacro = new String(macro); - unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros.Add(unresolvedMacro); - ResolveString(unresolvedMacro, macro); - } - - unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions.Clear(); - for (DistinctBuildOptions options in project.mBeefGlobalOptions.mDistinctBuildOptions) - { - DistinctBuildOptions unresolvedOptions = new DistinctBuildOptions(); - - unresolvedOptions.mFilter.Set(options.mFilter); - unresolvedOptions.mReflectMethodFilter.Set(options.mReflectMethodFilter); - unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions.Add(unresolvedOptions); - - ResolveString(unresolvedOptions.mFilter, options.mFilter); - ResolveString(unresolvedOptions.mReflectMethodFilter, options.mReflectMethodFilter); - } - } - - if (project.mWindowsOptions != null) - { - unresolvedProject.mWindowsOptions.mIconFile.Set(project.mWindowsOptions.mIconFile); - unresolvedProject.mWindowsOptions.mManifestFile.Set(project.mWindowsOptions.mManifestFile); - unresolvedProject.mWindowsOptions.mDescription.Set(project.mWindowsOptions.mDescription); - unresolvedProject.mWindowsOptions.mComments.Set(project.mWindowsOptions.mComments); - unresolvedProject.mWindowsOptions.mCompany.Set(project.mWindowsOptions.mCompany); - unresolvedProject.mWindowsOptions.mProduct.Set(project.mWindowsOptions.mProduct); - unresolvedProject.mWindowsOptions.mCopyright.Set(project.mWindowsOptions.mCopyright); - unresolvedProject.mWindowsOptions.mFileVersion.Set(project.mWindowsOptions.mFileVersion); - unresolvedProject.mWindowsOptions.mProductVersion.Set(project.mWindowsOptions.mProductVersion); - - ResolveString(unresolvedProject.mWindowsOptions.mIconFile, project.mWindowsOptions.mIconFile); - ResolveString(unresolvedProject.mWindowsOptions.mManifestFile, project.mWindowsOptions.mManifestFile); - ResolveString(unresolvedProject.mWindowsOptions.mDescription, project.mWindowsOptions.mDescription); - ResolveString(unresolvedProject.mWindowsOptions.mComments, project.mWindowsOptions.mComments); - ResolveString(unresolvedProject.mWindowsOptions.mCompany, project.mWindowsOptions.mCompany); - ResolveString(unresolvedProject.mWindowsOptions.mProduct, project.mWindowsOptions.mProduct); - ResolveString(unresolvedProject.mWindowsOptions.mCopyright, project.mWindowsOptions.mCopyright); - ResolveString(unresolvedProject.mWindowsOptions.mFileVersion, project.mWindowsOptions.mFileVersion); - ResolveString(unresolvedProject.mWindowsOptions.mProductVersion, project.mWindowsOptions.mProductVersion); - } - - if (project.mLinuxOptions != null) - { - unresolvedProject.mLinuxOptions.mOptions.Set(project.mLinuxOptions.mOptions); - ResolveString(unresolvedProject.mLinuxOptions.mOptions, project.mLinuxOptions.mOptions); - } - - if (project.mDependencies != null) - { - unresolvedProject.mDependencies.Clear(); - for (Project.Dependency dependency in project.mDependencies) - { - Project.Dependency unresolvedDependency = new Project.Dependency(); - - unresolvedDependency.mVerSpec = dependency.mVerSpec.Duplicate(); - - if (dependency.mProjectName != null) - { - unresolvedDependency.mProjectName = new String(); - unresolvedDependency.mProjectName.Set(dependency.mProjectName); - ResolveString(unresolvedDependency.mProjectName, dependency.mProjectName); - } - - unresolvedProject.mDependencies.Add(unresolvedDependency); - } - } - } - - static public void UnresolveProjectProperties(Project project) - { - if (project == null) - return; - - if (!mProjects.ContainsKey(project)) - return; - - Project unresolvedProject = mProjects[project]; - - // Unpack unresolved strings into the project. - if (project.mNamespace != null) - project.mNamespace.Set(unresolvedProject.mNamespace); - - if (project.mProjectDir != null) - project.mProjectDir.Set(unresolvedProject.mProjectDir); - - if (project.mProjectName != null) - project.mProjectName.Set(unresolvedProject.mProjectName); - - if (project.mProjectPath != null) - project.mProjectPath.Set(unresolvedProject.mProjectPath); - - if (project.mManagedInfo != null) - { - project.mManagedInfo.mVersion.mVersion.Set(unresolvedProject.mManagedInfo.mVersion.mVersion); - project.mManagedInfo.mInfo.Set(unresolvedProject.mManagedInfo.mInfo); - } - - if (project.mConfigs != null) - { - for (var config in project.mConfigs) - { - Project.Config unresolvedConfig = null; - - for (var c in unresolvedProject.mConfigs) - { - if (config.key.Equals(c.key)) - { - unresolvedConfig = c.value; - break; - } - } - - if (unresolvedConfig == null) - continue; - - for (var platform in config.value.mPlatforms) - { - Project.Options unresolvedOptions = null; - - for (var p in unresolvedConfig.mPlatforms) - { - if (platform.key.Equals(p.key)) - { - unresolvedOptions = p.value; - break; - } - } - - if (unresolvedOptions == null) - continue; - - platform.value.mBuildOptions.mTargetDirectory.Set(unresolvedOptions.mBuildOptions.mTargetDirectory); - platform.value.mBuildOptions.mTargetName.Set(unresolvedOptions.mBuildOptions.mTargetName); - platform.value.mBuildOptions.mOtherLinkFlags.Set(unresolvedOptions.mBuildOptions.mOtherLinkFlags); - - for (int32 i = 0; i < platform.value.mBuildOptions.mLibPaths.Count; i++) - platform.value.mBuildOptions.mLibPaths[i].Set(unresolvedOptions.mBuildOptions.mLibPaths[i]); - - for (int32 i = 0; i < platform.value.mBuildOptions.mLinkDependencies.Count; i++) - platform.value.mBuildOptions.mLinkDependencies[i].Set(unresolvedOptions.mBuildOptions.mLinkDependencies[i]); - - for (int32 i = 0; i < platform.value.mBuildOptions.mPreBuildCmds.Count; i++) - platform.value.mBuildOptions.mPreBuildCmds[i].Set(unresolvedOptions.mBuildOptions.mPreBuildCmds[i]); - - for (int32 i = 0; i < platform.value.mBuildOptions.mPostBuildCmds.Count; i++) - platform.value.mBuildOptions.mPostBuildCmds[i].Set(unresolvedOptions.mBuildOptions.mPostBuildCmds[i]); - - for (int32 i = 0; i < platform.value.mBuildOptions.mCleanCmds.Count; i++) - platform.value.mBuildOptions.mCleanCmds[i].Set(unresolvedOptions.mBuildOptions.mCleanCmds[i]); - - for (int32 i = 0; i < platform.value.mBeefOptions.mPreprocessorMacros.Count; i++) - platform.value.mBeefOptions.mPreprocessorMacros[i].Set(unresolvedOptions.mBeefOptions.mPreprocessorMacros[i]); - - for (int32 i = 0; i < platform.value.mBeefOptions.mDistinctBuildOptions.Count; i++) - { - platform.value.mBeefOptions.mDistinctBuildOptions[i].mFilter.Set(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mFilter); - platform.value.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter.Set(unresolvedOptions.mBeefOptions.mDistinctBuildOptions[i].mReflectMethodFilter); - } - - platform.value.mCOptions.mOtherCFlags.Set(unresolvedOptions.mCOptions.mOtherCFlags); - platform.value.mCOptions.mOtherCPPFlags.Set(unresolvedOptions.mCOptions.mOtherCPPFlags); - - for (int32 i = 0; i < platform.value.mCOptions.mIncludePaths.Count; i++) - platform.value.mCOptions.mIncludePaths[i].Set(unresolvedOptions.mCOptions.mIncludePaths[i]); - - for (int32 i = 0; i < platform.value.mCOptions.mPreprocessorMacros.Count; i++) - platform.value.mCOptions.mPreprocessorMacros[i].Set(unresolvedOptions.mCOptions.mPreprocessorMacros[i]); - - platform.value.mCOptions.mAddressSanitizer.Set(unresolvedOptions.mCOptions.mAddressSanitizer); - - for (int32 i = 0; i < platform.value.mCOptions.mSpecificWarningsAsErrors.Count; i++) - platform.value.mCOptions.mSpecificWarningsAsErrors[i].Set(unresolvedOptions.mCOptions.mSpecificWarningsAsErrors[i]); - - for (int32 i = 0; i < platform.value.mCOptions.mDisableSpecificWarnings.Count; i++) - platform.value.mCOptions.mDisableSpecificWarnings[i].Set(unresolvedOptions.mCOptions.mDisableSpecificWarnings[i]); - - platform.value.mDebugOptions.mCommand.Set(unresolvedOptions.mDebugOptions.mCommand); - platform.value.mDebugOptions.mCommandArguments.Set(unresolvedOptions.mDebugOptions.mCommandArguments); - platform.value.mDebugOptions.mWorkingDirectory.Set(unresolvedOptions.mDebugOptions.mWorkingDirectory); - - for (int32 i = 0; i < platform.value.mDebugOptions.mEnvironmentVars.Count; i++) - platform.value.mDebugOptions.mEnvironmentVars[i].Set(unresolvedOptions.mDebugOptions.mEnvironmentVars[i]); - } - } - } - - if (project.mGeneralOptions != null) - { - project.mGeneralOptions.mProjectNameDecl.Set(unresolvedProject.mGeneralOptions.mProjectNameDecl); - project.mGeneralOptions.mVersion.mVersion.Set(unresolvedProject.mGeneralOptions.mVersion.mVersion); - - for (int32 i = 0; i < project.mGeneralOptions.mAliases.Count; i++) - project.mGeneralOptions.mAliases[i].Set(unresolvedProject.mGeneralOptions.mAliases[i]); - } - - if (project.mBeefGlobalOptions != null) - { - project.mBeefGlobalOptions.mStartupObject.Set(unresolvedProject.mBeefGlobalOptions.mStartupObject); - project.mBeefGlobalOptions.mDefaultNamespace.Set(unresolvedProject.mBeefGlobalOptions.mDefaultNamespace); - - for (int32 i = 0; i < project.mBeefGlobalOptions.mPreprocessorMacros.Count; i++) - project.mBeefGlobalOptions.mPreprocessorMacros[i].Set(unresolvedProject.mBeefGlobalOptions.mPreprocessorMacros[i]); - - for (int32 i = 0; i < project.mBeefGlobalOptions.mDistinctBuildOptions.Count; i++) - { - project.mBeefGlobalOptions.mDistinctBuildOptions[i].mFilter.Set(unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions[i].mFilter); - project.mBeefGlobalOptions.mDistinctBuildOptions[i].mReflectMethodFilter.Set(unresolvedProject.mBeefGlobalOptions.mDistinctBuildOptions[i].mReflectMethodFilter); - } - } - - if (project.mWindowsOptions != null) - { - project.mWindowsOptions.mIconFile.Set(unresolvedProject.mWindowsOptions.mIconFile); - project.mWindowsOptions.mManifestFile.Set(unresolvedProject.mWindowsOptions.mManifestFile); - project.mWindowsOptions.mDescription.Set(unresolvedProject.mWindowsOptions.mDescription); - project.mWindowsOptions.mComments.Set(unresolvedProject.mWindowsOptions.mComments); - project.mWindowsOptions.mCompany.Set(unresolvedProject.mWindowsOptions.mCompany); - project.mWindowsOptions.mProduct.Set(unresolvedProject.mWindowsOptions.mProduct); - project.mWindowsOptions.mCopyright.Set(unresolvedProject.mWindowsOptions.mCopyright); - project.mWindowsOptions.mFileVersion.Set(unresolvedProject.mWindowsOptions.mFileVersion); - project.mWindowsOptions.mProductVersion.Set(unresolvedProject.mWindowsOptions.mProductVersion); - } - - if (project.mLinuxOptions != null) - project.mLinuxOptions.mOptions.Set(unresolvedProject.mLinuxOptions.mOptions); - - if (project.mDependencies != null) - { - for (int32 i = 0; i < project.mDependencies.Count; i++) - { - if (project.mDependencies[i].mProjectName != null) - project.mDependencies[i].mProjectName.Set(unresolvedProject.mDependencies[i].mProjectName); - } - } - - // Clean up unresolved project. - delete mProjects[project]; - mProjects.Remove(project); - } } } diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 271510cb..7e026a79 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -3255,18 +3255,14 @@ namespace IDE case .SemVer(let ver): String unresolvedVersion = scope String(ver.mVersion); - CustomBuildProperties.ResolveString(unresolvedVersion, ver.mVersion); case .Path(let path): String unresolvedPath = scope String(path); - CustomBuildProperties.ResolveString(unresolvedPath, path); case .Git(let url, let ver): String unresolvedUrl = scope String(url); - CustomBuildProperties.ResolveString(unresolvedUrl, url); String unresolvedVersion = scope String(ver.mVersion); - CustomBuildProperties.ResolveString(unresolvedVersion, ver.mVersion); } String verConfigDir = mWorkspace.mDir; From aa46ebadb7721b8bbed1db0b7418b19ce56048c7 Mon Sep 17 00:00:00 2001 From: Yuvan Wickramasinghe <127251097+es-yuvanw@users.noreply.github.com> Date: Tue, 13 May 2025 17:47:21 -0700 Subject: [PATCH 09/11] Resolve Windows file version and product version strings. --- IDE/src/BuildContext.bf | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index 7796a9e1..78747d14 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -1027,6 +1027,12 @@ namespace IDE AddBuildFileDependency(project.mWindowsOptions.mIconFile); AddBuildFileDependency(project.mWindowsOptions.mManifestFile); + String fileVersion = scope String(); + gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, options, project.mWindowsOptions.mFileVersion, "file version", fileVersion); + + String productVersion = scope String(); + gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, options, project.mWindowsOptions.mProductVersion, "product version", productVersion); + switch (mPlatformType) { case .Windows: @@ -1035,8 +1041,8 @@ namespace IDE cacheStr.AppendF("Company\t{}\n", project.mWindowsOptions.mCompany); cacheStr.AppendF("Product\t{}\n", project.mWindowsOptions.mProduct); cacheStr.AppendF("Copyright\t{}\n", project.mWindowsOptions.mCopyright); - cacheStr.AppendF("FileVersion\t{}\n", project.mWindowsOptions.mFileVersion); - cacheStr.AppendF("ProductVersion\t{}\n", project.mWindowsOptions.mProductVersion); + cacheStr.AppendF("FileVersion\t{}\n", fileVersion); + cacheStr.AppendF("ProductVersion\t{}\n", productVersion); case .Linux: cacheStr.AppendF("Options\t{}\n", project.mLinuxOptions.mOptions); case .Wasm: @@ -1265,11 +1271,17 @@ namespace IDE } } + String fileVersion = scope String(); + gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, options, winOptions.mFileVersion, "file version", fileVersion); + + String productVersion = scope String(); + gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, options, winOptions.mProductVersion, "product version", productVersion); + let targetFileName = scope String(); Path.GetFileName(targetPath, targetFileName); if (resGen.AddVersion(winOptions.mDescription, winOptions.mComments, winOptions.mCompany, winOptions.mProduct, - winOptions.mCopyright, winOptions.mFileVersion, winOptions.mProductVersion, targetFileName) case .Err) + winOptions.mCopyright, fileVersion, productVersion, targetFileName) case .Err) { gApp.OutputErrorLine("Failed to add version"); return .Err; From 9a2e5d70a3cd35631ee895b393b3e5aa4b04c9e7 Mon Sep 17 00:00:00 2001 From: Yuvan Wickramasinghe <127251097+es-yuvanw@users.noreply.github.com> Date: Tue, 13 May 2025 18:00:31 -0700 Subject: [PATCH 10/11] Resolve project path string --- IDE/src/IDEApp.bf | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 7e026a79..ff334715 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -3248,23 +3248,6 @@ namespace IDE public Result AddProject(StringView projectName, VerSpec verSpec) { VerSpec useVerSpec = verSpec; - - switch (useVerSpec) - { - case .None: - - case .SemVer(let ver): - String unresolvedVersion = scope String(ver.mVersion); - - case .Path(let path): - String unresolvedPath = scope String(path); - - case .Git(let url, let ver): - String unresolvedUrl = scope String(url); - - String unresolvedVersion = scope String(ver.mVersion); - } - String verConfigDir = mWorkspace.mDir; if (let project = mWorkspace.FindProject(projectName)) @@ -3339,7 +3322,13 @@ namespace IDE switch (useVerSpec) { case .Path(let path): - var relPath = scope String(path); + Project.Options options = GetCurProjectOptions(project); + Workspace.Options workspaceOptions = GetCurWorkspaceOptions(); + + var resolvedPath = scope String(); + ResolveConfigString(mPlatformName, workspaceOptions, project, options, path, "project path", resolvedPath); + + var relPath = scope String(resolvedPath); IDEUtils.FixFilePath(relPath); if (!relPath.EndsWith(IDEUtils.cNativeSlash)) relPath.Append(IDEUtils.cNativeSlash); From 7a7fd7547cc457b7772b2f6aeabb08056621c120 Mon Sep 17 00:00:00 2001 From: Yuvan Wickramasinghe <127251097+es-yuvanw@users.noreply.github.com> Date: Tue, 13 May 2025 19:59:17 -0700 Subject: [PATCH 11/11] Fix indentation --- BeefBuild/src/BuildApp.bf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BeefBuild/src/BuildApp.bf b/BeefBuild/src/BuildApp.bf index e9ba6891..4f5de7ff 100644 --- a/BeefBuild/src/BuildApp.bf +++ b/BeefBuild/src/BuildApp.bf @@ -113,7 +113,7 @@ namespace BeefBuild { mWorkspace.mName = new String(); Path.GetFileName(mWorkspace.mDir, mWorkspace.mName); - CustomBuildProperties.Load(false); + CustomBuildProperties.Load(false); LoadWorkspace(mVerb); } else