//========= (C) Copyright 2009-2016 Valve, L.L.C. All rights reserved. ======== // // The copyright to the contents herein is the property of Valve, L.L.C. // The contents may be used and/or copied only with the written permission of // Valve, L.L.C., or in accordance with the terms and conditions stipulated in // the agreement/contract under which the contents have been supplied. // // $Header: $ // $NoKeywords: $ // //============================================================================= #include "tier0/dbg.h" #include "environment_utils.h" #ifdef PLATFORM_WINDOWS_PC #include // for RegGetValue #endif #undef GetCurrentDirectory #undef OUT #undef ERR #if defined( PLATFORM_WINDOWS_PC ) bool VGetRegistryKeyValue( HKEY baseKey, const char *pSubKey, const char *pValue, char *pOutBuf, int nMaxBuf ) { DWORD nBufSize = nMaxBuf; HKEY hKey = NULL; LONG nResult; nResult = RegOpenKeyEx( baseKey, pSubKey, NULL, KEY_READ, &hKey ); if ( nResult == ERROR_SUCCESS ) { nResult = RegQueryValueExA( hKey, pValue, NULL, NULL, (LPBYTE)pOutBuf, &nBufSize); RegCloseKey( hKey ); return nResult == ERROR_SUCCESS; } return false; } #endif //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- bool GetWindowsSDKDir( char *pOutBuf, int nMaxBuf ) { #ifdef PLATFORM_WINDOWS_PC const char *pWindowsSDKDirRegKey = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows"; if( !VGetRegistryKeyValue( HKEY_LOCAL_MACHINE, pWindowsSDKDirRegKey, "CurrentInstallFolder", pOutBuf, nMaxBuf ) && !VGetRegistryKeyValue( HKEY_CURRENT_USER, pWindowsSDKDirRegKey, "CurrentInstallFolder", pOutBuf, nMaxBuf ) ) { Warning( "ERROR: Failed to read VS Windows SDK from registry key '%s'\n", pWindowsSDKDirRegKey ); return false; } return true; #else return false; #endif } //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- bool GetMSVCIncludePaths( CUtlVector &paths, const char *pVSToolsEnv ) { const char *pVSToolsPath = Plat_GetEnv( pVSToolsEnv ); if ( !pVSToolsPath ) { Warning( "ERROR: GetMSVCIncludePaths failed to read VS location from environment variable '%s'\n", pVSToolsEnv ); return false; } char pWindowsSDKDir[MAX_PATH]; if ( !GetWindowsSDKDir( pWindowsSDKDir, sizeof(pWindowsSDKDir) ) ) { return false; } char pVSRootPath[MAX_PATH]; V_MakeAbsolutePath( pVSRootPath, sizeof(pVSRootPath), "../../", pVSToolsPath ); char pIncludePath[MAX_PATH]; V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "VC/INCLUDE", pVSRootPath ); paths.AddToTail( pIncludePath ); V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "VC/ATLMFC/INCLUDE", pVSRootPath ); paths.AddToTail( pIncludePath ); V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "INCLUDE", pWindowsSDKDir ); paths.AddToTail( pIncludePath ); return true; } //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- bool GetX360IncludePaths( CUtlVector &paths ) { const char *pXdkPathEnv = "XEDK"; const char *pXdkPath = Plat_GetEnv( pXdkPathEnv ); if ( !pXdkPath ) { Warning( "ERROR: GetX360IncludePaths failed to read XDK location from environment variable '%s'\n", pXdkPath ); return false; } char pIncludePath[MAX_PATH]; V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "include/xbox", pXdkPath ); paths.AddToTail( pIncludePath ); V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "include/win32", pXdkPath ); paths.AddToTail( pIncludePath ); return true; } //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- bool GetOSXIncludePaths( CUtlVector &paths ) { const char *pPath = Plat_GetEnv( "SDKROOT" ); if ( !pPath ) { pPath = Plat_GetEnv( "OSX_SDK_PATH" ); if ( !pPath ) { Warning( "ERROR: %s failed to read SDK location from environment variable 'SDKROOT' or 'OSX_SDK_PATH'\n", __FUNCTION__ ); return false; } } char pIncludePath[MAX_PATH]; V_MakeAbsolutePath( pIncludePath, sizeof(pIncludePath), "usr/include", pPath, false ); paths.AddToTail( pIncludePath ); return true; } //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- bool GetSystemIncludePaths( CUtlVector &paths, const char *pPlatform, const char *pCompiler ) { #if !defined( PLATFORM_WINDOWS ) && !defined( PLATFORM_POSIX ) && !defined( PLATFORM_OSX ) Warning( "ERROR: GetSystemIncludePaths not implemented for this platform!\n" ); return false; #endif if ( !V_stricmp_fast( pPlatform, "WIN32" ) || !V_stricmp_fast( pPlatform, "WIN64" ) ) { if ( !V_stricmp_fast( pCompiler, "VS2005" ) ) { return GetMSVCIncludePaths( paths, "VS80COMNTOOLS" ); } else if ( !V_stricmp_fast( pCompiler, "VS2010" ) ) { return GetMSVCIncludePaths( paths, "VS100COMNTOOLS" ); } else if ( !V_stricmp_fast( pCompiler, "VS2012" ) ) { return GetMSVCIncludePaths( paths, "VS110COMNTOOLS" ); } else if ( !V_stricmp_fast( pCompiler, "VS2013" ) ) { return GetMSVCIncludePaths( paths, "VS120COMNTOOLS" ); } else if ( !V_stricmp_fast( pCompiler, "VS2015" ) ) { return GetMSVCIncludePaths( paths, "VS140COMNTOOLS" ); } AssertMsg1( false, "ERROR: GetSystemIncludePaths not implemented for this compiler yet! (%s)\n", pCompiler ); return false; } else if ( !V_stricmp_fast( pPlatform, "X360" ) ) { return GetX360IncludePaths( paths ); } else if ( !V_stricmp_fast( pPlatform, "LINUXSTEAMRT64" ) || !V_stricmp_fast( pPlatform, "LINUXSERVER64" ) ) { // The Steam runtime tool.sh script will rewrite /usr/include // to whatever is appropriate for runtime compiles, so // we can just blindly use it here and it will work both // for runtime and non-runtime compiles. paths.AddToTail( "/usr/include" ); return true; } else if ( !V_stricmp_fast( pPlatform, "OSX32" ) || !V_stricmp_fast( pPlatform, "OSX64" ) ) { return GetOSXIncludePaths( paths ); } AssertMsg1( false, "ERROR: GetSystemIncludePaths not implemented for this platform yet! (%s)\n", pPlatform ); return false; }