Developer forums (C::B DEVELOPMENT STRICTLY!) > CodeCompletion redesign
It seems we don't need to create a dummy file to list gcc include paths
(1/1)
ollydbg:
Hi, all.
In the function below
--- Code: ---wxArrayString NativeParser::GetGCCCompilerDirs(const wxString &cpp_compiler, const wxString &base)
{
wxArrayString gcc_compiler_dirs;
// for starters , only do this for gnu compiler
// Manager::Get()->GetLogManager()->DebugLog(_T("CompilerID ") + CompilerID);
// wxString Command("mingw32-g++ -v -E -x c++ - < nul");
// specifying "< nul", does not seem to work
// workaround : create a dummy file (let's hope it does not exist)
// do the trick only for c++, not needed then for C (since this is a subset of C++)
wxString DummyFileName = wxFileName::CreateTempFileName(_T("Dummy_z4hsdkl9nf7ba3L9nv41"));
if(!DummyFileName.IsEmpty())
{
// let's construct the command
wxString Command = cpp_compiler + _T(" -v -E -x c++ ") + DummyFileName;
// action time (everything shows up on the error stream
wxArrayString Output, Errors;
wxExecute(Command, Output, Errors, wxEXEC_NODISABLE);
int nCount = Errors.GetCount();
// the include dir (1 per line) show up between the lines
// #include <...> search starts here:
// End of search list
// let's hope this does not change too quickly, otherwise we need
// to adjust our search code (for several versions ...)
bool bStart = false;
for(int idxCount = 0; idxCount < nCount; ++idxCount)
{
if (!bStart && Errors[idxCount] == _("#include <...> search starts here:"))
{
bStart = true;
}
else if (bStart && Errors[idxCount] == _("End of search list."))
{
bStart = false; // could jump out of for loop if we want
}
else if (bStart)
{
// Manager::Get()->GetLogManager()->DebugLog("include dir " + Errors[idxCount]);
// get rid of the leading space (more general : any whitespace)in front
wxRegEx reg(_T("^[ \t]*(.*)"));
if(reg.Matches(Errors[idxCount]))
{
wxString out = reg.GetMatch(Errors[idxCount], 1);
if(!out.IsEmpty())
{
wxFileName dir(out);
if (NormalizePath(dir,base))
{
Manager::Get()->GetLogManager()->DebugLog(_T("Caching GCC dir: ") + dir.GetFullPath());
gcc_compiler_dirs.Add(dir.GetFullPath());
}
else
#if wxCHECK_VERSION(2, 9, 0)
Manager::Get()->GetLogManager()->DebugLog(F(_T("Error normalizing path: '%s' from '%s'"),out.wx_str(),base.wx_str()));
#else
Manager::Get()->GetLogManager()->DebugLog(F(_T("Error normalizing path: '%s' from '%s'"),out.c_str(),base.c_str()));
#endif
}
}
}
} // end for : idx : idxCount
// clean up our temp file
::wxRemoveFile(DummyFileName);
} // Dummy is open
return gcc_compiler_dirs;
}
--- End code ---
A dummy file will be created to input to the command line like:
mingw32-g++ -v -E -x c++ dummyfilename
So, we need to create a dummyfile and after getting all the include paths, we need to delete this file.
After search on Google for an hour, I found there is a way to avoid this:
See this page:
http://gcc.gnu.org/ml/gcc-help/2004-02/msg00142.html
it use these command, it use a minus sign to replace a dummy file name.
mingw32-g++ -v -E -x c++ -
Sees work fine in MinGW, here is the report:
--- Code: ---
D:\test>mingw32-g++ -v -E -x c++ -
Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.4.0/configure --prefix=/mingw --build=mingw32 --enable
-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-registry
--disable-werror --enable-threads --disable-symvers --enable-cxx-flags='-fno-fu
nction-sections -fno-data-sections' --enable-fully-dynamic-string --enable-libgo
mp --enable-version-specific-runtime-libs --enable-sjlj-exceptions --with-pkgver
sion='TDM-1 mingw32' --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php
Thread model: win32
gcc version 4.4.0 (TDM-1 mingw32)
COLLECT_GCC_OPTIONS='-v' '-E' '-mtune=i386'
d:/mingw/bin/../libexec/gcc/mingw32/4.4.0/cc1plus.exe -E -quiet -v -iprefix d:\
mingw\bin\../lib/gcc/mingw32/4.4.0/ - -mtune=i386
ignoring nonexistent directory "d:\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../.
./mingw32/include"
ignoring duplicate directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de/c++"
ignoring duplicate directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de/c++/mingw32"
ignoring duplicate directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de/c++/backward"
ignoring duplicate directory "/mingw/lib/gcc/mingw32/4.4.0/../../../../include"
ignoring duplicate directory "d:/mingw/lib/gcc/../../include"
ignoring duplicate directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de"
ignoring duplicate directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de-fixed"
ignoring nonexistent directory "d:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/../
../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/mingw32
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/backward
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/include
d:\mingw\bin\../lib/gcc/mingw32/4.4.0/include-fixed
End of search list.
--- End code ---
Thanks. :D
thomas:
Very nice finding, ollydbg. 8)
Instead of "-", I would use /dev/null or nul depending on operating system, since otherwise gcc will hang (at least does here). Also, if you already call g++, the -x c++ is not needed.
Now, the question is whether to call gcc or g++, actually it would be nice to always call the "correct" compiler depending on whether you compile C or C++ so include paths would be different for C (which they are in real, too) ... but projects may be mixed, and you don't want to call an external program for every single source file parsed...
ollydbg:
Oh, Yes, you are right.
In MinGW, I found that if only use "-", then gcc will hang up. So, can this method be used in Windows?
Edit:
I'm sorry, I mis understand your previous message. Now I catch the point fully :D,
In Windows, this command works ( no hang up):
mingw32-g++ -v -E -x c++ nul
In Linux, this command works:
mingw32-g++ -v -E -x c++ /dev/null
In Linux, using "/dev/null" is better. I also found in the web page below:
http://www.linuxquestions.org/questions/showthread.php?p=2344101#post2344101
For the C or C++ issue, I think g++ is better, because it include all the C headers. :D
ollydbg:
I add a patch in BerliOS
https://developer.berlios.de/patch/index.php?func=detailpatch&patch_id=2783&group_id=5358
I would be happier any dev can test that under Linux. :D
Navigation
[0] Message Index
Go to full version