diff --git a/IDE/dist/lib/gen/BeefProj.toml b/IDE/dist/lib/gen/BeefProj.toml new file mode 100644 index 00000000..2a6b4ae8 --- /dev/null +++ b/IDE/dist/lib/gen/BeefProj.toml @@ -0,0 +1,5 @@ +FileVersion = 1 + +[Project] +Name = "gen" +StartupObject = "gen.Program" diff --git a/IDE/dist/lib/gen/BeefSpace.toml b/IDE/dist/lib/gen/BeefSpace.toml new file mode 100644 index 00000000..3276c379 --- /dev/null +++ b/IDE/dist/lib/gen/BeefSpace.toml @@ -0,0 +1,5 @@ +FileVersion = 1 +Projects = {gen = {Path = "."}} + +[Workspace] +StartupProject = "gen" diff --git a/IDE/dist/lib/gen/src/Program.bf b/IDE/dist/lib/gen/src/Program.bf new file mode 100644 index 00000000..f174bd0b --- /dev/null +++ b/IDE/dist/lib/gen/src/Program.bf @@ -0,0 +1,114 @@ +#pragma warning disable 168 + +using System; +using System; +using System.Interop; +using System.IO; +using System.Threading; +using System.Diagnostics; +using System.Collections; + +namespace gen +{ + class Program + { + static String[] sNames = new .[]("comdlg32", "gdi32", "kernel32", "ole32", "netapi32", "ntdll", "rpcrt4", "user32", "version", "winmm") ~ delete _; + + public static int Main(String[] args) + { + bool isFirst = true; + + for (var name in sNames) + { + for (int pass < 2) + { + String resultStr = scope String(); + + // + { + ProcessStartInfo startInfo = scope .(); + startInfo.SetFileName(@"c:\bin\dumpbin.exe"); + if (pass == 0) + startInfo.SetArguments(scope $"/exports c:\\windows\\system32\\{name}.dll"); + else + startInfo.SetArguments(scope $"/exports c:\\windows\\SysWow64\\{name}.dll"); + startInfo.RedirectStandardOutput = true; + startInfo.UseShellExecute = false; + startInfo.RedirectStandardOutput = true; + startInfo.CreateNoWindow = false; + SpawnedProcess process = scope SpawnedProcess(); + if (process.Start(startInfo) case .Err) + continue; + + FileStream fileStream = scope FileStream(); + process.AttachStandardOutput(fileStream); + StreamReader streamReader = scope StreamReader(fileStream, null, false, 4096); + streamReader.ReadToEnd(resultStr).IgnoreError(); + + if (process.ExitCode != 0) + Runtime.FatalError(scope $"Failed to read lib '{name}'"); + } + + var outStr = scope String(); + outStr.Append("EXPORTS\n"); + + for (var line in resultStr.Split('\n')) + { + if ((line.Length > 26) && (line.StartsWith(" ")) && (line[25] == ' ') && (line[26] != '[')) + { + var exportStr = line.Substring(26); + + int fwdIdx = exportStr.IndexOf("(forwarded to"); + if (fwdIdx != -1) + { + outStr.Append(exportStr.Substring(0, fwdIdx - 1)); + outStr.Append(" = "); + outStr.Append(exportStr.Substring(fwdIdx + 14, exportStr.Length - fwdIdx - 15)); + } + else + { + outStr.Append(exportStr); + + switch (exportStr) + { + case "DllMain", + "DllGetClassObject", + "DllCanUnloadNow", + "DllRegisterServer", + "DllUnregisterServer", + "DllInstall": + outStr.Append(" PRIVATE"); + } + } + + + outStr.Append("\n"); + } + } + + File.WriteAllText(scope $"{name}.txt", outStr); + + // + { + ProcessStartInfo startInfo = scope .(); + startInfo.SetFileName(@"c:\bin\lib.exe"); + if (pass == 0) + startInfo.SetArguments(scope $"/def:{name}.txt /machine:x64 /out:..\\x64\\{name}.lib"); + else + startInfo.SetArguments(scope $"/def:{name}.txt /machine:x64 /out:..\\x86\\{name}.lib"); + startInfo.CreateNoWindow = false; + SpawnedProcess process = scope SpawnedProcess(); + if (process.Start(startInfo) case .Err) + continue; + + process.WaitFor(); + if (process.ExitCode != 0) + Runtime.FatalError(scope $"Failed to generate lib '{name}'"); + } + } + } + + return 0; + } + } +} diff --git a/IDE/dist/lib/x64/comdlg32.lib b/IDE/dist/lib/x64/comdlg32.lib new file mode 100644 index 00000000..e5c8de33 Binary files /dev/null and b/IDE/dist/lib/x64/comdlg32.lib differ diff --git a/IDE/dist/lib/x64/gdi32.lib b/IDE/dist/lib/x64/gdi32.lib new file mode 100644 index 00000000..587a3039 Binary files /dev/null and b/IDE/dist/lib/x64/gdi32.lib differ diff --git a/IDE/dist/lib/x64/kernel32.lib b/IDE/dist/lib/x64/kernel32.lib new file mode 100644 index 00000000..83835135 Binary files /dev/null and b/IDE/dist/lib/x64/kernel32.lib differ diff --git a/IDE/dist/lib/x64/netapi32.lib b/IDE/dist/lib/x64/netapi32.lib new file mode 100644 index 00000000..a53a229c Binary files /dev/null and b/IDE/dist/lib/x64/netapi32.lib differ diff --git a/IDE/dist/lib/x64/ntdll.lib b/IDE/dist/lib/x64/ntdll.lib new file mode 100644 index 00000000..c1749c83 Binary files /dev/null and b/IDE/dist/lib/x64/ntdll.lib differ diff --git a/IDE/dist/lib/x64/ole32.lib b/IDE/dist/lib/x64/ole32.lib new file mode 100644 index 00000000..668d0c21 Binary files /dev/null and b/IDE/dist/lib/x64/ole32.lib differ diff --git a/IDE/dist/lib/x64/rpcrt4.lib b/IDE/dist/lib/x64/rpcrt4.lib new file mode 100644 index 00000000..6e086047 Binary files /dev/null and b/IDE/dist/lib/x64/rpcrt4.lib differ diff --git a/IDE/dist/lib/x64/user32.lib b/IDE/dist/lib/x64/user32.lib new file mode 100644 index 00000000..072d30dd Binary files /dev/null and b/IDE/dist/lib/x64/user32.lib differ diff --git a/IDE/dist/lib/x64/version.lib b/IDE/dist/lib/x64/version.lib new file mode 100644 index 00000000..e9389630 Binary files /dev/null and b/IDE/dist/lib/x64/version.lib differ diff --git a/IDE/dist/lib/x64/winmm.lib b/IDE/dist/lib/x64/winmm.lib new file mode 100644 index 00000000..5ceb50f5 Binary files /dev/null and b/IDE/dist/lib/x64/winmm.lib differ diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index 58b5fb4c..ffbbfa23 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -874,10 +874,10 @@ namespace IDE minRTModName.Insert(0, "_"); if (!is64Bit) - linkLine.Append(gApp.mInstallDir, @"lib\x86\msvcrt.lib Beef", IDEApp.sRTVersionStr,"MinRT32", minRTModName, ".lib "); + linkLine.Append("-libpath:\"", gApp.mInstallDir, "lib\\x86\" ", gApp.mInstallDir, "lib\\x86\\msvcrt.lib Beef", IDEApp.sRTVersionStr,"MinRT32", minRTModName, ".lib "); else - 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 "); + linkLine.Append("-libpath:\"", gApp.mInstallDir, "lib\\x64\" ", 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 -ignore:4049 -ignore:4217 "); } for (var libPath in libPaths)