I remember in the ol' days getting people to run vcvarsall.bat
before compiling anything on Windows. Assuming default install location, where do I find cl.exe
, link.exe
, and friends; if it's not in the PATH
?
Attempt:
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
const inline LPCWSTR find_cl() {
/* Most of this list derived from
https://gitlab.kitware.com/cmake/cmake/-/blob/417b765f/Modules/GetPrerequisites.cmake#L670 */
static const LPCSTR cl_paths[12] = {
"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin",
"C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin",
"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin",
"C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin",
"C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin",
"C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin",
"C:\\Program Files\\Microsoft Visual Studio 8\\VC\\BIN",
"C:\\Program Files (x86)\\Microsoft Visual Studio 8\\VC\\BIN",
"C:\\Program Files\\Microsoft Visual Studio .NET 2003\\VC7\\BIN",
"C:\\Program Files (x86)\\Microsoft Visual Studio .NET 2003\\VC7\\BIN",
"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\Hostx86\\x64",
"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\Hostx86\\x86",
};
size_t i;
for (i = 0; i < sizeof cl_paths / sizeof cl_paths[0]; i++)
if (_access(cl_paths[i], 0) == 0)
return cl_paths[i];
return NULL;
}
With a trivial entrypoint:
int main(void) {
const LPCWSTR cl_path = find_cl();
if (cl_path == NULL)
return EXIT_FAILURE;
printf("Found cl_path of: \"%s\"\n", cl_path);
return EXIT_SUCCESS;
}
I'll detect the architecture also, so will look for the compiler matching current architecture first, then fallback to other architectures. I'm assuming there's a list of 30+ variants of these somewhere?