首先来看WTF这个project,这个project的Pre-build event如下:
1: REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PreBuild.cmd file.
2: if not exist "$(ProjectDir)$(ProjectName)PreBuild.cmd" exit /b
3:
4: set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir)
5: set CONFIGURATIONNAME=$(ConfigurationName)
6: set INPUTDIR=$(InputDir)
7: set INPUTFILENAME=$(InputFileName)
8: set INPUTPATH=$(InputPath)
9: set INTDIR=$(IntDir)
10: set LIBRARYCONFIGSUFFIX=$(LibraryConfigSuffix)
11: set OUTDIR=$(OutDir)
12: set PLATFORMNAME=$(PlatformName)
13: set PROJECTDIR=$(ProjectDir)
14: set PROJECTFILENAME=$(ProjectFileName)
15: set PROJECTNAME=$(ProjectName)
16: set PROJECTPATH=$(ProjectPath)
17: set SOLUTIONDIR=$(SolutionDir)
18: set SOLUTIONFILENAME=$(SolutionFileName)
19: set SOLUTIONNAME=$(SolutionName)
20: set SOLUTIONPATH=$(SolutionPath)
21: set TARGETDIR=$(TargetDir)
22: set TARGETEXT=$(TargetExt)
23: set TARGETFILENAME=$(TargetFileName)
24: set TARGETPATH=$(TargetPath)
25: set WEBKITCONFIGSUFFIX=$(WebKitConfigSuffix)
26: set WEBKITDLLCONFIGSUFFIX=$(WebKitDLLConfigSuffix)
27:
28: REM If any of the above variables didn't exist previously and
29: REM were set to an empty string, set will set the errorlevel to 1,
30: REM which will cause the project-specific script to think the build
31: REM has failed. This cmd /c call will clear the errorlevel.
32: cmd /c
33:
34: "$(ProjectDir)$(ProjectName)PreBuild.cmd"
这些脚本首先利用vs自带的一些内置变量来设置环境变量,然后调用"$(ProjectDir)$(ProjectName)PreBuild.cmd"这个脚本,展开后的路径是D:/tools/cygwin/home/xufan/WebKit/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCorePreBuild.cmd。从上面的28-31行可以看出,cmd /c的主要作用是为了清除errorlevel。JavaScriptCorePreBuild.cmd这个脚本的内容如下:
1: %SystemDrive%/cygwin/bin/which.exe bash
2: if errorlevel 1 set PATH=%SystemDrive%/cygwin/bin;%PATH%
3: cmd /c
4: if exist "%CONFIGURATIONBUILDDIR%/buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%/buildfailed"
5: if errorlevel 1 exit 1
6: echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%/buildfailed"
7:
8: bash "%WEBKITLIBRARIESDIR%/tools/scripts/auto-version.sh" "%INTDIR%"
JavaScriptCorePreBuild.cmd首先检查前面的编译有没有问题,如果没有问题,就会调用D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/scripts/auto-version.sh这个perl脚本,内容如下:
1: #!/usr/bin/bash
2:
3: # Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
4: #
5: # Redistribution and use in source and binary forms, with or without
6: # modification, are permitted provided that the following conditions
7: # are met:
8: # 1. Redistributions of source code must retain the above copyright
9: # notice, this list of conditions and the following disclaimer.
10: # 2. Redistributions in binary form must reproduce the above copyright
11: # notice, this list of conditions and the following disclaimer in the
12: # documentation and/or other materials provided with the distribution.
13: #
14: # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15: # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16: # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17: # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18: # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19: # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20: # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21: # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22: # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23: # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24: # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25:
26:
27: # Trim any trailing /r or /n from the given variable.
28: chomp()
29: {
30: local old_value=$(eval echo "/$$1");
31: local value=$(echo "$old_value" | sed 's/[/r/n]*$//')
32: eval $1=/$value;
33: }
34:
35: if [[ -n "$WEBKITLIBRARIESDIR" ]]; then
36: FALLBACK_VERSION_PATH=`cygpath -u "$WEBKITLIBRARIESDIR//tools//scripts//VERSION"`
37: FALLBACK_VERSION=$(cat "$FALLBACK_VERSION_PATH");
38:
39: COPYRIGHT_END_YEAR_PATH=`cygpath -u "$WEBKITLIBRARIESDIR//tools//scripts//COPYRIGHT-END-YEAR"`
40: COPYRIGHT_END_YEAR=$(cat "$COPYRIGHT_END_YEAR_PATH");
41: chomp COPYRIGHT_END_YEAR
42: fi
43:
44: OUTPUT_FILE=$(cygpath -u "$1")/include/autoversion.h
45: mkdir -p "$(dirname "$OUTPUT_FILE")"
46:
47: # Take the initial version number from RC_PROJECTSOURCEVERSION if it
48: # exists, otherwise fall back to the version number stored in the source.
49: ENVIRONMENT_VERSION="$RC_PROJECTSOURCEVERSION";
50: PROPOSED_VERSION=${ENVIRONMENT_VERSION:-$FALLBACK_VERSION}
51: chomp PROPOSED_VERSION
52:
53: # Split out the three components of the dotted version number. We pad
54: # the input with trailing dots to handle the case where the input version
55: # has fewer components than we expect.
56: BUILD_MAJOR_VERSION=$(echo "$PROPOSED_VERSION.." | cut -d '.' -f 1)
57: BUILD_MINOR_VERSION=$(echo "$PROPOSED_VERSION.." | cut -d '.' -f 2)
58: BUILD_TINY_VERSION=$(echo "$PROPOSED_VERSION.." | cut -d '.' -f 3)
59:
60: # Cut the major component down to three characters by dropping any
61: # extra leading digits, then adjust the major version portion of the
62: # version string to match.
63: CHARACTERS_TO_DROP=$(( ${#BUILD_MAJOR_VERSION} > 3 ? ${#BUILD_MAJOR_VERSION} - 3 : 0 ))
64: BUILD_MAJOR_VERSION=${BUILD_MAJOR_VERSION:$CHARACTERS_TO_DROP}
65: PROPOSED_VERSION=${PROPOSED_VERSION:$CHARACTERS_TO_DROP}
66:
67: # Have the minor and tiny components default to zero if not present.
68: BUILD_MINOR_VERSION=${BUILD_MINOR_VERSION:-0}
69: BUILD_TINY_VERSION=${BUILD_TINY_VERSION:-0}
70:
71: # Split the first component further by using the first digit for the
72: # major version and the remaining two characters as the minor version.
73: # The minor version is shifted down to the tiny version, with the tiny
74: # version becoming the variant version.
75: MAJOR_VERSION=${BUILD_MAJOR_VERSION:0:1}
76: MINOR_VERSION=${BUILD_MAJOR_VERSION:1}
77: TINY_VERSION=${BUILD_MINOR_VERSION}
78: VARIANT_VERSION=${BUILD_TINY_VERSION}
79:
80: VERSION_TEXT=${PROPOSED_VERSION}
81: VERSION_TEXT_SHORT=${VERSION_TEXT}
82:
83: if [ -z ${ENVIRONMENT_VERSION} ]; then
84: # If we didn't pull the version number from the environment then we're doing
85: # an engineering build and we'll stamp the build with some more information.
86:
87: BUILD_DATE=$(date)
88: SVN_REVISION=$(svn info | grep '^Revision' | sed 's/^Revision: //')
89:
90: chomp BUILD_DATE
91: chomp SVN_REVISION
92:
93: VERSION_TEXT_SHORT="${VERSION_TEXT_SHORT}+"
94: VERSION_TEXT="${VERSION_TEXT_SHORT} ${USER} - ${BUILD_DATE} - r${SVN_REVISION}"
95: fi
96:
97: cat > "$OUTPUT_FILE" <98: #define __VERSION_TEXT__ "${VERSION_TEXT}"99: #define __BUILD_NUMBER__ "${VERSION_TEXT}"100: #define __BUILD_NUMBER_SHORT__ "${VERSION_TEXT_SHORT}"101: #define __VERSION_MAJOR__ ${MAJOR_VERSION}
102: #define __VERSION_MINOR__ ${MINOR_VERSION}
103: #define __VERSION_TINY__ ${TINY_VERSION}
104: #define __VERSION_BUILD__ ${VARIANT_VERSION}
105: #define __BUILD_NUMBER_MAJOR__ ${BUILD_MAJOR_VERSION}
106: #define __BUILD_NUMBER_MINOR__ ${BUILD_MINOR_VERSION}
107: #define __BUILD_NUMBER_VARIANT__ ${BUILD_TINY_VERSION}
108: #define __SVN_REVISION__ ${SVN_REVISION}
109: EOF
110:
111: if [[ -n "${COPYRIGHT_END_YEAR}" ]]; then112: cat >> "$OUTPUT_FILE" <113: #define __COPYRIGHT_YEAR_END_TEXT__ "${COPYRIGHT_END_YEAR}"114: EOF
115: fi
auto-version.sh这个脚本主要是根据D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/scripts/VERSION,D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/scripts/COPYRIGHT-END-YEAR以及当前时间等生成D:/tools/cygwin/home/xufan/WebKit/WebKitBuild/Debug_Cairo_CFLite/obj/JavaScriptCore/include/autoversion.h这个描述版本信息的头文件,这个头文件在生成后的格式如下:
1: #define __VERSION_TEXT__ "533+ - Mon Jan 31 12:26:06 2011 - r77102"
2: #define __BUILD_NUMBER__ "533+ - Mon Jan 31 12:26:06 2011 - r77102"
3: #define __BUILD_NUMBER_SHORT__ "533+"
4: #define __VERSION_MAJOR__ 5
5: #define __VERSION_MINOR__ 33
6: #define __VERSION_TINY__ 0
7: #define __VERSION_BUILD__ 0
8: #define __BUILD_NUMBER_MAJOR__ 533
9: #define __BUILD_NUMBER_MINOR__ 0
10: #define __BUILD_NUMBER_VARIANT__ 0
11: #define __SVN_REVISION__ 77102
12: #define __COPYRIGHT_YEAR_END_TEXT__ "2011"
这些信息会体现在javascriptcore.dll这个文件的版本信息里面,如下图:
执行完prebuild脚本后,就要开始编译了。wtf这个project有一些属性是从别的vsprops文件集成来的,如下图:
这些vsprops文件包含:
../../../../WebKitLibraries/win/tools/vsprops/FeatureDefinesCairo.vsprops
../../../../WebKitLibraries/win/tools/vsprops/common.vsprops
../../../../WebKitLibraries/win/tools/vsprops/release.vsprops
../../../../WebKitLibraries/win/tools/vsprops/WinCairo.vsprops
./WTFCommon.vsprops
首先看D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/vsprops/FeatureDefinesCairo.vsprops这个文件:
1: xml version="1.0" encoding="Windows-1252"?>
2:
3:
4:
5: <VisualStudioPropertySheet
6: ProjectType="Visual C++"
7: Version="8.00"
8: Name="FeatureDefinesCairo"
9: >
10: <Tool
11: Name="VCCLCompilerTool"
12: PreprocessorDefinitions="$(ENABLE_3D_CANVAS);$(ENABLE_3D_RENDERING);$(ENABLE_ACCELERATED_2D_CANVAS);$(ENABLE_BLOB);$(ENABLE_CHANNEL_MESSAGING);$(ENABLE_CLIENT_BASED_GEOLOCATION);$(ENABLE_DATABASE);$(ENABLE_DATAGRID);$(ENABLE_DATALIST);$(ENABLE_DEVICE_ORIENTATION);$(ENABLE_DIRECTORY_UPLOAD);$(ENABLE_DOM_STORAGE);$(ENABLE_EVENTSOURCE);$(ENABLE_FILTERS);$(ENABLE_FILE_SYSTEM);$(ENABLE_FULLSCREEN_API);$(ENABLE_GEOLOCATION);$(ENABLE_ICONDATABASE);$(ENABLE_IMAGE_RESIZER);$(ENABLE_INDEXED_DATABASE);$(ENABLE_INPUT_SPEECH);$(ENABLE_JAVASCRIPT_DEBUGGER);$(ENABLE_LINK_PREFETCH);$(ENABLE_MATHML);$(ENABLE_METER_TAG);$(ENABLE_NOTIFICATIONS);$(ENABLE_OFFLINE_WEB_APPLICATIONS);$(ENABLE_PROGRESS_TAG);$(ENABLE_REGISTER_PROTOCOL_HANDLER);$(ENABLE_SHARED_WORKERS);$(ENABLE_SVG);$(ENABLE_SVG_ANIMATION);$(ENABLE_SVG_AS_IMAGE);$(ENABLE_SVG_DOM_OBJC_BINDINGS);$(ENABLE_SVG_FONTS);$(ENABLE_SVG_FOREIGN_OBJECT);$(ENABLE_SVG_USE);$(ENABLE_VIDEO);$(ENABLE_MEDIA_STATISTICS);$(ENABLE_WEB_SOCKETS);$(ENABLE_WEB_TIMING);$(ENABLE_WML);$(ENABLE_WORKERS);$(ENABLE_XHTMLMP);$(ENABLE_XPATH);$(ENABLE_XSLT)"
13: />
14: <UserMacro
15: Name="ENABLE_3D_CANVAS"
16: Value=""
17: PerformEnvironmentSet="true"
18: />
19: <UserMacro
20: Name="ENABLE_3D_RENDERING"
21: Value=""
22: PerformEnvironmentSet="true"
23: />
24: <UserMacro
25: Name="ENABLE_ACCELERATED_2D_CANVAS"
26: Value=""
27: PerformEnvironmentSet="true"
28: />
29: <UserMacro
30: Name="ENABLE_BLOB"
31: Value=""
32: PerformEnvironmentSet="true"
33: />
34: <UserMacro
35: Name="ENABLE_CHANNEL_MESSAGING"
36: Value="ENABLE_CHANNEL_MESSAGING"
37: PerformEnvironmentSet="true"
38: />
39: <UserMacro
40: Name="ENABLE_CLIENT_BASED_GEOLOCATION"
41: Value=""
42: PerformEnvironmentSet="true"
43: />
44: <UserMacro
45: Name="ENABLE_DATABASE"
46: Value="ENABLE_DATABASE"
47: PerformEnvironmentSet="true"
48: />
49: <UserMacro
50: Name="ENABLE_DATAGRID"
51: Value=""
52: PerformEnvironmentSet="true"
53: />
54: <UserMacro
55: Name="ENABLE_DATALIST"
56: Value="ENABLE_DATALIST"
57: PerformEnvironmentSet="true"
58: />
59: <UserMacro
60: Name="ENABLE_DEVICE_ORIENTATION"
61: Value=""
62: PerformEnvironmentSet="true"
63: />
64: <UserMacro
65: Name="ENABLE_DIRECTORY_UPLOAD"
66: Value=""
67: PerformEnvironmentSet="true"
68: />
69: <UserMacro
70: Name="ENABLE_DOM_STORAGE"
71: Value="ENABLE_DOM_STORAGE"
72: PerformEnvironmentSet="true"
73: />
74: <UserMacro
75: Name="ENABLE_EVENTSOURCE"
76: Value="ENABLE_EVENTSOURCE"
77: PerformEnvironmentSet="true"
78: />
79: <UserMacro
80: Name="ENABLE_FILTERS"
81: Value="ENABLE_FILTERS"
82: PerformEnvironmentSet="true"
83: />
84: <UserMacro
85: Name="ENABLE_FILE_SYSTEM"
86: Value=""
87: PerformEnvironmentSet="true"
88: />
89: <UserMacro
90: Name="ENABLE_FULLSCREEN_API"
91: Value=""
92: PerformEnvironmentSet="true"
93: />
94: <UserMacro
95: Name="ENABLE_GEOLOCATION"
96: Value=""
97: PerformEnvironmentSet="true"
98: />
99: <UserMacro
100: Name="ENABLE_ICONDATABASE"
101: Value="ENABLE_ICONDATABASE"
102: PerformEnvironmentSet="true"
103: />
104: <UserMacro
105: Name="ENABLE_IMAGE_RESIZER"
106: Value=""
107: PerformEnvironmentSet="true"
108: />
109: <UserMacro
110: Name="ENABLE_INDEXED_DATABASE"
111: Value=""
112: PerformEnvironmentSet="true"
113: />
114: <UserMacro
115: Name="ENABLE_INPUT_SPEECH"
116: Value=""
117: PerformEnvironmentSet="true"
118: />
119: <UserMacro
120: Name="ENABLE_JAVASCRIPT_DEBUGGER"
121: Value="ENABLE_JAVASCRIPT_DEBUGGER"
122: PerformEnvironmentSet="true"
123: />
124: <UserMacro
125: Name="ENABLE_LINK_PREFETCH"
126: Value=""
127: PerformEnvironmentSet="true"
128: />
129: <UserMacro
130: Name="ENABLE_MATHML"
131: Value=""
132: PerformEnvironmentSet="true"
133: />
134: <UserMacro
135: Name="ENABLE_METER_TAG"
136: Value="ENABLE_METER_TAG"
137: PerformEnvironmentSet="true"
138: />
139: <UserMacro
140: Name="ENABLE_NOTIFICATIONS"
141: Value=""
142: PerformEnvironmentSet="true"
143: />
144: <UserMacro
145: Name="ENABLE_OFFLINE_WEB_APPLICATIONS"
146: Value="ENABLE_OFFLINE_WEB_APPLICATIONS"
147: PerformEnvironmentSet="true"
148: />
149: <UserMacro
150: Name="ENABLE_PROGRESS_TAG"
151: Value=""
152: PerformEnvironmentSet="true"
153: />
154: <UserMacro
155: Name="ENABLE_REGISTER_PROTOCOL_HANDLER"
156: Value=""
157: PerformEnvironmentSet="true"
158: />
159: <UserMacro
160: Name="ENABLE_SHARED_WORKERS"
161: Value="ENABLE_SHARED_WORKERS"
162: PerformEnvironmentSet="true"
163: />
164: <UserMacro
165: Name="ENABLE_SVG"
166: Value="ENABLE_SVG"
167: PerformEnvironmentSet="true"
168: />
169: <UserMacro
170: Name="ENABLE_SVG_ANIMATION"
171: Value="ENABLE_SVG_ANIMATION"
172: PerformEnvironmentSet="true"
173: />
174: <UserMacro
175: Name="ENABLE_SVG_AS_IMAGE"
176: Value="ENABLE_SVG_AS_IMAGE"
177: PerformEnvironmentSet="true"
178: />
179: <UserMacro
180: Name="ENABLE_SVG_DOM_OBJC_BINDINGS"
181: Value=""
182: PerformEnvironmentSet="true"
183: />
184: <UserMacro
185: Name="ENABLE_SVG_FONTS"
186: Value="ENABLE_SVG_FONTS"
187: PerformEnvironmentSet="true"
188: />
189: <UserMacro
190: Name="ENABLE_SVG_FOREIGN_OBJECT"
191: Value="ENABLE_SVG_FOREIGN_OBJECT"
192: PerformEnvironmentSet="true"
193: />
194: <UserMacro
195: Name="ENABLE_SVG_USE"
196: Value="ENABLE_SVG_USE"
197: PerformEnvironmentSet="true"
198: />
199: <UserMacro
200: Name="ENABLE_VIDEO"
201: Value=""
202: PerformEnvironmentSet="true"
203: />
204: <UserMacro
205: Name="ENABLE_MEDIA_STATISTICS"
206: Value=""
207: PerformEnvironmentSet="true"
208: />
209: <UserMacro
210: Name="ENABLE_WEB_AUDIO"
211: Value=""
212: PerformEnvironmentSet="true"
213: />
214: <UserMacro
215: Name="ENABLE_WEB_SOCKETS"
216: Value="ENABLE_WEB_SOCKETS"
217: PerformEnvironmentSet="true"
218: />
219: <UserMacro
220: Name="ENABLE_WEB_TIMING"
221: Value=""
222: PerformEnvironmentSet="true"
223: />
224: <UserMacro
225: Name="ENABLE_WML"
226: Value=""
227: PerformEnvironmentSet="true"
228: />
229: <UserMacro
230: Name="ENABLE_WORKERS"
231: Value="ENABLE_WORKERS"
232: PerformEnvironmentSet="true"
233: />
234: <UserMacro
235: Name="ENABLE_XHTMLMP"
236: Value=""
237: PerformEnvironmentSet="true"
238: />
239: <UserMacro
240: Name="ENABLE_XPATH"
241: Value="ENABLE_XPATH"
242: PerformEnvironmentSet="true"
243: />
244: <UserMacro
245: Name="ENABLE_XSLT"
246: Value="ENABLE_XSLT"
247: PerformEnvironmentSet="true"
248: />
249: VisualStudioPropertySheet>
FeatureDefinesCairo.vsprops这个文件主要是用来定义一些宏,这些宏用来开启和关闭webkit的特性,例如3D_CANVAS,BLOB,DATABASE,DATAGRID,SVG等。如果要开启对应的属性,只需要修改UserMacro里面的Value属性即可。
D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/vsprops/common.vsprops这个文件的内容如下:
1: xml version="1.0" encoding="Windows-1252"?>
2: <VisualStudioPropertySheet
3: ProjectType="Visual C++"
4: Version="8.00"
5: Name="common"
6: OutputDirectory="$(ConfigurationBuildDir)/bin"
7: IntermediateDirectory="$(ConfigurationBuildDir)/obj/$(ProjectName)"
8: >
9: <Tool
10: Name="VCCLCompilerTool"
11: AdditionalOptions="/GS"
12: PreprocessorDefinitions="WIN32;_WINDOWS;WINVER=0x502;_WIN32_WINNT=0x502;_WIN32_IE=0x603;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;__PRODUCTION__=0$(ProductionBuild);_HAS_EXCEPTIONS=0;BUILDING_$(ProjectName)"
13: ExceptionHandling="0"
14: RuntimeTypeInfo="false"
15: WarningLevel="4"
16: WarnAsError="true"
17: DebugInformationFormat="3"
18: DisableSpecificWarnings="4018;4068;4099;4100;4127;4138;4180;4189;4201;4244;4251;4275;4288;4291;4305;4344;4355;4389;4503;4505;4510;4512;4610;4706;4800;4951;4952;4996;6011;6031;6211;6246;6255;6387"
19: />
20: <Tool
21: Name="VCLibrarianTool"
22: AdditionalOptions="/ignore:4221"
23: OutputFile="$(OutDir)/$(ProjectName)$(WebKitConfigSuffix).lib"
24: />
25: <Tool
26: Name="VCLinkerTool"
27: LinkLibraryDependencies="false"
28: AdditionalOptions="/SAFESEH /FIXED:NO /dynamicbase /ignore:4221"
29: OutputFile="$(OutDir)/$(ProjectName)$(WebKitConfigSuffix).exe"
30: AdditionalLibraryDirectories=""$(ConfigurationBuildDir)/lib";"$(WebKitLibrariesDir)/lib""
31: GenerateDebugInformation="true"
32: SubSystem="2"
33: ImportLibrary="$(ConfigurationBuildDir)/lib/$(TargetName).lib"
34: TargetMachine="1"
35: />
36: <Tool
37: Name="VCMIDLTool"
38: PreprocessorDefinitions="__PRODUCTION__=0$(ProductionBuild)"
39: WarnAsError="true"
40: HeaderFileName="$(OutDir)/$(InputName).h"
41: />
42: <Tool
43: Name="VCPostBuildEventTool"
44: CommandLine="REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PostBuild.cmd file if not exist "$(ProjectDir)$(ProjectName)PostBuild.cmd" exit /b set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir) set CONFIGURATIONNAME=$(ConfigurationName) set INPUTDIR=$(InputDir) set INPUTFILENAME=$(InputFileName) set INPUTPATH=$(InputPath) set INTDIR=$(IntDir) set LIBRARYCONFIGSUFFIX=$(LibraryConfigSuffix) set OUTDIR=$(OutDir) set PLATFORMNAME=$(PlatformName) set PROJECTDIR=$(ProjectDir) set PROJECTFILENAME=$(ProjectFileName) set PROJECTNAME=$(ProjectName) set PROJECTPATH=$(ProjectPath) set SOLUTIONDIR=$(SolutionDir) set SOLUTIONFILENAME=$(SolutionFileName) set SOLUTIONNAME=$(SolutionName) set SOLUTIONPATH=$(SolutionPath) set TARGETDIR=$(TargetDir) set TARGETEXT=$(TargetExt) set TARGETFILENAME=$(TargetFileName) set TARGETPATH=$(TargetPath) set WEBKITCONFIGSUFFIX=$(WebKitConfigSuffix) set WEBKITDLLCONFIGSUFFIX=$(WebKitDLLConfigSuffix) REM If any of the above variables didn't exist previously and REM were set to an empty string, set will set the errorlevel to 1, REM which will cause the project-specific script to think the build REM has failed. This cmd /c call will clear the errorlevel. cmd /c "$(ProjectDir)$(ProjectName)PostBuild.cmd" "
45: />
46: <Tool
47: Name="VCPreBuildEventTool"
48: CommandLine="REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PreBuild.cmd file. if not exist "$(ProjectDir)$(ProjectName)PreBuild.cmd" exit /b set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir) set CONFIGURATIONNAME=$(ConfigurationName) set INPUTDIR=$(InputDir) set INPUTFILENAME=$(InputFileName) set INPUTPATH=$(InputPath) set INTDIR=$(IntDir) set LIBRARYCONFIGSUFFIX=$(LibraryConfigSuffix) set OUTDIR=$(OutDir) set PLATFORMNAME=$(PlatformName) set PROJECTDIR=$(ProjectDir) set PROJECTFILENAME=$(ProjectFileName) set PROJECTNAME=$(ProjectName) set PROJECTPATH=$(ProjectPath) set SOLUTIONDIR=$(SolutionDir) set SOLUTIONFILENAME=$(SolutionFileName) set SOLUTIONNAME=$(SolutionName) set SOLUTIONPATH=$(SolutionPath) set TARGETDIR=$(TargetDir) set TARGETEXT=$(TargetExt) set TARGETFILENAME=$(TargetFileName) set TARGETPATH=$(TargetPath) set WEBKITCONFIGSUFFIX=$(WebKitConfigSuffix) set WEBKITDLLCONFIGSUFFIX=$(WebKitDLLConfigSuffix) REM If any of the above variables didn't exist previously and REM were set to an empty string, set will set the errorlevel to 1, REM which will cause the project-specific script to think the build REM has failed. This cmd /c call will clear the errorlevel. cmd /c "$(ProjectDir)$(ProjectName)PreBuild.cmd" "
49: />
50: <Tool
51: Name="VCPreLinkEventTool"
52: CommandLine="REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PreLink.cmd file. if not exist "$(ProjectDir)$(ProjectName)PreLink.cmd" exit /b set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir) set CONFIGURATIONNAME=$(ConfigurationName) set INPUTDIR=$(InputDir) set INPUTFILENAME=$(InputFileName) set INPUTPATH=$(InputPath) set INTDIR=$(IntDir) set LIBRARYCONFIGSUFFIX=$(LibraryConfigSuffix) set OUTDIR=$(OutDir) set PLATFORMNAME=$(PlatformName) set PROJECTDIR=$(ProjectDir) set PROJECTFILENAME=$(ProjectFileName) set PROJECTNAME=$(ProjectName) set PROJECTPATH=$(ProjectPath) set SOLUTIONDIR=$(SolutionDir) set SOLUTIONFILENAME=$(SolutionFileName) set SOLUTIONNAME=$(SolutionName) set SOLUTIONPATH=$(SolutionPath) set TARGETDIR=$(TargetDir) set TARGETEXT=$(TargetExt) set TARGETFILENAME=$(TargetFileName) set TARGETPATH=$(TargetPath) set WEBKITCONFIGSUFFIX=$(WebKitConfigSuffix) set WEBKITDLLCONFIGSUFFIX=$(WebKitDLLConfigSuffix) REM If any of the above variables didn't exist previously and REM were set to an empty string, set will set the errorlevel to 1, REM which will cause the project-specific script to think the build REM has failed. This cmd /c call will clear the errorlevel. cmd /c "$(ProjectDir)$(ProjectName)PreLink.cmd" "
53: />
54: <Tool
55: Name="VCResourceCompilerTool"
56: Culture="1033"
57: AdditionalIncludeDirectories=""$(IntDir)/include""
58: />
59: <UserMacro
60: Name="ProductionBuild"
61: Value="$(PRODUCTION)"
62: />
63: <UserMacro
64: Name="ConfigurationBuildDir"
65: Value="$(WebKitOutputDir)/$(ConfigurationName)"
66: />
67: <UserMacro
68: Name="AnalyzeWithLargeStack"
69: Value=""
70: />
71: VisualStudioPropertySheet>
这个文件包含了定义了公用的宏,PreBuildEvent,PostBuildEvent等,例如上面讲到的PreBuildEvent就是在这里定义的。
D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/vsprops/release.vsprops这个文件的内容如下:
1: xml version="1.0" encoding="Windows-1252"?>
2: <VisualStudioPropertySheet
3: ProjectType="Visual C++"
4: Version="8.00"
5: Name="release"
6: >
7: <Tool
8: Name="VCCLCompilerTool"
9: Optimization="2"
10: PreprocessorDefinitions="NDEBUG"
11: RuntimeLibrary="0"
12: WarnAsError="false"
13: />
14: <Tool
15: Name="VCLinkerTool"
16: LinkIncremental="1"
17: OptimizeReferences="2"
18: EnableCOMDATFolding="2"
19: OptimizeForWindows98="1"
20: />
21: <Tool
22: Name="VCResourceCompilerTool"
23: PreprocessorDefinitions="NDEBUG"
24: />
25: <UserMacro
26: Name="WebKitConfigSuffix"
27: Value=""
28: PerformEnvironmentSet="true"
29: />
30: <UserMacro
31: Name="LibraryConfigSuffix"
32: Value=""
33: PerformEnvironmentSet="true"
34: />
35: <UserMacro
36: Name="WebKitDLLConfigSuffix"
37: Value=""
38: />
39: VisualStudioPropertySheet>
release.vsprops这个文件主要定义编译的一些选项,例如使用的crt版本,优化选项等。
D:/tools/cygwin/home/xufan/WebKit/WebKitLibraries/win/tools/vsprops/WinCairo.vsprops这个文件的内容如下:
1: xml version="1.0" encoding="Windows-1252"?>
2: <VisualStudioPropertySheet
3: ProjectType="Visual C++"
4: Version="8.00"
5: Name="WinCairo"
6: >
7: <Tool
8: Name="VCCLCompilerTool"
9: AdditionalIncludeDirectories=""$(WebKitLibrariesDir)/include/cairo";"$(SolutionDir)/../../../JavaScriptCore/os-win32""
10: PreprocessorDefinitions="WIN_CAIRO=1"
11: />
12: <Tool
13: Name="VCLinkerTool"
14: AdditionalDependencies="cairo.lib libjpeg.lib zlib.lib libpng.lib"
15: AdditionalLibraryDirectories=""$(WebKitLibrariesDir)/lib""
16: />
17: VisualStudioPropertySheet>
WinCairo.vsprops定义了cairo这个版本的wenkit编译需要依赖的头文件目录和库文件。
D:/tools/cygwin/home/xufan/WebKit/Source/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTFCommon.vsprops的内容如下:
1: xml version="1.0" encoding="Windows-1252"?>
2: <VisualStudioPropertySheet
3: ProjectType="Visual C++"
4: Version="8.00"
5: Name="WTFCommon"
6: OutputDirectory="$(ConfigurationBuildDir)/lib"
7: >
8: <Tool
9: Name="VCCLCompilerTool"
10: AdditionalIncludeDirectories=""$(ConfigurationBuildDir)/obj/JavaScriptCore/DerivedSources/";../../;"../../os-win32/";../../pcre/;../../parser/;../../wtf/;../../wtf/unicode/;"$(ConfigurationBuildDir)/include/private";"$(WebKitLibrariesDir)/include";../../../icu/include;../../bindings;../../bindings/c;../../bindings/jni;"$(ConfigurationBuildDir)/include/JavaScriptCore";"$(WebKitLibrariesDir)/include/pthreads""
11: PreprocessorDefinitions="__STD_C"
12: ForcedIncludeFiles="ICUVersion.h"
13: ProgramDataBaseFileName="$(OutDir)/$(TargetName).vc80.pdb"
14: />
15: <Tool
16: Name="VCLibrarianTool"
17: AdditionalDependencies="user32.lib"
18: OutputFile="$(OutDir)/$(ProjectName)$(WebKitConfigSuffix).lib"
19: />
20: VisualStudioPropertySheet>
WTFCommon.vsprops这个文件定义了wtf这个工程依赖的头文件目录和库等。
需要注意的是,FeatureDefinesCairo.vsprops,common.vsprops,release.vsprops,WinCairo.vsprops是大部分webkit工程都会继承的,因此修改后会一些所有继承这几个文件的工程。例如如果你想将webkit编译依赖的crt由Multi-threaded DLL(/MD)改为Multi-threaded (/MT),只需要修改release.vsprops这个文件的RuntimeLibrary这个属性即可。
WTF这个工程的编译过程就和普遍的vc工程一样了,这里就不介绍了。
WTF这个工程的PreLink Event和PostBuild Event主要是调用WTFPreLink.cmd和WTFPostBuild.cmd,这两个bat都比较简单,就不介绍了。