webkit在win32下的编译规则(三)

    技术2025-09-03  18

    首先来看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}" ]]; then 112: 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都比较简单,就不介绍了。

    最新回复(0)