Click here to Skip to main content
Click here to Skip to main content

Tool for Converting VC++2005 Project to Linux Makefile

By , 13 Jul 2012
 

Introduction

This tool automatically converts Visual C++ 8.0 or 9.0 projects to Linux makefile. Important note, there is no loss during the conversion: source code and .sln/.vcproj files are left unchanged. The tool has been implemented in C# VS 2005.

Why?

  • Your application is cross-platform based.
  • Now you are facing a decision to migrate from Visual C++ 6 to 8 or 9.

Both these reasons force you to create a makefile manually and each small change in your project requires hard physical labor in makefile maintenance.

This tool will do it for you automatically and will provide you with the ability to keep .sln/.vcproj and .mak files synchronized.

Using the Tool

The tool is a command line (console application).

There are three cases for tool use I covered in this article:

  1.  You have a .sln - solution that has one or more .vcproj (projects), among which one of them has the same name as the solution itself and is the main/leading project. This leading project should be a target project that will be compiled into .exe or .dll. Other projects in this solution are dependencies for the leading project. Makefiles will not be generated for those projects that do not have dependencies. Sub-projects can have additional dependencies on external precompiled libraries (libs), stdlib.
  2. You should not sign those dependencies explicitly for a tool; it will be parsed from .vcproj files.

    In this case, the usage:

    sln2mak [Solution_FullPath_File_Name].sln

    Example:

    sln2mak c:/myprojects/test/unit_test.sln
  3. The same case as 1, except that the leading project has a name that is different from the solution name. Flag –l for leading followed by leading project name and then solution fullpath.  
  4. In this case, the usage:

    sln2mak -l [LEADING_Project_Name] [Solution_FullPath_File_Name].sln

    Example:

    sln2mak -l unit_test c:/myprojects/test/test.sln
  5. You'd like to create a makefile from a list of projects without solution "wrapper". For example, you'd like to create a makefile with different structures, not like the one you have for WindowsOS.

    You have a main/leading project and other projects are dependencies of that.

    In addition, you have some precompiled libraries (libs) that you'd like to see them as dependencies for the leading project.  However, they are not listed in the main .vcproj. How can it be, you'll ask? For example, in some solution you have your leading project with all its sub-projects. One of those projects, that the leading project is dependent on, has a dependencies to some precompiled libraries and those are listed within its .vcproj file. So if you use the tool for the whole solution, those dependencies for linker will be parsed from this project and will be listed in its .mak file and then linked by linker to the main/leading project well. But now you'd like to compile only specific list of project that don’t involve  the dependent project, so you  are required to list those libs dependencies manually. Flag –d for dependencies followed by the list of those libs dependencies. 

    sln2mak [LEADING_Project_FullPath_Name].vcproj [Project_FullPath_Name_2].vcproj ... 
             [Project_FullPath_Name_n].vcproj -d [lib_Name_1] ... [lib_Name_n]

    Example:

    sln2mak c:/myprojects/tets/unit_test.vcproj c:/myprojects/tets/test_lib.vcproj 
        -d mystaticlib1 mystaticlib2 mystaticlib3 

    For usage, call sln2mak with no arguments.  

    After application runs, you'll find .mak file in path where .vcproj is located with the same name as the project.

    .mak files have all additional libraries path, sources, flags for compiler, linker, preprocessor and target path. 

In .sln path, you'll find Makefile that will handle all target rules (clean, make) and dependencies.

sln2mak/Makefile.JPG

Points of Interest

Parser Class

This class has a static constructor that aims to be known for all classes without instantiation.

It holds regular expression that serves all other classes for parsing .sln and .vcproj files.

Regex m_ProjectGuid      = new Regex(@"ProjectGUID=""\{(.*)\}"""        ) ;
Regex m_SlnExtention     = new Regex(@"(.*)(.[Ss][Ll][Nn])$"            ) ;
Regex m_VcprojExtention  = new Regex(@"(.*)(.[Vv][Cc][Pp][Rr][Oo][Jj])$") ;
Regex m_ProjectRegex     = new Regex(@"Project\(""\{(.*)\}""\) = ""(.*)"", ""(.*)"",
   ""\{(.*)\}""") ;

VcSlnInfo Class

This class parses solution file and creates Makefile with target rules.

This class uses stream reader for reading .sln file line by line. During reading .sln file, it recognizes an active project (its name is similar to the solution name) and creates four dictionaries that hold information about all main and dependent projects:

  • Key = Guid number , Value = ProjectName
  • Key = ProjectName , Value = ProjectFullPath
  • Key = ProjectName , Value = MakeFileName
  • Key = ProjectName , Value = ProjectDependencies
Dictionary<string, string>  m_ProjGuidName = new Dictionary<string, string>() ;

Then method ParseVcproj is called - public VcProjInfo class's function, but first for each .vcproj  instance of VcProjInfo object created with projectName, projectFullPath and projectMakFileName.

VcProjInfo Class

In this class, VCProjectEngine object is used for retrieving all the necessary information about .vcproj, like target type and name, compiler flags, additional libraries, linker flags, sources and filters, preprocessor definitions, configurations, etc.

using Microsoft.VisualStudio.VCProjectEngine;
VCProjectEngine vcprojEngine = new VCProjectEngineObject();
//Init VCProject vcProj object
VCProject m_VcProj = (VCProject)vcprojEngine.LoadProject(vcProjFile);

//Init vcproj configurations list 
IVCCollection m_ConfigCollection = (IVCCollection)m_VcProj.Configurations;

All these helped me to create .mak file with CFLAGS, LDFLAGS, OBJS, etc.

Important Notes

  • There is no loss during the conversion: source code stays unchanged.  
  • Probably I did not cover all flags during parsing from .vcproj to .mak, but now you have all necessary information to be able to add anything I've missed.
  • During my work I inspect that there are few differences between VC++ 8 solution/vcproj and VC++ 9, so you can use this tool for both.
  • If you convert this source code to Visual Studio 2008, please use proper Microsoft.VisualStudio.VCProjectEngine reference version 9.0.0.0 instead of 8.0.0.0.

History  

Prior to writing the application, I tried to find a similar tool on the internet, but was only successful in finding other people's questions on online forums regarding the issue.
Then I attempted to understand XML-schema of a VC++8 solution and project, but the schema wasn't clear enough.

Suddenly I found a Microsoft.VisualStudio.VCProjectEngine reference with VCProjectEngine object within .NET components which helped me to understand the structure of a VC++ 2005 project. I used this object in my application for .vcproj parsing instead of using System.Xml for XML tree reading, and this without proper XML schema documentation.

sln2mak/reference.JPG

Disclaimer 

The information provided on this page comes without any warranty whatsoever.  

This tool has been extensively tested before being published, but always there is the possibility to find some weakness. I strongly recommend that you back up your project before using this tool. Moreover, though I am willing to know if there is anything I can do in order to improve it, let me clearly say that it's not my fault if your project is corrupted by this tool.

Update History  

  • 20/4/2009 Bug fixes (sorry for long delay)
    • Added some spaces in dependencies
    • Removed a loop which was creating multiple rules for a single project
    • Added uppercase WIN32 to be replaced by uppercase LINUX
    • Removed -o option for CPP files
    • Removed printing of "else"
    • Full path for dependent project fixed.

    Especially thanks to Ahmad and Adrej, who helped me to find and fix all listed bugs.

  • 6/9/2008 Bug fixes
    • Uses sln2mak.exe from the same path as .sln/.vcproj.
  • 16/9/2008 Bug fixes 
    • Handles null reference for VC compiler tool, recursive file filters expanding during sources list creation

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Maria Adamsky
Software Developer EFC Real Solutions on Time,LTD
Israel Israel
Member
Software developer at EFC Real Solutions on Time,LTD(Israel) in infrastructure team.
Developing Grid computing application for data communication simulations.
Writing Cross-Platform Software (Windows and Linux).

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralRe: Got ArgumentOutOfRangeException messagememberAlexander Lishansky27 Nov '10 - 21:27 
GeneralRe: Got ArgumentOutOfRangeException messagememberAlexander Lishansky27 Nov '10 - 21:25 
GeneralRe: Got ArgumentOutOfRangeException messagememberMaria Adamsky27 Nov '10 - 21:38 
GeneralGot KeyNotFoundException messagememberAlexander Lishansky27 Nov '10 - 20:30 
QuestionRuntime exception with VCProjectEngine 10memberEdgar Vilela Gadbem23 Nov '10 - 0:41 
AnswerRe: Runtime exception with VCProjectEngine 10memberMaria Adamsky27 Nov '10 - 21:06 
GeneralRe: Runtime exception with VCProjectEngine 10memberEdgar Vilela Gadbem28 Nov '10 - 7:46 
QuestionSpecified cast is not valid - m_VcProj = (VCProject)vcprojEngine.LoadProject(vcProjFile);memberDonald Wickham15 Nov '10 - 10:49 
AnswerRe: Specified cast is not valid - m_VcProj = (VCProject)vcprojEngine.LoadProject(vcProjFile);memberMaria Adamsky15 Nov '10 - 21:23 
GeneralRe: Specified cast is not valid - m_VcProj = (VCProject)vcprojEngine.LoadProject(vcProjFile);memberDonald Wickham16 Nov '10 - 4:31 
GeneralRe: Specified cast is not valid - m_VcProj = (VCProject)vcprojEngine.LoadProject(vcProjFile);memberMaria Adamsky16 Nov '10 - 4:45 
GeneralKeyNotFoundExceptionmemberamol987618 Oct '10 - 0:52 
GeneralRe: KeyNotFoundExceptionmemberamol987618 Oct '10 - 1:09 
GeneralRe: KeyNotFoundExceptionmemberMaria Adamsky18 Oct '10 - 2:53 
GeneralRe: KeyNotFoundExceptionmemberPbednaruk22 Oct '10 - 9:41 
GeneralRe: KeyNotFoundExceptionmemberMaria Adamsky23 Oct '10 - 9:17 
GeneralRe: KeyNotFoundExceptionmemberamol987625 Oct '10 - 4:08 
Questionno visual studio?memberKethara21 Sep '10 - 0:50 
AnswerRe: no visual studio?memberMaria Adamsky21 Sep '10 - 1:02 
Generalwhen I use your Tool,It has exception!memberjeckbjy16 Sep '10 - 18:00 
GeneralRe: when I use your Tool,It has exception!memberMaria Adamsky21 Sep '10 - 1:07 
Questionx64 platforms [modified]memberHowitZer264 Sep '10 - 4:58 
GeneralMakefile -> VCProj toolmemberTercete30 Jul '10 - 6:15 
GeneralRe: Makefile -> VCProj toolmemberMaria Adamsky31 Jul '10 - 9:49 
GeneralMy vote of 3memberxComaWhitex27 Jul '10 - 21:52 
GeneralSln2Mak Does it work with Visual Studio 2010memberCavair19 Jul '10 - 3:28 
GeneralRe: Sln2Mak Does it work with Visual Studio 2010memberMaria Adamsky19 Jul '10 - 4:50 
GeneralRecursive variable 'CXXFLAGS' references itself (eventually)memberelwayman0216 Jun '10 - 6:08 
GeneralNice work!member__PPS__6 May '10 - 11:12 
GeneralRe: Nice work!memberMaria Adamsky6 May '10 - 20:57 
GeneralRe: Nice work!member__PPS__7 May '10 - 11:46 
GeneralTried running against c++ vc2008 sln file - crash/exception/failedmembertjurik7 Apr '10 - 10:45 
GeneralRe: Tried running against c++ vc2008 sln file - crash/exception/failedmemberMaria Adamsky6 May '10 - 20:58 
GeneralRe: Tried running against c++ vc2008 sln file - crash/exception/failedmemberVictor Miranda11 Jun '10 - 7:36 
GeneralRe: Tried running against c++ vc2008 sln file - crash/exception/failedmemberMaria Adamsky12 Jun '10 - 21:48 
GeneralCannot build with VS2008membertjurik7 Apr '10 - 10:39 
GeneralRe: Cannot build with VS2008memberMaria Adamsky7 Apr '10 - 21:15 
GeneralFiles outside of any filters in projectsmemberHowitZer2610 Feb '10 - 8:02 
GeneralRe: Files outside of any filters in projectsmemberMaria Adamsky6 May '10 - 21:00 
GeneralRe: Files outside of any filters in projectsmemberHowitZer267 May '10 - 2:13 
GeneralConverting project instead of solution [modified]memberHowitZer2621 Jan '10 - 7:16 
GeneralRe: Converting project instead of solutionmemberMaria Adamsky23 Jan '10 - 21:00 
QuestionRe: Converting project instead of solutionmemberHowitZer2626 Jan '10 - 11:36 
AnswerRe: Converting project instead of solutionmemberMaria Adamsky26 Jan '10 - 20:41 
GeneralRe: Converting project instead of solutionmemberHowitZer2628 Jan '10 - 5:19 
GeneralRe: Converting project instead of solutionmemberMaria Adamsky30 Jan '10 - 4:35 
Generalerror msgmemberthunder05044 Jan '10 - 14:21 
GeneralRe: error msgmemberP.Gopalakrishna4 Jan '10 - 17:02 
GeneralRe: error msgmemberarkavat26 Jul '10 - 3:30 
GeneralGood toolmemberP.Gopalakrishna3 Jan '10 - 23:49 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130513.1 | Last Updated 13 Jul 2012
Article Copyright 2008 by Maria Adamsky
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid