I've been exploring mkconcore.py and noticed that several external tool paths and executable names (specifically CPPWIN, CPPEXE, VWIN, VEXE, etc.) are hardcoded at the top of the script.
While MCRPATH has a mechanism to be overridden via a concore.mcr file, the other tools do not. This limits portability, for example, it prevents users from easily swapping g++ for clang, or using tools that aren't in the system PATH without modifying the source code.
I think we should refactor this to load these values from a configuration file (like a config.ini) or checks for environment variables, falling back to these defaults.