diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index bfafd520..4c047a54 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -611,6 +611,35 @@ namespace IDE CopyLibFiles(targetPath, workspaceOptions, options); + List libPaths = scope .(); + defer ClearAndDeleteItems(libPaths); + void AddLibPath(StringView libPathIn, Project project, Project.Options projectOptions) + { + var libPath = new String(); + if (gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, projectOptions, libPathIn, "lib paths", libPath)) + { + IDEUtils.FixFilePath(libPath); + libPaths.Add(libPath); + } + } + + List depPaths = scope .(); + defer ClearAndDeleteItems(depPaths); + void AddDepPath(StringView depPathIn, Project project, Project.Options projectOptions) + { + var depPath = new String(); + if (gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, project, projectOptions, depPathIn, "dep paths", depPath)) + { + IDEUtils.FixFilePath(depPath); + depPaths.Add(depPath); + } + } + + for (let libPath in options.mBuildOptions.mLibPaths) + AddLibPath(libPath, project, options); + for (let depPath in options.mBuildOptions.mLinkDependencies) + AddDepPath(depPath, project, options); + List depProjectList = scope List(); gApp.GetDependentProjectList(project, depProjectList); if (depProjectList.Count > 0) @@ -656,6 +685,11 @@ namespace IDE gApp.ResolveConfigString(gApp.mPlatformName, workspaceOptions, depProject, depProjectOptions, depProjectOptions.mBuildOptions.mOtherLinkFlags, "link flags", linkFlags); if (!linkFlags.IsWhiteSpace) linkLine.Append(linkFlags, " "); + + for (let libPath in depProjectOptions.mBuildOptions.mLibPaths) + AddLibPath(libPath, depProject, depProjectOptions); + for (let depPath in depProjectOptions.mBuildOptions.mLinkDependencies) + AddDepPath(depPath, depProject, depProjectOptions); } } } @@ -701,6 +735,13 @@ namespace IDE linkLine.Append(gApp.mInstallDir, @"lib\x64\msvcrt.lib Beef", IDEApp.sRTVersionStr,"MinRT64", minRTModName, ".lib "); linkLine.Append("ntdll.lib user32.lib kernel32.lib gdi32.lib winmm.lib shell32.lib ole32.lib rpcrt4.lib version.lib comdlg32.lib chkstk.obj -ignore:4049 -ignore:4217 "); } + + for (var libPath in libPaths) + { + IDEUtils.AppendWithOptionalQuotes(linkLine, libPath); + linkLine.Append(" "); + } + linkLine.Append("-nologo "); //linkLine.Append("-fixed "); @@ -792,7 +833,9 @@ namespace IDE cacheStr.AppendF("Copyright\t{}\n", project.mWindowsOptions.mCopyright); cacheStr.AppendF("FileVersion\t{}\n", project.mWindowsOptions.mFileVersion); cacheStr.AppendF("ProductVersion\t{}\n", project.mWindowsOptions.mProductVersion); - for (var linkDep in options.mBuildOptions.mLinkDependencies) + for (var linkDep in depPaths) + AddBuildFileDependency(linkDep, true); + for (var linkDep in libPaths) AddBuildFileDependency(linkDep, true); String prevCacheStr = scope .(); diff --git a/IDE/src/Project.bf b/IDE/src/Project.bf index 6b5634cf..35c5baa7 100644 --- a/IDE/src/Project.bf +++ b/IDE/src/Project.bf @@ -1034,6 +1034,8 @@ namespace IDE [Reflect] public BuildCommandTrigger mBuildCommandsOnRun = .Always; [Reflect] + public List mLibPaths = new List() ~ DeleteContainerAndItems!(_); + [Reflect] public List mLinkDependencies = new List() ~ DeleteContainerAndItems!(_); [Reflect] public List mPreBuildCmds = new List() ~ DeleteContainerAndItems!(_); @@ -1156,6 +1158,7 @@ namespace IDE Set!(newOptions.mBuildOptions.mTargetName, mBuildOptions.mTargetName); Set!(newOptions.mBuildOptions.mOtherLinkFlags, mBuildOptions.mOtherLinkFlags); Set!(newOptions.mBuildOptions.mCLibType, mBuildOptions.mCLibType); + Set!(newOptions.mBuildOptions.mLibPaths, mBuildOptions.mLibPaths); Set!(newOptions.mBuildOptions.mLinkDependencies, mBuildOptions.mLinkDependencies); Set!(newOptions.mBuildOptions.mPreBuildCmds, mBuildOptions.mPreBuildCmds); Set!(newOptions.mBuildOptions.mPostBuildCmds, mBuildOptions.mPostBuildCmds); @@ -1545,6 +1548,7 @@ namespace IDE data.ConditionalAdd("StackSize", options.mBuildOptions.mStackSize, 0); data.ConditionalAdd("BuildCommandsOnCompile", options.mBuildOptions.mBuildCommandsOnCompile, .Always); data.ConditionalAdd("BuildCommandsOnRun", options.mBuildOptions.mBuildCommandsOnRun, .Always); + WriteStrings("LibPaths", options.mBuildOptions.mLibPaths); WriteStrings("LinkDependencies", options.mBuildOptions.mLinkDependencies); WriteStrings("PreBuildCmds", options.mBuildOptions.mPreBuildCmds); WriteStrings("PostBuildCmds", options.mBuildOptions.mPostBuildCmds); @@ -1879,6 +1883,7 @@ namespace IDE options.mBuildOptions.mStackSize = data.GetInt("StackSize"); options.mBuildOptions.mBuildCommandsOnCompile = data.GetEnum("BuildCommandsOnCompile", .Always); options.mBuildOptions.mBuildCommandsOnRun = data.GetEnum("BuildCommandsOnRun", .Always); + ReadStrings("LibPaths", options.mBuildOptions.mLibPaths); ReadStrings("LinkDependencies", options.mBuildOptions.mLinkDependencies); ReadStrings("PreBuildCmds", options.mBuildOptions.mPreBuildCmds); ReadStrings("PostBuildCmds", options.mBuildOptions.mPostBuildCmds); diff --git a/IDE/src/ui/ProjectProperties.bf b/IDE/src/ui/ProjectProperties.bf index 5d322aee..cceb26af 100644 --- a/IDE/src/ui/ProjectProperties.bf +++ b/IDE/src/ui/ProjectProperties.bf @@ -680,7 +680,8 @@ namespace IDE.ui (listViewItem, propEntry) = AddPropertiesItem(root, "C Library", "mBuildOptions.mCLibType"); (listViewItem, propEntry) = AddPropertiesItem(root, "Beef Library", "mBuildOptions.mBeefLibType"); (listViewItem, propEntry) = AddPropertiesItem(root, "Stack Size", "mBuildOptions.mStackSize"); - (listViewItem, propEntry) = AddPropertiesItem(root, "Link Dependencies", "mBuildOptions.mLinkDependencies"); + (listViewItem, propEntry) = AddPropertiesItem(root, "Additional Lib Paths", "mBuildOptions.mLibPaths"); + (listViewItem, propEntry) = AddPropertiesItem(root, "Rebuild Dependencies", "mBuildOptions.mLinkDependencies"); (listViewItem, propEntry) = AddPropertiesItem(root, "Prebuild Commands", "mBuildOptions.mPreBuildCmds"); (listViewItem, propEntry) = AddPropertiesItem(root, "Postbuild Commands", "mBuildOptions.mPostBuildCmds"); (listViewItem, propEntry) = AddPropertiesItem(root, "Clean Commands", "mBuildOptions.mCleanCmds");