Browse Source

Fix microsoft_craziness.h to work correctly

gingerBill 5 years ago
parent
commit
404132de17
2 changed files with 55 additions and 9 deletions
  1. 11 4
      src/main.cpp
  2. 44 5
      src/microsoft_craziness.h

+ 11 - 4
src/main.cpp

@@ -1355,13 +1355,20 @@ int main(int arg_count, char const **arg_ptr) {
 		}
 
 		// Add library search paths.
-		if (false && find_result.vs_library_path.len > 0) {
+		if (find_result.vs_library_path.len > 0) {
 			GB_ASSERT(find_result.windows_sdk_um_library_path.len > 0);
 			GB_ASSERT(find_result.windows_sdk_ucrt_library_path.len > 0);
 
-			link_settings = gb_string_append_fmt(link_settings, " /LIBPATH:\"%.*s\"", LIT(find_result.vs_library_path));
-			link_settings = gb_string_append_fmt(link_settings, " /LIBPATH:\"%.*s\"", LIT(find_result.windows_sdk_um_library_path));
-			link_settings = gb_string_append_fmt(link_settings, " /LIBPATH:\"%.*s\"", LIT(find_result.windows_sdk_ucrt_library_path));
+			String path = {};
+			auto add_path = [&](String path) {
+				if (path[path.len-1] == '\\') {
+					path.len -= 1;
+				}
+				link_settings = gb_string_append_fmt(link_settings, " /LIBPATH:\"%.*s\"", LIT(path));
+			};
+			add_path(find_result.windows_sdk_um_library_path);
+			add_path(find_result.windows_sdk_ucrt_library_path);
+			add_path(find_result.vs_library_path);
 		}
 
 		if (!build_context.use_lld) { // msvc

+ 44 - 5
src/microsoft_craziness.h

@@ -457,11 +457,28 @@ bool find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
             auto version_tail = wcschr(version, '\n');
             if (version_tail)  *version_tail = 0;  // Stomp the data, because nobody cares about it.
 
-            auto library_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\lib\\x64\\");
+            wchar_t *library_path = nullptr;
+            if (build_context.metrics.arch == TargetArch_amd64) {
+                library_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\lib\\x64\\");
+            } else if (build_context.metrics.arch == TargetArch_386) {
+                library_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\lib\\x86\\");
+            } else {
+                continue;
+            }
+
             auto library_file = concat(library_path, L"vcruntime.lib");  // @Speed: Could have library_path point to this string, with a smaller count, to save on memory flailing!
 
             if (os_file_exists(library_file)) {
-                auto link_exe_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\bin\\Hostx64\\x64\\");
+                wchar_t *link_exe_path = nullptr;
+                if (build_context.metrics.arch == TargetArch_amd64) {
+                    link_exe_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\bin\\Hostx64\\x64\\");
+                } else if (build_context.metrics.arch == TargetArch_386) {
+                    link_exe_path = concat(bstr_inst_path, L"\\VC\\Tools\\MSVC\\", version, L"\\bin\\Hostx86\\x86\\");
+                } else {
+                    continue;
+                }
+
+
                 result->vs_exe_path     = link_exe_path;
                 result->vs_library_path = library_path;
                 return true;
@@ -508,7 +525,15 @@ bool find_visual_studio_by_fighting_through_microsoft_craziness(Find_Result *res
 
             // @Robustness: Do the zero-termination thing suggested in the RegQueryValue docs?
 
-            auto lib_path = concat(buffer, L"VC\\Lib\\amd64\\");
+            wchar_t *lib_path = nullptr;
+
+            if (build_context.metrics.arch == TargetArch_amd64) {
+                lib_path = concat(buffer, L"VC\\Lib\\amd64\\");
+            } else if (build_context.metrics.arch == TargetArch_386) {
+                lib_path = concat(buffer, L"VC\\Lib\\386\\");
+            } else {
+                continue;
+            }
 
             // Check to see whether a vcruntime.lib actually exists here.
             auto vcruntime_filename = concat(lib_path, L"vcruntime.lib");
@@ -537,8 +562,13 @@ Find_Result find_visual_studio_and_windows_sdk() {
 
 
     if (result.windows_sdk_root) {
-        result.windows_sdk_um_library_path   = concat(result.windows_sdk_root, L"um\\x64\\");
-        result.windows_sdk_ucrt_library_path = concat(result.windows_sdk_root, L"ucrt\\x64\\");
+        if (build_context.metrics.arch == TargetArch_amd64) {
+            result.windows_sdk_um_library_path   = concat(result.windows_sdk_root, L"um\\x64\\");
+            result.windows_sdk_ucrt_library_path = concat(result.windows_sdk_root, L"ucrt\\x64\\");
+        } else if (build_context.metrics.arch == TargetArch_386) {
+            result.windows_sdk_um_library_path   = concat(result.windows_sdk_root, L"um\\x86\\");
+            result.windows_sdk_ucrt_library_path = concat(result.windows_sdk_root, L"ucrt\\x86\\");
+        }
     }
 
     bool ok = find_visual_studio_by_fighting_through_microsoft_craziness(&result);
@@ -569,5 +599,14 @@ Find_Result_Utf8 find_visual_studio_and_windows_sdk_utf8() {
     r.vs_exe_path                   = mc_wstring_to_string(result.vs_exe_path);
     r.vs_library_path               = mc_wstring_to_string(result.vs_library_path);
 
+    // printf("windows_sdk_root:              %.*s\n", LIT(r.windows_sdk_root));
+    // printf("windows_sdk_um_library_path:   %.*s\n", LIT(r.windows_sdk_um_library_path));
+    // printf("windows_sdk_ucrt_library_path: %.*s\n", LIT(r.windows_sdk_ucrt_library_path));
+    // printf("vs_exe_path:                   %.*s\n", LIT(r.vs_exe_path));
+    // printf("vs_library_path:               %.*s\n", LIT(r.vs_library_path));
+
+    // gb_exit(1);
+
     return r;
 }
+