[cfe-dev] Windows port: clang to autoprobe for system include / library pathes

Tarmo Pikaro tapika at yahoo.com
Sat Jan 5 00:43:40 PST 2013


Hi !

João Matos <ripzonetriton at gmail.com> has made some patch to autoprobe for Visual studio system include and library pathes -

commit - 
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120903/063802.html

http://llvm.org/viewvc/llvm-project?view=rev&revision=163076


But I guess this commit was reverted - since I cannot find this function in rev 163370.

What do you think if I'll bring it back into clang once again.

There is several issues - one - developer should be able to specify manually which VS environment he wants to use
(vs2008, vs2010, vs2012...) - VS environment can be autoprobed, but it's only for hello world style apps.
Now I have prototyped by using special env variable VSENV = 8/9/10 - 2005 - 8, 2008 - 9, 2010 - 10.

Attaching console code snipet:

#include "stdafx.h"
#ifndef _WIN32
#error "failed"
#endif


#ifdef _WIN32
#include <string>
#include <vector>
#include <stdio.h>

static std::string exec(const char* cmd)
{
    FILE* pipe = _popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[1024];
    std::string result = "";
    while(!feof(pipe)) {
    if(fgets(buffer, sizeof(buffer), pipe) != NULL)
    result += buffer;
    }
    _pclose(pipe);
    return result;
}

#pragma comment(lib, "shlwapi.lib")     //_popen, _pclose
#include <shlwapi.h>

//
//  Returns true if got settings, false if not.
//
bool GetVisualStudioEnv(
    const char* envVar,                         // [in] "INCLUDE" / "LIBPATH"
    std::vector<std::string>& vecPathes,
    int iProbeFrom = 0, int iProbeTo = 0        // 2005 - 8, 2008 - 9, 2010 - 10
)
{
    std::string s;
    
    if( iProbeFrom == 0 && iProbeTo == 0 )
    {
        // Environment variable specifies which VS to use.
        if( getenv("VSENV") != NULL )
        {
            int iVer = atoi( getenv("VSENV") );
            
            if( iVer == 0 )
                return false;
            
            return GetVisualStudioEnv(envVar, vecPathes, iVer, iVer );
        }
        
        iProbeFrom = 20;
        iProbeTo = 8;
    } //if
    

    for( int iProbeVer = iProbeFrom; iProbeVer >= iProbeTo; iProbeVer-- )
    {
        char envvar[64];
        sprintf(envvar, "VS%d0COMNTOOLS", iProbeVer);
        
        // Not defined
        if( getenv(envvar) == NULL ) 
            continue;

        std::string cmd = getenv(envvar);
        cmd += "\\..\\..\\vc\\vcvarsall.bat";
        
        if( !PathFileExistsA( cmd.c_str() ) )
            continue;
            
        //printf("Located: %s", envvar);
        
        cmd = "cmd /C \"" + cmd + "\" ^>nul ^& set";
        s = exec(cmd.c_str());
        break;
    }
    
    if( s.length() == 0 ) 
        return false;

    char* envline;
    
    vecPathes.clear();

    for (envline = strtok( &s[0], "\n" );  envline;  envline = strtok( NULL, "\n" ))
    {
        char* varend = strchr( envline, '=');
        if( !varend )
            continue;
        
        *varend = 0;
        
        if( strcmp(envline,envVar) == 0 )
        {
            char* val;
            for (val = strtok( varend + 1, ";" );  val;  val = strtok( NULL, ";" ))
            {
                vecPathes.push_back(val);
            }
            
            return true;
        }
        *varend = '=';
    } //for

    return false;
} //GetVisualStudioEnv


#endif //_WIN32


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<std::string> vecPathes;
    
    if(GetVisualStudioEnv("INCLUDE",vecPathes) )
    {
        for( unsigned int i = 0;  i < vecPathes.size(); i++ )
        {
            printf("'%s'\n", vecPathes[i].c_str());
        }
    }

    //printf("env: '%s'\n",exec("set INCLUDE").c_str());
return 0;
}


So this is my initial proposal for API / include / folder pathes obtaining.
 
--
Have a nice day!
Tarmo.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130105/edc595ca/attachment.html>


More information about the cfe-dev mailing list