Modify all project files.
for /r %I in (*.vcxproj) do trimproj.vbs %~fI
trimproj.vbs is as below.
Option Explicit
If WScript.Arguments.Count = 0 Then
WScript.Echo("Please specify *.vcxproj file.")
WScript.Quit
End If
Dim dom
Set dom = WScript.CreateObject("MSXML2.DOMDocument")
Dim vcxproj
vcxproj = WScript.Arguments(0)
Dim loaded
loaded = dom.load(vcxproj)
If Not loaded Then
WScript.Echo(dom.parseError.reason)
WScript.Quit
End If
' Removing these configurations makes them default
RemoveNodes dom, "/Project/PropertyGroup/IntDir"
RemoveNodes dom, "/Project/PropertyGroup/TargetName"
RemoveNodes dom, "/Project/PropertyGroup/TargetExt"
RemoveNodes dom, "/Project/ItemDefinitionGroup/ClCompile/DebugInformationFormat"
RemoveNodes dom, "/Project/ItemDefinitionGroup/ClCompile/ProgramDataBaseFileName"
RemoveNodes dom, "/Project/ItemDefinitionGroup/Link/ImportLibrary"
RemoveNodes dom, "/Project/ItemDefinitionGroup/Link/ProgramDataBaseFile"
RemoveNodes dom, "/Project/ItemDefinitionGroup/ProjectReference/LinkLibraryDependencies"
' I don't need CustomBuild
RemoveNodes dom, "/Project/ItemGroup/CustomBuild"
RemoveNodes dom, "/Project/ItemGroup/None"
' note: "/Project/ItemDefinitionGroup/Link/AdditionalLibraryDirectories" can't be removed
' because it may have other non-DCMTK libraries such as zlib.
SetRelativePaths dom, "/Project/ItemDefinitionGroup/ClCompile/AdditionalIncludeDirectories", vcxproj
SetRelativePaths dom, "/Project/ItemDefinitionGroup/ResourceCompile/AdditionalIncludeDirectories", vcxproj
SetRelativePaths dom, "/Project/ItemDefinitionGroup/Link/AdditionalLibraryDirectories", vcxproj
SetRelativePaths dom, "/Project/ItemDefinitionGroup/Midl/AdditionalIncludeDirectories", vcxproj
' Microsoft changed $(ConfigurationName) to $(Configuration) upon Visual Studio 2010 release. Why?
SetConstantValue dom, "/Project/PropertyGroup/OutDir", "$(Configuration)\"
' Unless you specify pdb file name of static libraries they are all created as vc100.pdb
SetConstantValue dom, "/Project/ItemDefinitionGroup/ClCompile/ProgramDataBaseFileName", "$(OutDir)$(ProjectName).pdb"
SetRelativePath dom, "/Project/ItemGroup/ProjectReference/@Include", vcxproj
SetRelativePath dom, "/Project/ItemGroup/ClCompile/@Include", vcxproj
SetRelativePath dom, "/Project/ItemGroup/ClInclude/@Include", vcxproj
dom.save(vcxproj)
Sub RemoveNodes(dom, xpath)
Dim nodes, node
Set nodes = dom.documentElement.selectNodes(xpath)
For Each node In nodes
node.parentNode.removeChild(node)
Next
End Sub
Sub SetConstantValue(dom, xpath, value)
Dim nodes, node
Set nodes = dom.documentElement.selectNodes(xpath)
For Each node In nodes
node.text = value
Next
End Sub
Sub SetRelativePaths(dom, xpath, project_path)
Set nodes = dom.documentElement.selectNodes(xpath)
Dim file_sys
Set file_sys = WScript.CreateObject("Scripting.FileSystemObject")
Dim nodes, node
Set nodes = dom.documentElement.selectNodes(xpath)
For Each node In nodes
Dim paths, i
paths = Split(node.text, ";")
For i = 0 To UBound(paths)
paths(i) = GetRelativePath(project_path, Replace(paths(i), "/", "\"))
Next
node.text = Join(paths, ";")
Next
End Sub
Sub SetRelativePath(dom, xpath, project_path)
Dim nodes, node
Set nodes = dom.documentElement.selectNodes(xpath)
For Each node In nodes
Dim absolute_path
absolute_path = Replace(node.text, "/", "\")
node.text = GetRelativePath(project_path, absolute_path)
Next
End Sub
' Please note that this function is case-sensitive while it should not be.
Function GetRelativePath(from_str, to_str)
Dim file_sys
Set file_sys = WScript.CreateObject("Scripting.FileSystemObject")
If file_sys.GetAbsolutePathName(to_str) <> to_str Then
GetRelativePath = to_str
Else
Dim relative
relative = "."
Dim parent
parent = file_sys.GetParentFolderName(from_str)
Dim found
found = InStr(to_str, parent)
Do While found = 0
relative = relative & "\.."
parent = file_sys.GetParentFolderName(parent)
found = InStr(to_str, parent)
Loop
GetRelativePath = Replace(to_str, parent, relative)
End If
End Function