生成VC项目的python代码,加入指定目录下所有目录及其所属文件到项目。

     当代码文件成千上万,项目上百,编译一遍需要半天到一天。阅读编写代码时候,找类型 、函数、变量定义实现的效率会急剧下降。

     对于这种情况,一个方法是打Tag,通过Tag找。我更喜欢的方法是把这些所有的代码文件加入到一个VC项目中去。通过VC或者VA跳转。

     为此写了一段Python 程序 ,生成VC静态库项目 ,把指定目录下所有目录及其所属文件加入到该VC项目。每次更新过代码后,双击重新生成项目。极大地方便了本人代码读写。

     代码如下,奉献给大家。

 

 

 

'''
Created on Mar 20, 2014

@author: MRJWT
'''


import os
import os.path
import uuid


filterFilestrHead='''<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="Source Files">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="Header Files">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
    </Filter>
    <Filter Include="Resource Files">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
  </ItemGroup>


'''

filterFilestrTail='''


  <ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>
</Project>
'''


vcprojFileStrHead1='''<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{E22942F7-3844-4D61-8AC7-EE7B0FF82619}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>

'''    
vcprojFileStrHead2='''    
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>StaticLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>StaticLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>
'''


vcprojFileStrTail='''
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

'''


def genPrjOnDir(rootdir,rootname,projectname):
    fvcproj=open(projectname+".vcxproj","w")
    ffilter=open(projectname+".vcxproj.filters","w")
    
    proj_h=[]
    proj_cpp=[]
    proj_none=[]

    filter_h=[]
    filter_cpp=[]
    filter_none=[]
    filter_filter=[]
    
    for parent,dirnames,filenames in os.walk(rootdir):
        filterName=parent.replace(rootdir,rootname)
        filter_filter.append('    <Filter Include="'+filterName+'">\n')
        filter_filter.append('         <UniqueIdentifier>{'+str(uuid.uuid1())+'}</UniqueIdentifier>\n')
        filter_filter.append('    </Filter>\n')
        for filename in filenames:
            filename.lower()
            if filename.endswith(".cpp") or filename.endswith(".c") or filename.endswith(".cxx"):
                
                proj_cpp.append('    <ClCompile Include="'+os.path.join(parent,filename)+'" />\n')
                
                filter_cpp.append('    <ClCompile Include="'+os.path.join(parent,filename)+'" >\n' )
                filter_cpp.append('        <Filter>'+filterName+'</Filter>\n' )
                filter_cpp.append('    </ClCompile>\n' )
                
                continue
            
            
            if filename.endswith(".h") or filename.endswith(".hpp") or filename.endswith(".hxx") or filename.endswith(".fdf") :
                proj_h.append('   <ClInclude Include="'+os.path.join(parent,filename)+'" />\n')

                filter_h.append('    <ClInclude Include="'+os.path.join(parent,filename)+'" >\n' )
                filter_h.append('         <Filter>'+filterName+'</Filter>\n' )
                filter_h.append('    </ClInclude>\n' )
                
                continue
            
            
            if filename.endswith(".rc") or filename.endswith(".txt") or filename.endswith(".pdf")  :

                proj_none.append('    <None Include="'+os.path.join(parent,filename)+'" />\n')

                filter_none.append('    <None Include="'+os.path.join(parent,filename)+'" >\n' )
                filter_none.append('        <Filter>'+filterName+'</Filter>\n' )
                filter_none.append('    </None>\n' )
                continue

            if  filename.endswith(".cs") or filename.endswith(".xml")or filename.endswith(".resx")  :

                proj_none.append('    <None Include="'+os.path.join(parent,filename)+'" />\n')

                filter_none.append('    <None Include="'+os.path.join(parent,filename)+'" >\n' )
                filter_none.append('        <Filter>'+filterName+'</Filter>\n' )
                filter_none.append('    </None>\n' )
                continue


    fvcproj.write(vcprojFileStrHead1)
    fvcproj.write('    <RootNamespace>'+projectname+'</RootNamespace>\n')
    fvcproj.write(vcprojFileStrHead2)
               
    fvcproj.write('  <ItemGroup>\n')  
    for linstr in proj_h:
        fvcproj.write(linstr)
    fvcproj.write('  </ItemGroup>\n')
    
    fvcproj.write('  <ItemGroup>\n')     
    for linstr in proj_cpp:
        fvcproj.write(linstr)
    fvcproj.write('  </ItemGroup>\n')
    
    if len(proj_none)!=0:
        fvcproj.write('  <ItemGroup>\n')
        for linstr in proj_none:
            fvcproj.write(linstr)
        fvcproj.write('  </ItemGroup>\n')
    
    fvcproj.write(vcprojFileStrTail)   

    ffilter.write(filterFilestrHead)
               
    ffilter.write('  <ItemGroup>\n')  
    for linstr in filter_filter:
        ffilter.write(linstr)
    ffilter.write('  </ItemGroup>\n')
    
    ffilter.write('  <ItemGroup>\n')     
    for linstr in filter_h:
        ffilter.write(linstr)
    ffilter.write('  </ItemGroup>\n')
    
    ffilter.write('  <ItemGroup>\n')     
    for linstr in filter_cpp:
        ffilter.write(linstr)
    ffilter.write('  </ItemGroup>\n')
    
    if len(filter_none)!= 0:
    
        ffilter.write('  <ItemGroup>\n')     
        for linstr in filter_none:
            ffilter.write(linstr)        
        ffilter.write('  </ItemGroup>\n')
    
    ffilter.write(filterFilestrTail)   


        
if __name__ == '__main__':
    pass
    genPrjOnDir("E:\\testtemp\\prjs","rootmrjwt","prjmrjwt")
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值