MSBuild / Visual Studio aware error messages and message formats
MSBuild recognizes error messages and warnings that have been specially formatted by many command line tools that typically write to the console. For instance, take a look at the following error messages - they are all properly formatted to be MSBuild and Visual Studio friendly.
Main.cs(17,20): warning CS0168: The variable 'foo' is declared but never used
C:\dir1\foo.resx(2) : error BC30188: Declaration expected.
cl : Command line warning D4024 : unrecognized source file type 'foo.cs', object file assumed
error CS0006: Metadata file 'System.dll' could not be found.
These messages confirm to special format that is shown below, and comprise 5 parts - the order of these parts are important and should not change:
(See image here)
Origin (Required)
Origin can be blank. If present, the origin is usually a tool name, like 'cl' in one of the examples. But it could also be a filename, like 'Main.cs' shown in another example. If it is a filename, then it must be an absolute or a relative filename, followed by an optional paranthesized line/column information in one of the following forms:
(line) or (line-line) or (line-col) or (line,col-col) or (line,col,line,col)
Lines and columns start at 1 in a file - i.e. the beginning of a file is 1, and the leftmost column is 1. If the Origin is a tool name, then it must not change based on local - i.e. it needs to be locale neutral.
Subcategory (Optional)
Subcategory is used to classify the category itself further, and should not be localized.
Category (Required)
Category must be either 'error' or 'warning'. Case does not matter. Like origin, category must not be localized.
Code (Required)
Code identifies an application specific error code / warning code. Code must not be localized and it must not contain spaces.
Text (Optional)
User friendly text that explains the error, and *must* be localized if you cater to multiple locales.
So, how does MSBuild use Errors and Warnings emitted by external tools?
When MSBuild calls command line tools (for instance, csc.exe or vbc.exe), it looks at the output emitted by the tool to standard out / standard error streams. Any lines that match the error format that I just described will be treated specially - i.e. lines that are recognized as errors or warnings will be turned into build errors and warnings respectively.
So, what's the big deal about this anyway? (Here comes the really cool part) :)
To see the real benefit of this, you have to be building from within Visual Studio. Because MSBuild treats these messages specially, they get logged as first class warnings and errors in the Visual Studio task list. If the Origin specifies line/column information, then double clicking on the message will take you to the source of the error in the offending file.
[ Author : Faisal Mohamood ]
Comments
Anonymous
November 07, 2006
This is really cool. One minor problem is that I get two errors in the VS task list. One for the error picked up by parsing the output (awesome - thanks) and the other because the tool returned an error code. I'm invoking the tool using the error task. If I set IgnoreExitCode to false, the second error caused the by exit code doesn't show up but then again MSBUILD thinks the target succeeded when it really failed. Is there a way that I can have my cake and eat it too?Anonymous
November 07, 2006
The comment has been removedAnonymous
January 03, 2007
Hello, nice site look this: <a href="http://urlzip.de/5m9">chanel handbags</a> End ^) See youAnonymous
March 11, 2007
mmm.. nice design, I must say..Anonymous
March 14, 2007
Du musst ein Fachmann sein - wirklich guter Aufstellungsort, den du hast!Anonymous
March 18, 2007
luogo grande:) nessun osservazioni!Anonymous
March 19, 2007
Chi ha fatto questo? E un buon posto per trovare le informazioni importanti!:)Anonymous
May 22, 2007
Hi. Cool design. Keep up the good. Good luck.Anonymous
May 22, 2007
Hi. Cool design. Keep up the good. Good luck.Anonymous
June 12, 2007
MSN I NIIPET <a href="http://msn.com">MSN</a>Anonymous
July 02, 2007
Is-it possible to change to language of the errors messages text ? ThanksAnonymous
August 24, 2007
The comment has been removedAnonymous
September 19, 2007
This is really nice for Errors and Warnings, but how do you get VS to log a simple informational message. Category only contains error and warning and by experimentation I see that VS ignores attempts at "message", "informational", etc... Is there a magic incantation?Anonymous
January 02, 2008
It's worth noting that "warning" and "error" MUST be lower case in order to be recognized. I.e., "Warning" will not be recognized.Anonymous
January 10, 2008
<a href= http://puhlov.com >mixolgy measurments</a>Anonymous
February 02, 2008
I have a problem. When compiling c++ with cl the file names in error messages are lowercased. This is not the case when building from inside Visual Studio 2005. How can I prevent this case change when using cl? Thanks, gregAnonymous
December 29, 2008
The comment has been removedAnonymous
February 16, 2009
The comment has been removedAnonymous
February 16, 2009
The comment has been removedAnonymous
March 27, 2009
With regard to: Messages Indicates the number of Messages in the list. Click to toggle whether Messages are displayed. What is the syntax to add "message" to the "Messages" list in the build output. So far I have: printf("UnitTest++: info UT100: %d tests passed.n", totalTestCount); printf("UnitTest++: message UT100: %d tests passed.n", totalTestCount); printf("UnitTest++: warning UT100: %d tests passed.n", totalTestCount); printf("UnitTest++: error UT100: %d tests passed.n", totalTestCount); The first 2 "info" and "message" do not show up in the "Messages" list. The "warning" and "error" work as expected.Anonymous
April 19, 2012
Like Joe Chavez, I too really want to know how I can get a message in to the 'Messages' list in the Error List pane of VS2010 via a #pragma message in C++. Please can you help?Anonymous
May 02, 2014
This is the appropriate MSDN page which describes the format/syntax quite well. msdn.microsoft.com/.../yxkt8b26.aspxAnonymous
October 09, 2014
The comment has been removed