Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3058348)

#lockdown Nick.Penwarden
#rb none

==========================
MAJOR FEATURES + CHANGES
==========================

Change 2982033 on 2016/05/18 by Chad.Garyet

	Checking in progress on the ue4 BuildGraph conversion.
	Builds and Compiles editor and game on all platforms
	Builds DDC on win64 and mac
	Builds Tools on win64

Change 3047983 on 2016/07/13 by Ben.Marsh

	PR #2597: Fix P4 environment used for running BuildUGS commandlet (Contributed by paulevans)

Change 3048267 on 2016/07/13 by Ben.Marsh

	BuildGraph: Allow more permissive list of characters for node names; just restrict against characters which are illegal in filenames. Allows creating aggregate names which match job names (eg. "Editor, Tools & Monolithics").

Change 3048293 on 2016/07/13 by Ben.Marsh

	BuildGraph: Allow passing -listonly without a specific -target=... parameter in BuildGraph, to see the contents of the entire script.

Change 3048454 on 2016/07/13 by Ben.Marsh

	BuildGraph: Disable output of error messages when just printing the contents of the graph.

Change 3048507 on 2016/07/13 by Ben.Marsh

	BuildGraph: Rename "Ticket" to "Token" for files used to ensure exclusive access to run part of a build.

Change 3049459 on 2016/07/14 by Matthew.Griffin

	Updated location of HTML5 SDKs for Installed Builds
	#jira UE-32171

Change 3049675 on 2016/07/14 by Matthew.Griffin

	Ensured that all platforms are registered when running -validateplatform command
	#jira UE-31082

Change 3049922 on 2016/07/14 by Ben.Marsh

	UBT: Fix path to XML config file in boilerplate message.

Change 3051483 on 2016/07/15 by Ben.Marsh

	EC: Remove code to prettify node names, now that we can have pretty node names explicitly.

Change 3051522 on 2016/07/15 by Ben.Marsh

	BuildGraph: Change spawn task to fail if a non-zero exit code is returned by an external program. The minimum exit code to be treated as an error can be set using the "ErrorLevel" attribute, similar to ERRORLEVEL in DOS.

Change 3051770 on 2016/07/15 by Ben.Marsh

	UGS: Add support for narrowing virtual streams; fetch event and precompiled binaries for parent stream instead.

Change 3052990 on 2016/07/17 by Ben.Marsh

	Show the names of people with notifications disabled in the heading of failure emails, so it's clear that they're not on CC.

Change 3053556 on 2016/07/18 by Ben.Marsh

	BuildGraph: Add a explicit <Option> tag instead of the <Property Default=""/> shenanigans, so that properties that are meant to be modified by the user are listed explicitly. Supported attributes are "DefaultValue" (which specifies a default if the user does not set it on the command line), "Description" (which explains the purpose of the option to users, which is displayed in a table when BuildGraph is invoked with the -listonly argument), and "Restrict" (which specifies a regex to validate an argument supplied by the user).

	Also add an <EnvVar Name="Blah"/> tag which imports the given environment variable as a property (or sets it to "" if it doesn't exist), and rename the <Choose>/<Option>/<Otherwise> triple to <Switch>/<Case>/<Default> to avoid confusion with the new <Option> tag.

Change 3053688 on 2016/07/18 by Ben.Marsh

	Update build scripts to link to p4-swarm rather than p4-web in dashboard pages and notification emails.

Change 3054039 on 2016/07/18 by Ben.Marsh

	Fix confusing message when compiler isn't installed if the target forces VS2013

Change 3054360 on 2016/07/18 by Ben.Marsh

	Remove GUBP support from EC scripts.

Change 3054399 on 2016/07/18 by Ben.Marsh

	Remove circular include from Json.h -> JsonSerializerMacros.h -> Json.h

Change 3055671 on 2016/07/19 by Ben.Marsh

	Remove incomplete UWP integration from UE4.

Change 3055943 on 2016/07/19 by Ben.Marsh

	Remove the WinRT target platform.

Change 3056270 on 2016/07/19 by Ben.Marsh

	Core: Move VectorRegister.h include to eliminate include dependency on UnrealMathUtility.h

Change 3056390 on 2016/07/19 by Ben.Marsh

	Core: Directly include headers required by default JsonWriter template instantiation.

Change 3057444 on 2016/07/20 by Ben.Marsh

	UBT: Fall back to checking for the VS140COMNTOOLS environment variable if we couldn't determine the Visual Studio installation directory from the registry. Allows using the standalone Visual Studio build tools to compile UE4.

Change 3058337 on 2016/07/20 by Ben.Marsh

	Remove EnvVarsToXML. All target platforms now determine their compile environment directly from the registry.

Change 3058348 on 2016/07/20 by Ben.Marsh

	Disable optimization for all automation projects. They don't generally do anything particularly CPU intensive, and VS2015 optimizations are inhibitive to debugging.

[CL 3058822 by Ben Marsh in Main branch]
This commit is contained in:
Ben Marsh
2016-07-20 20:25:02 -04:00
committed by Ben.Marsh@epicgames.com
parent a0625fdf15
commit 1ae32843fa
164 changed files with 674 additions and 11888 deletions

View File

@@ -23,11 +23,6 @@ pushd libPNG\libPNG-1.5.2\projects
msbuild vstudio11.sln /target:Clean,libpng /p:Platform=x64;Configuration="Release Library"
popd
REM WinRT
pushd WinRT
msbuild WinRT.sln /target:Clean,libpng /p:Platform=x64;Configuration=Release
popd
REM XboxOne
pushd XboxOne
msbuild libpng_XboxOne.sln /target:Clean,libpng /p:Platform=x64;Configuration=Release

View File

@@ -2086,13 +2086,13 @@
<File Name="Engine/Build/Android/Prebuilt/bsdsignal/lib/x86/libbsdsignal.a" Hash="0221f7bb3838fcb4bc207d721de1b44f0e328d83" />
<File Name="Engine/Build/Android/UE4Game/UE4CommandLine.txt.template" Hash="eea4ff67e2b002a37e2fe2ad425719e21d0d3cde" />
<File Name="Engine/Build/BatchFiles/SyncToRemotePC.exclude" Hash="b3212a94d187c614717ed7607cb9ac4d4cd9bdf7" />
<File Name="Engine/Build/BuildFarm/Build.pm" Hash="e31b8ffab60cdd24a429f7c518e4b83150d2fe2d" />
<File Name="Engine/Build/BuildFarm/Commands.pm" Hash="cefa61d5f12f7ffcc792535c1720de7ab60e1fcf" />
<File Name="Engine/Build/BuildFarm/Dashboard.pm" Hash="ad6e09e7dac8390583f42272278c17fcd2d8fda9" />
<File Name="Engine/Build/BuildFarm/Notifications.pm" Hash="18b13c2382c558212e6d0f683561f525b5334c60" />
<File Name="Engine/Build/BuildFarm/Build.pm" Hash="85380721e7f768c157ac86c64d2c9c9d5bca2b02" />
<File Name="Engine/Build/BuildFarm/Commands.pm" Hash="2793888b8c40deb4f5bc101f707ece09f3c50bd9" />
<File Name="Engine/Build/BuildFarm/Dashboard.pm" Hash="6172ac2af0e414fe63c151d822fea78005771d2c" />
<File Name="Engine/Build/BuildFarm/Notifications.pm" Hash="e43b6fa7c1b72e7f3f680238bdafd0145a2244a4" />
<File Name="Engine/Build/BuildFarm/Utility.pm" Hash="36e204443b981af59d76ad8735dc1e21ecefeb17" />
<File Name="Engine/Build/BuildFarm/Workspace.pm" Hash="1874b67f74f91cf6321e16feed705c6d8b535d86" />
<File Name="Engine/Build/Graph/Schema.xsd" Hash="ea84deef96ae8b9dd97306a4e420c34fffbd33ad" />
<File Name="Engine/Build/Graph/Schema.xsd" Hash="55aa186498c1e2adc194a618d14626793e3d98bb" />
<File Name="Engine/Build/HTML5/%RunMacHTML5LaunchHelper.command.template" Hash="e9f61f468fe7dcb18f42e843004a184cb3eba0ac" />
<File Name="Engine/Build/HTML5/htaccess.template" Hash="befbaa1b41783ae54d34864fea4efdc2b9835677" />
<File Name="Engine/Build/HTML5/RunMacHTML5LaunchHelper.command.template" Hash="21f2112f325320846baa8cdc8c9ed52341154d29" />
@@ -29013,7 +29013,7 @@
<Blob Hash="065eb40e178c1e43503d88960caadc6ca35c4d58" Size="3469" PackHash="4905bf362dac5be04631d1ce552b8184a6f9eb7f" PackOffset="569817" />
<Blob Hash="066546028b9383729088362a854665a2dea05f05" Size="7532" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="258748" />
<Blob Hash="066a8e31e0f265dd02b3083d1ce24dcfae6eb795" Size="2845" PackHash="c96e9cd94a86b222bed132142b65c1d90314445d" PackOffset="793240" />
<Blob Hash="066f899e3957a484180dfd28eb866d9fe40fd8db" Size="4145" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="220802" />
<Blob Hash="066f899e3957a484180dfd28eb866d9fe40fd8db" Size="4145" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="318112" />
<Blob Hash="06700fb2b1e308ac0a15990408e2a89fd3cfba2c" Size="29696" PackHash="254bdc731ce0a3bef83fa6dd6c76771cadefeab5" PackOffset="1270050" />
<Blob Hash="0671b435cfdbbb24bdc586af79cb5c6ca9d70a84" Size="100070" PackHash="fc71358f88c1a01c32f496b064386dba3145a36a" PackOffset="753855" />
<Blob Hash="0677b61466f0b59c614ddd3a47810053fd33b3a6" Size="31187" PackHash="9a10248ffa6ef2de0ff39750b0126e7d0b1557b6" PackOffset="1738074" />
@@ -30411,7 +30411,6 @@
<Blob Hash="18a6ae99551f412a79d98c715c0b3984e2008a80" Size="1276" PackHash="86a5e29144bc8897af8bcfc36153837ea5ace14d" PackOffset="2095619" />
<Blob Hash="18aa0c2224ddd29e6b14021c78a8d3a5956a9f8f" Size="2878" PackHash="0255260ee4d81de161e877cdcc3af4d7fcf8d0e3" PackOffset="505778" />
<Blob Hash="18ac21b638188b542455ba3da91f958df1724e68" Size="188" PackHash="b0e7677a897dcc7da7de82ccb301777868eddf84" PackOffset="163934" />
<Blob Hash="18b13c2382c558212e6d0f683561f525b5334c60" Size="33616" PackHash="4adf92b4c6c9666b70b0559298f2d3a1b6d2baf5" PackOffset="41312" />
<Blob Hash="18b19f6371c938b3bb0d728011d9813ccc3d48da" Size="2958" PackHash="4f9629d19fa7928aaae10e4bb7c79195fb4f2436" PackOffset="999407" />
<Blob Hash="18bc3a36c08ee6f81d2baf80fd783763d32e14fc" Size="23080" PackHash="16e421c9204b08586edd8de93b93b19fb10644ea" PackOffset="1744536" />
<Blob Hash="18c7c88e0a1bb96a151882a8842129f91d9419fe" Size="279060" PackHash="6d263531086a2ac8abcd381816ca4bbebeb2bb89" PackOffset="1634972" />
@@ -30560,7 +30559,7 @@
<Blob Hash="1a91fda1322cf9e1411c71fe1722b0dff45d6441" Size="10214" PackHash="5a4c5b85fb81b291e8fb6f7c37c0b152f8aeb1bb" PackOffset="2024704" />
<Blob Hash="1a930f4448be0627194b27e052e261b8afcb2988" Size="1140" PackHash="078c69e28d62159c041268759fe75086849b8401" PackOffset="2081097" />
<Blob Hash="1a9585563bb6f410141e73fc8e2783fabd1f5205" Size="1045" PackHash="183240fd1b049e0a072c53e56195aad84aecf657" PackOffset="830892" />
<Blob Hash="1a976939b2bdfeb33a061dea61b0f67f0e999548" Size="133982" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="81315" />
<Blob Hash="1a976939b2bdfeb33a061dea61b0f67f0e999548" Size="133982" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="178625" />
<Blob Hash="1a991560ffc15eda726bd46ce0f940be657221e0" Size="5374" PackHash="cc6a5a3068543d46e2fb50b7563fe9ecad52177c" PackOffset="1848185" />
<Blob Hash="1a9ada9a3ea2495c9ec01ffcc506c07a7a0d6c3e" Size="781809" PackHash="b4411a92ba0b237e9dee0988897930e64daca1a7" PackOffset="1089446" />
<Blob Hash="1a9cae73512084d40ae660262624b4a71b42e724" Size="965" PackHash="183240fd1b049e0a072c53e56195aad84aecf657" PackOffset="1741532" />
@@ -31539,6 +31538,7 @@
<Blob Hash="278a281e8d2df765ca3ff3b6693ca1a3059fff13" Size="32629" PackHash="87925181e3a8b737757401a6114a8acf82625a49" PackOffset="521982" />
<Blob Hash="278a68f87bd12ca77d7c872e25d8c2a7e299560f" Size="2402" PackHash="0e0fc56444fa93555de76ff8aaa98b0bd94a186d" PackOffset="1464343" />
<Blob Hash="2793552ed917cafa30879587b4a7877b314da64c" Size="371" PackHash="d67cb445f37637410f670b1d8682dcf22ced07ae" PackOffset="2096341" />
<Blob Hash="2793888b8c40deb4f5bc101f707ece09f3c50bd9" Size="19999" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="47444" />
<Blob Hash="279c7693f24a1086facd5e4ee91deefd4c9a54c7" Size="358569" PackHash="a4fd3b154d528d1625a83bf01c58f824bf78252e" PackOffset="8" />
<Blob Hash="279dfc244db82090dc68bc77262dd4c6719c23d3" Size="1646190" PackHash="0ec6df97d2cba5820ca7b31ceef87bac12bc9704" PackOffset="8" />
<Blob Hash="27a9e690ecb9c7027ae8d6d06e0a8c7adbedae38" Size="100" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="1278168" />
@@ -33795,7 +33795,7 @@
<Blob Hash="453bbe334b2fde37953deebfcc769c4396d1ca54" Size="2876" PackHash="89655ca2156f42621ad3d2f705ebf90bd9f7a265" PackOffset="88488" />
<Blob Hash="453bdc531c36cbc6f60e0a0d203fe376b97b5f3c" Size="3641" PackHash="c96e9cd94a86b222bed132142b65c1d90314445d" PackOffset="743642" />
<Blob Hash="453ea2556aae37090680cc7ca9a6379f58645925" Size="3907" PackHash="d67cb445f37637410f670b1d8682dcf22ced07ae" PackOffset="2037756" />
<Blob Hash="453ec5785160c2f10abb818ca9cbff958c57e874" Size="1963" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="266569" />
<Blob Hash="453ec5785160c2f10abb818ca9cbff958c57e874" Size="1963" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="363879" />
<Blob Hash="45429c393b2478293e4de8a871c33e6f98e50873" Size="84" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="815104" />
<Blob Hash="4548950cc52a9cf25108443ddf386c725ae95d0e" Size="3979" PackHash="b927bd7f1272bf8097cc4d0ac70876d5f99a3dee" PackOffset="1972981" />
<Blob Hash="4553a7519413c832388ca58f6fd3189db5a94b92" Size="208" PackHash="01d26cddb178f064c3cd74a09430970bf6cc12b7" PackOffset="2089024" />
@@ -34715,7 +34715,7 @@
<Blob Hash="515f7462deac1771970a131972627666f6464a26" Size="3151" PackHash="fc72803a9439e161de25108be11e5429ed900f77" PackOffset="465265" />
<Blob Hash="5160222a3b133d23b2862bca45545ee9bac0338b" Size="5210" PackHash="2501023890f3a38f48be403e595e128c88422dc7" PackOffset="2089936" />
<Blob Hash="51663902456581eae1c9302e02c92246385b2059" Size="41804" PackHash="f6fdc33805bc89e2eaff8003a996f6bf8f880789" PackOffset="2051628" />
<Blob Hash="5168245dddac55b4d8196154e084ba4382c2b29d" Size="5505" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="215297" />
<Blob Hash="5168245dddac55b4d8196154e084ba4382c2b29d" Size="5505" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="312607" />
<Blob Hash="516a844c296adf13bdf900a7218a7df9f3062929" Size="372806" PackHash="30bf523aff5cc60cdbb2da5ca9b51226e6aefc9b" PackOffset="1670632" />
<Blob Hash="516d3527cc1928654c7fa7600311bc776c501bd5" Size="445" PackHash="d95d0dfee072d179a0e04916b7b80ef37d1f6fca" PackOffset="2096405" />
<Blob Hash="516d5e875f596dbb4d3b34bbaeac8fa743063dec" Size="174625" PackHash="0bea8e482197a9378d1256b0989c1af440e374f1" PackOffset="1897609" />
@@ -35015,6 +35015,7 @@
<Blob Hash="55a0da136fef9f3d41d66b51a8121767c4a53d26" Size="293" PackHash="c96e9cd94a86b222bed132142b65c1d90314445d" PackOffset="1028264" />
<Blob Hash="55a26fd65b58938d1ae664ff4a3a162927d0a161" Size="77986" PackHash="e39b1ffe375995e81f45f2d90aaf437e84c11ca7" PackOffset="1677955" />
<Blob Hash="55a9f296caca5f0cd2b466db69c38c5c25154633" Size="225431" PackHash="af32114b8b970d1d65271ed99052f0de3d4651eb" PackOffset="478216" />
<Blob Hash="55aa186498c1e2adc194a618d14626793e3d98bb" Size="36886" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="141739" />
<Blob Hash="55b1bf681638774e4318bfec572e95fab4a2ccf4" Size="3997" PackHash="5dbebfe34ab5c28eca7d7b6c57ff41cda029cf64" PackOffset="1458155" />
<Blob Hash="55b218f860541f99ea90df4b6d1664139e6710d5" Size="2884" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="788356" />
<Blob Hash="55b71f5a15a102904341ebd7c56759e9bb9e6f1a" Size="19656" PackHash="c9f7bd390be6e2f50469fcf024ace928b624a38d" PackOffset="1987819" />
@@ -35104,7 +35105,7 @@
<Blob Hash="56c61258444e1765e97dfbf86daf3d933ce6c241" Size="275" PackHash="89655ca2156f42621ad3d2f705ebf90bd9f7a265" PackOffset="689358" />
<Blob Hash="56c794385a4a1b91777408abcb2d87c586f6518e" Size="261" PackHash="fbcf9cae5640d47e9b7d2ad925c55d54fea4bb7a" PackOffset="2042735" />
<Blob Hash="56c95ecfaf90a186b3154efa2742ab13582c46fc" Size="133" PackHash="4dbfbb5ea4ec25ceeaa80c657b70f101fa2753c2" PackOffset="2095795" />
<Blob Hash="56cd01533feb948bd235a67711562ca1dc19c4f6" Size="1394" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="224947" />
<Blob Hash="56cd01533feb948bd235a67711562ca1dc19c4f6" Size="1394" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="322257" />
<Blob Hash="56cfd0e18d07f41c38e9598545a6d369127fc6f9" Size="1412" PackHash="ba6e6f4eaf7c50e1dcff51145723e736d4474d28" PackOffset="1645801" />
<Blob Hash="56d03e9f3144adfc73b272668144e59ca202f6e0" Size="119" PackHash="b0e7677a897dcc7da7de82ccb301777868eddf84" PackOffset="200716" />
<Blob Hash="56d4f3cca1245d626bada74cf3f6bae8034bf58d" Size="7273" PackHash="b8b36b31df40a1fc9087e4b313999fcda60845cc" PackOffset="1561001" />
@@ -35378,7 +35379,7 @@
<Blob Hash="5a033a6a429c95c2e854c73777692dbf8773b76e" Size="71168" PackHash="f380b2adccc3afba7a9a9a501560525a8359a651" PackOffset="915982" />
<Blob Hash="5a07ab43e3aafac95f375eecb509ce6de504083d" Size="7428" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="1311940" />
<Blob Hash="5a0874b3b803ad7ce1da58dff3efef44ed0dfdfe" Size="20384" PackHash="15c1c1820f17cbc99a977498d87549e3b4060f7c" PackOffset="671792" />
<Blob Hash="5a0be679481f1bdd780d0adb1ba5e93610eb7a83" Size="4732" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="250346" />
<Blob Hash="5a0be679481f1bdd780d0adb1ba5e93610eb7a83" Size="4732" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="347656" />
<Blob Hash="5a0c110af36b7d84d57ef88eec397c63afc0c8df" Size="12731" PackHash="ab39e914df290cf79de86a8439b1adc79fd76140" PackOffset="1265657" />
<Blob Hash="5a0f96d9041827e522a47b570e1ce938bfedbe28" Size="4206248" PackHash="19c8ede828d4e84d3023a8cad20c4118e92c51f6" PackOffset="8" />
<Blob Hash="5a0faf592aea1056ed64f399319093eddf131deb" Size="183683" PackHash="3b886fcb1eae674ad4e09dfd22b6d12287364c04" PackOffset="1764930" />
@@ -35923,6 +35924,7 @@
<Blob Hash="616f6a0ca94238d1649a01aade4c38923bfeb8ee" Size="22775" PackHash="72cc71fd1b06b9d608593626e08ebd8d150d0a8d" PackOffset="1394933" />
<Blob Hash="6171fb50869a8887ae72042866e23d18e1195856" Size="4216" PackHash="33b1641106510028eb721832840bab3d4cbd5a2a" PackOffset="2090053" />
<Blob Hash="6171fbb4e02311a7943bf61a932225bb623912b0" Size="124" PackHash="f380b2adccc3afba7a9a9a501560525a8359a651" PackOffset="2097025" />
<Blob Hash="6172ac2af0e414fe63c151d822fea78005771d2c" Size="40718" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="67443" />
<Blob Hash="6173acf386eab2d224abab910ed4f1b347b97061" Size="136192" PackHash="b6e51c5ce4619cf24deb50699e19457246a65fde" PackOffset="1035272" />
<Blob Hash="6176dcd0838868c18751657b42d483ed11480c66" Size="3555" PackHash="077b2d38582f0b10f5b7abbe23141dae500a4a90" PackOffset="66811" />
<Blob Hash="6179bafb6ed2eb029862356df6713078c7874f85" Size="188164" PackHash="acf6558b1e3950d55a31da4e8614e4a357aa653c" PackOffset="413038" />
@@ -36168,7 +36170,7 @@
<Blob Hash="6482cf40077aeed4912935764121fb3f2fafef49" Size="168" PackHash="16e421c9204b08586edd8de93b93b19fb10644ea" PackOffset="2096456" />
<Blob Hash="6484f1af6b485d5096b71b344e67f4164c33dd1f" Size="142072" PackHash="4dbfbb5ea4ec25ceeaa80c657b70f101fa2753c2" PackOffset="126744" />
<Blob Hash="6484f6847b39a92fb4f0bb92babafa93152f4e8d" Size="395" PackHash="0e0fc56444fa93555de76ff8aaa98b0bd94a186d" PackOffset="994906" />
<Blob Hash="6486ba2bd3ce1443eb5f4af833e8172a6065f2dd" Size="4206" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="239788" />
<Blob Hash="6486ba2bd3ce1443eb5f4af833e8172a6065f2dd" Size="4206" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="337098" />
<Blob Hash="648a00fb6c5f6117fc3b01fa5aa3612808409d24" Size="1467992" PackHash="14c49c4d92812e866d02222dce43083393cf3ead" PackOffset="8" />
<Blob Hash="648f89a97b41047bfb21a8a262ae40e9287ae021" Size="1162" PackHash="a8ed13f4553f617964c6bcf87feea6fe639305ce" PackOffset="2095270" />
<Blob Hash="6494634a914ff2b67b2a734f5a821eec29d58183" Size="3039" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="1830702" />
@@ -36277,7 +36279,7 @@
<Blob Hash="660d8b97d0dcecc916a12d61270765b0d5d69154" Size="38377" PackHash="d31dad19c41dfe5fe805eda5d23486ca115b4dca" PackOffset="700807" />
<Blob Hash="661465b84ea5c7f6ec63415807ec282ce0b31aba" Size="3660" PackHash="1bc440e5f448e7dec6f97dbb519814d6c4b17b0e" PackOffset="2092528" />
<Blob Hash="6618755ed12693f85e83232a4c792dc3e81f6527" Size="5953" PackHash="d92734f6a18a11d0dfbf8c9e12f63f2180c5225d" PackOffset="1973206" />
<Blob Hash="661e803946cf6948aed19f37034a1104db4f5dd6" Size="2998" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="268532" />
<Blob Hash="661e803946cf6948aed19f37034a1104db4f5dd6" Size="2998" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="365842" />
<Blob Hash="663357b3fc4c6de4715880f75c72924b07bf54a3" Size="32758" PackHash="87925181e3a8b737757401a6114a8acf82625a49" PackOffset="554611" />
<Blob Hash="663423abec4e393fa61e6cd80b2bb0d072263784" Size="3924" PackHash="5e7d96af5e5b1cafa670bd77ae918457a118f7a5" PackOffset="2080174" />
<Blob Hash="6635804cac01d86c4e9dbd003b7ce9c8cb7bd828" Size="16896" PackHash="416a2ef9e1d85c9801e1c11b5b75e6647f40b196" PackOffset="583176" />
@@ -37392,7 +37394,7 @@
<Blob Hash="753662d73cd9b34b9eab5e19aa61faeceed8d168" Size="10134" PackHash="af724a067c425dce4dc52010f00800d056379846" PackOffset="2067494" />
<Blob Hash="75382235d4609640a483cc83b5ac6cab586fb66a" Size="9229" PackHash="d338b1e7e6160d0f539aa12687e23db81cce61c4" PackOffset="138310" />
<Blob Hash="75388eb60c39d76fca3f1ee5659e026bb395ff19" Size="7751" PackHash="b8b36b31df40a1fc9087e4b313999fcda60845cc" PackOffset="1340655" />
<Blob Hash="753ae3d94d1b2a55fa8cfcc7e64d80055eeee8d3" Size="3856" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="259591" />
<Blob Hash="753ae3d94d1b2a55fa8cfcc7e64d80055eeee8d3" Size="3856" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="356901" />
<Blob Hash="753c1ca9b46f1cf9d06bcd695f6a803f5a2d9905" Size="4429" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="2067083" />
<Blob Hash="753c5217bf729600d8960259cb6426065e355600" Size="118217" PackHash="b176340bbc5d5b5bac78f855162c5a3ff0ba19ce" PackOffset="1104898" />
<Blob Hash="7547f4224003d1d6cb0c1141fd673228ee926d8c" Size="4608" PackHash="254bdc731ce0a3bef83fa6dd6c76771cadefeab5" PackOffset="1245986" />
@@ -37980,7 +37982,7 @@
<Blob Hash="7cee88aba336483221b7cf47b9c95cfc3ed98589" Size="37888" PackHash="254bdc731ce0a3bef83fa6dd6c76771cadefeab5" PackOffset="2050882" />
<Blob Hash="7ceef7f5fb798785c5e7d7d80c1670667a92fb39" Size="3268096" PackHash="cc6ab21f56cb5abc4754426994877ffacf503dea" PackOffset="8" />
<Blob Hash="7cf7dbb78868093f49934af947b8916a51c86ee0" Size="1918" PackHash="529198f2ee46d987aeed3fff1a66a0ba7ab79765" PackOffset="1779499" />
<Blob Hash="7cfbd6e262b6ee97d0f636e51f6437d4b496b655" Size="2500" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="247846" />
<Blob Hash="7cfbd6e262b6ee97d0f636e51f6437d4b496b655" Size="2500" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="345156" />
<Blob Hash="7cfc562ebd144f7c4f135c999ee143f4f1ecafee" Size="186" PackHash="b0e7677a897dcc7da7de82ccb301777868eddf84" PackOffset="610797" />
<Blob Hash="7cff03d5db12a60bce118ff92792b7cbee868738" Size="282041" PackHash="b4a7011b1f4b663e34e08b5caa1fe927463eb914" PackOffset="8" />
<Blob Hash="7cffd674785551ba95145dd60161c4f582a49a88" Size="52001" PackHash="374b33734d17be020f3eec73cf16a100e905a8c5" PackOffset="870569" />
@@ -38613,6 +38615,7 @@
<Blob Hash="852f78531684defb35f23abc448b4e43d94ccc03" Size="311778" PackHash="6a467413108651fd3be147f1f2cfbe29d032267c" PackOffset="8" />
<Blob Hash="85320bd049e4801dbf674d68e50740db45d4d9ef" Size="92570" PackHash="6b990f3e47bfc2ed0ca6a8c68c9188a6788110bd" PackOffset="1911670" />
<Blob Hash="853796a932b59cf7ca41ca84190d020c0b52590e" Size="1985" PackHash="399ead53201faa00c7d391ccafdd004f5594bcb2" PackOffset="548314" />
<Blob Hash="85380721e7f768c157ac86c64d2c9c9d5bca2b02" Size="47436" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="8" />
<Blob Hash="85381dd86a541cd55012b7b2a96f35dca9cb4340" Size="18968" PackHash="4b68b1eb2767528f8817b77879c7a9158dd40b22" PackOffset="100689" />
<Blob Hash="85386bcfc4fbed0b9d2001cba018ed7fabac0a9e" Size="30208" PackHash="a8ed13f4553f617964c6bcf87feea6fe639305ce" PackOffset="1989640" />
<Blob Hash="853d619e4f80313db8640722d78dbecba08ae3ed" Size="3477" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="1933971" />
@@ -38658,7 +38661,7 @@
<Blob Hash="85caaba77b9ca1ff84f8d6dd857dc8e7e37ac011" Size="3650" PackHash="72cc71fd1b06b9d608593626e08ebd8d150d0a8d" PackOffset="1331849" />
<Blob Hash="85cd002bb6bdcee9ec6a616981706bd867e201e6" Size="265" PackHash="183240fd1b049e0a072c53e56195aad84aecf657" PackOffset="840135" />
<Blob Hash="85d7c212721e37b2db339ff5dc9fbc8cc533416b" Size="109698" PackHash="c5ae184eaa6760174706ff03095aa041150e0bc7" PackOffset="1467898" />
<Blob Hash="85dafc29a96addaf3c690148e3c542179260021b" Size="4547" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="231410" />
<Blob Hash="85dafc29a96addaf3c690148e3c542179260021b" Size="4547" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="328720" />
<Blob Hash="85dc24bc5e69d118bfa2db2540a075073af8ca8b" Size="1321" PackHash="435b84318b43c1178e4eb52628fb46a39961b284" PackOffset="103669" />
<Blob Hash="85dfe63c56527f5f18a88b8d505d20a75163a37b" Size="38912" PackHash="a5a4b35f662228caee7476ddab2567611de6c35c" PackOffset="67592" />
<Blob Hash="85e0f1770f8fc40b78ad2a2731c8aa212cc3cd0d" Size="806" PackHash="3d3afde190b4b5b2706d73b9557dacb2c6a0f036" PackOffset="2093461" />
@@ -39623,7 +39626,7 @@
<Blob Hash="92d60351f9c44b0125086e9297642b1f5a1c3feb" Size="9511" PackHash="4df09dedb5c89d210947d966cbedfbc6267aa7e2" PackOffset="2086961" />
<Blob Hash="92d90c65d52c9a022ff903661487aa8d4ae46b21" Size="40200" PackHash="d25faf54b177d399192ede835440a8eb4948ab59" PackOffset="1647553" />
<Blob Hash="92db0ae3618d21dda5e37be60ccc2a508591f063" Size="903" PackHash="af724a067c425dce4dc52010f00800d056379846" PackOffset="2065366" />
<Blob Hash="92df07d01555785fcf6e81e45aee66427e6570dd" Size="3852" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="243994" />
<Blob Hash="92df07d01555785fcf6e81e45aee66427e6570dd" Size="3852" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="341304" />
<Blob Hash="92e44f68ec1babc9c5416b65c3132c8114aa4abb" Size="1640" PackHash="e70061ffc85b6027a648cac0b1c8c6ef7d4e3106" PackOffset="1938858" />
<Blob Hash="92ec423b635879d59d6bc5167db35d83d0c3c010" Size="22785" PackHash="aa77d10dffb0ca8e30717f47444dbf9b98bcd8eb" PackOffset="2023849" />
<Blob Hash="92eed42c4750581e7e8dd5c5a2ccef2927e6d3c1" Size="1579" PackHash="0eeebc46a6626ca5c135c498582ba13cc3e72586" PackOffset="593258" />
@@ -41437,7 +41440,7 @@
<Blob Hash="abb7a8060c4c0cb0b93191d85a54f9236c6a3765" Size="4994" PackHash="504c0a6da5f49d4bcd18f11ee59db45e32d6c143" PackOffset="99930" />
<Blob Hash="abbf6265dddfd24d363232b856e300cde70f2ba5" Size="3468" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="2055489" />
<Blob Hash="abc12d2ac88322621266560cdc4592e9bc93403c" Size="56320" PackHash="0055e020f7505cf021eb66b73e3a8fa3cc308b05" PackOffset="1671267" />
<Blob Hash="abc291c95d8f3470242f01609e177ecab88dbc22" Size="9091" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="271530" />
<Blob Hash="abc291c95d8f3470242f01609e177ecab88dbc22" Size="9091" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="368840" />
<Blob Hash="abc308f3e1788a4c35d26acdf5f44ac95ca00aa9" Size="362455" PackHash="583a63084ffb332c04044b7d60b05fd70cd30f4b" PackOffset="1321257" />
<Blob Hash="abc4bbcffd354b8f70bdab56186b2c302671c227" Size="4584" PackHash="7491079d020d11f40f14eb94536fe09006ff2c16" PackOffset="2033540" />
<Blob Hash="abca07ce9654bc49589d6a9dbc654f425d6ecaa4" Size="204672" PackHash="2ea1acac8711794581768a72ebb58e12c8afe508" PackOffset="8" />
@@ -41567,7 +41570,6 @@
<Blob Hash="ad6c0b900f3817eced54eb0098b5ef33dc9927cd" Size="51693" PackHash="4022d82d143e72ccce04e7825d3328a7b02fc901" PackOffset="426121" />
<Blob Hash="ad6cc81566166bee2f23d6a9a14c1b38b6ccb767" Size="2825644" PackHash="8d63784005e297e4c94f9dc0c44da6404f7c22d1" PackOffset="8" />
<Blob Hash="ad6ddf34aa15386247d4a871b6e6123e376833f8" Size="22527" PackHash="a4fd3b154d528d1625a83bf01c58f824bf78252e" PackOffset="1548204" />
<Blob Hash="ad6e09e7dac8390583f42272278c17fcd2d8fda9" Size="41304" PackHash="4adf92b4c6c9666b70b0559298f2d3a1b6d2baf5" PackOffset="8" />
<Blob Hash="ad6ee7494bd870eb02c19f64a2e1b59e23fb6c16" Size="130130" PackHash="e7c0d839f4862a30228ee915487ecd9f9b7c6554" PackOffset="1919335" />
<Blob Hash="ad6f1788310a3a5a761873fef1a32416b7dbca89" Size="8558" PackHash="b8b36b31df40a1fc9087e4b313999fcda60845cc" PackOffset="1639178" />
<Blob Hash="ad76303bfb96e647a724a4b9bd19ff9b102891c7" Size="58950" PackHash="993a6f12f18038e786994acdf2c5b1b614705b6e" PackOffset="252" />
@@ -42989,7 +42991,7 @@
<Blob Hash="c0b8d706afa895e4096bc348199cb4e02f6882be" Size="281376" PackHash="e7c0d839f4862a30228ee915487ecd9f9b7c6554" PackOffset="1415613" />
<Blob Hash="c0bcebbd7198e55822be80f862308c67449f92bf" Size="196623" PackHash="6528d9c32ea9fb0a1246406c896c093cadd188be" PackOffset="1682692" />
<Blob Hash="c0bf63903bf06552090c3d15232cf78f649c981d" Size="3877" PackHash="5e7d96af5e5b1cafa670bd77ae918457a118f7a5" PackOffset="163182" />
<Blob Hash="c0c004857066f176b2e6640475c57a923b69cf46" Size="3122" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="263447" />
<Blob Hash="c0c004857066f176b2e6640475c57a923b69cf46" Size="3122" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="360757" />
<Blob Hash="c0c3585b9346b9af65d9f29754fd04ae79e1e61a" Size="486168" PackHash="29eae01c452b3ae340b64ad4266ea1152b4e6729" PackOffset="8" />
<Blob Hash="c0c6c31575f4dab738369bf1d9c364dbff95b4bf" Size="350" PackHash="e458507f455e3bac9232d632426fc4b75f29841d" PackOffset="2083600" />
<Blob Hash="c0cc17b8e6289f49afe77148796b16b62c1ec125" Size="23716" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="318280" />
@@ -43284,7 +43286,7 @@
<Blob Hash="c48195cf9250fc6d5dbe82800a99b9515dd689a8" Size="6080" PackHash="67f9a57842391bca1072e56b907d2adde02d2d34" PackOffset="2059602" />
<Blob Hash="c4822d8d605ad956841c48c18a093921795d6859" Size="2930" PackHash="cb73a430e097bac42d93ec902203b7888ed0b681" PackOffset="445916" />
<Blob Hash="c483961dc5bfe48ac569b9ee6705de4fa8bab3ce" Size="1514" PackHash="0e0fc56444fa93555de76ff8aaa98b0bd94a186d" PackOffset="2061676" />
<Blob Hash="c4846aac3b99280e97b2c865360a460fdf4bd60f" Size="3831" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="235957" />
<Blob Hash="c4846aac3b99280e97b2c865360a460fdf4bd60f" Size="3831" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="333267" />
<Blob Hash="c4865afd2ec4460c5bcdacc6a625fadba5e97a00" Size="94" PackHash="c0bd7faa171ad74be5b72c3a97dd4271931e266b" PackOffset="2086768" />
<Blob Hash="c487c6edf02f0e63da0e57119461337d42474d8f" Size="2480" PackHash="2631f487c5e698c5e0213f447e9542366eaca8ba" PackOffset="2091746" />
<Blob Hash="c488502db82c703e1370e3638ec807c1e1cd94e6" Size="340277" PackHash="8eac56bd8c8cee088d0978068da9b9aefd77c5a3" PackOffset="540455" />
@@ -44084,7 +44086,6 @@
<Blob Hash="cee463779cfd70313c01e400467b7e27e8d275ae" Size="98196" PackHash="7e504e731d99b59de57d71becdb34fce6d198dec" PackOffset="190298" />
<Blob Hash="cee9b9eb667fdea8190b8175d436b7f7065c9df3" Size="29239" PackHash="a5e99282914b18ad1dbc72e0b8323e977d746d08" PackOffset="1823398" />
<Blob Hash="ceec955cf5fca5677f773cd8c42bb7eae1a96b5f" Size="693" PackHash="d67cb445f37637410f670b1d8682dcf22ced07ae" PackOffset="372692" />
<Blob Hash="cefa61d5f12f7ffcc792535c1720de7ab60e1fcf" Size="20729" PackHash="4b7f431eef119ccdba22d4c2574663e160b8a91c" PackOffset="49527" />
<Blob Hash="cefc01cb07d874022510248b7c2f132364af4c9a" Size="9192" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="496684" />
<Blob Hash="cefea4b949fd7d77ee57f472f0375bf0e19b6498" Size="28204" PackHash="077b2d38582f0b10f5b7abbe23141dae500a4a90" PackOffset="1277209" />
<Blob Hash="cf063d6270380694ef9d08c7554a58750f25befd" Size="52186" PackHash="2f3b66c8bc4bc7ba4a38982c19f7aea56a40fa44" PackOffset="1811523" />
@@ -44129,7 +44130,7 @@
<Blob Hash="cfa1ba2ce33f0c776abf98dc1093aaa5b50bc95e" Size="7275" PackHash="2f13e90048446b62f7b075e0a79209d62ee1b054" PackOffset="2080578" />
<Blob Hash="cfa52e8482435c4a5530da795b593c8b68226079" Size="195" PackHash="e8c3e90942a5b288720c462500e119088f07598b" PackOffset="1249554" />
<Blob Hash="cfa852ea23806341333378c673277dbfb5fc3f27" Size="3812" PackHash="fc72803a9439e161de25108be11e5429ed900f77" PackOffset="706826" />
<Blob Hash="cfa8b5faa3c85b8772fb80c36683758da5436882" Size="5069" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="226341" />
<Blob Hash="cfa8b5faa3c85b8772fb80c36683758da5436882" Size="5069" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="323651" />
<Blob Hash="cfadb5f0a909cb5a788582a6123fc2acc2318018" Size="2141" PackHash="f583c0aed25a4020915efb60751fb8324d3bd971" PackOffset="2082271" />
<Blob Hash="cfae25aa8913d083722900a1aba9293da7aa534b" Size="3464" PackHash="59c4bec5e2957d30ef37c5198c4b90381f3ba20f" PackOffset="753727" />
<Blob Hash="cfae4d4817868637258a427e520c470396f7fc2f" Size="6702" PackHash="0255260ee4d81de161e877cdcc3af4d7fcf8d0e3" PackOffset="315313" />
@@ -45031,7 +45032,7 @@
<Blob Hash="dbd01c8eda1400eeca13b7985fa2dbd0285b886f" Size="88" PackHash="33d0a2949662b327b35a881192e85107ecafc8ac" PackOffset="1010496" />
<Blob Hash="dbd9915a84f237102ceac1573ecdfd99805d0cf2" Size="490014" PackHash="b184d847c73d6d023a1fa8fd14420557267af75b" PackOffset="683958" />
<Blob Hash="dbdd58c7fd195fc602c4541d6f416cc96094c121" Size="8024" PackHash="b8b36b31df40a1fc9087e4b313999fcda60845cc" PackOffset="1990189" />
<Blob Hash="dbe3974bf27486cfdfee11c2395c05b994f4f091" Size="2575" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="300186" />
<Blob Hash="dbe3974bf27486cfdfee11c2395c05b994f4f091" Size="2575" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="377931" />
<Blob Hash="dbe409fb15def09f5a85213e79864d7a19643770" Size="29868" PackHash="15c1c1820f17cbc99a977498d87549e3b4060f7c" PackOffset="115176" />
<Blob Hash="dbe4122c6758eefba8f2ff2c73cb099128ffee28" Size="9" PackHash="77e35cfb8539a11b247fa724909ef74bb3faa379" PackOffset="2096579" />
<Blob Hash="dbe45539283bf86193200298a799fc0ba2755e01" Size="205312" PackHash="e02ceffa7dbf58acfed245113d911e454ca80807" PackOffset="658952" />
@@ -45571,7 +45572,6 @@
<Blob Hash="e3068c57ae2229cf0cb0ddba769520ece3502c46" Size="147" PackHash="b8b36b31df40a1fc9087e4b313999fcda60845cc" PackOffset="1257146" />
<Blob Hash="e307d9064a47f64347b67bfc521f7354fdf29bf5" Size="39575" PackHash="62e18e2b34d9ca5872cacacfd6eb9e94afd0eb2e" PackOffset="1791418" />
<Blob Hash="e311d70098af5348980f376d8f5b3d908266295c" Size="82965" PackHash="0efa3dcc442cd6815f2f720c105c1a7f016e5474" PackOffset="270839" />
<Blob Hash="e31b8ffab60cdd24a429f7c518e4b83150d2fe2d" Size="49777" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="8" />
<Blob Hash="e32a962ee1eeec946b6e292ff228cd670450a5bf" Size="6431" PackHash="0c445f80a2ecf9c21997b82ec24629626b390c41" PackOffset="1545591" />
<Blob Hash="e32ec5d551c31d04cbf4da3538c9d424856b7ccc" Size="1508" PackHash="f583c0aed25a4020915efb60751fb8324d3bd971" PackOffset="2095350" />
<Blob Hash="e3344777342b47cb0929b6ab5b9317baca956c76" Size="1214" PackHash="4b7f431eef119ccdba22d4c2574663e160b8a91c" PackOffset="1411359" />
@@ -45644,6 +45644,7 @@
<Blob Hash="e42fa27893d79d0b452990d4711bfa35dd035b13" Size="138204" PackHash="70a32db151b77e2f721ed08a9e712bb4cfd260d3" PackOffset="1232631" />
<Blob Hash="e430792cb58f6f568f40e28de71aaa6c399ee2c2" Size="52" PackHash="c0bd7faa171ad74be5b72c3a97dd4271931e266b" PackOffset="2086716" />
<Blob Hash="e4393dcf44750e6b205158cadeb5dbb002c8cdea" Size="1299522" PackHash="e817ca9104379dfa75233081d3d42cccbf3cb21f" PackOffset="8" />
<Blob Hash="e43b6fa7c1b72e7f3f680238bdafd0145a2244a4" Size="33578" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="108161" />
<Blob Hash="e44565503660cacef34045d75925cc3394dd3b57" Size="8009" PackHash="926540c5a0b84439444ce2305aa3737763bb95a3" PackOffset="1916082" />
<Blob Hash="e44d4a2d8d32cc158c792bed375da895df66ade0" Size="674200" PackHash="cbd57862f9e6e563145e50b34acef65f589a6c22" PackOffset="659148" />
<Blob Hash="e451351d8d91d6320ba31749f1cfb0a040fc90d1" Size="3651" PackHash="12d213957fbfe643a97d5072b1f6ae30aeebcbb7" PackOffset="1673168" />
@@ -46145,7 +46146,6 @@
<Blob Hash="ea757f9eb6d99360fc0b3ada77a813e896de18c3" Size="19115" PackHash="504c0a6da5f49d4bcd18f11ee59db45e32d6c143" PackOffset="169369" />
<Blob Hash="ea7660fc18188c92b80f55970b556ba001e04995" Size="62881" PackHash="fb8c31646887718de45e229d7015c658f3c1bf5e" PackOffset="414648" />
<Blob Hash="ea7ec2e57641a207d7a86effa8f724e9f8b3342a" Size="2775" PackHash="cb73a430e097bac42d93ec902203b7888ed0b681" PackOffset="714265" />
<Blob Hash="ea84deef96ae8b9dd97306a4e420c34fffbd33ad" Size="35397" PackHash="4bb6349baec89b4c87d19f5576824f714a9e50ca" PackOffset="32818" />
<Blob Hash="ea940cefad9ca4d7e165efa09eaf28b312f64ee0" Size="17920" PackHash="5b3005b0c21940273d4cc8a4720482f003e8bb3b" PackOffset="1114840" />
<Blob Hash="ea9484c1382cb3acb0bd570ee4fb015494df63e9" Size="3568" PackHash="89550f66a2a48a9f1b9089703e9b33eb14a23ae5" PackOffset="1237589" />
<Blob Hash="ea99928aad98fcc9fa457cf96d212cfdb44f3f04" Size="5423" PackHash="fc72803a9439e161de25108be11e5429ed900f77" PackOffset="438423" />
@@ -47207,7 +47207,7 @@
<Blob Hash="f807a3f84baa77f7ddab5f3054d7e15dae724bbe" Size="18506" PackHash="4b68b1eb2767528f8817b77879c7a9158dd40b22" PackOffset="410899" />
<Blob Hash="f808183d52fdc4998c4eed5cfc6be28e5bfda048" Size="327506" PackHash="c594efd9ea8b4dee5949283c972b5f0992c20f4e" PackOffset="1260214" />
<Blob Hash="f8112565817277081833c0d537cc7306aa7bce7c" Size="112" PackHash="1d09bb4f8ba502cef13de6d570839e6790bf3542" PackOffset="1706080" />
<Blob Hash="f8135a19ab3dd88c4e0157c64878495607852267" Size="4513" PackHash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" PackOffset="255078" />
<Blob Hash="f8135a19ab3dd88c4e0157c64878495607852267" Size="4513" PackHash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" PackOffset="352388" />
<Blob Hash="f8144cd83bc5b5eb7c348573e515be10d70d9365" Size="21800" PackHash="5b3005b0c21940273d4cc8a4720482f003e8bb3b" PackOffset="253872" />
<Blob Hash="f8165cfcc6a692f6bd2abb2335e0765f22cbe076" Size="22580" PackHash="2f143d8520d94bbf2cb250b35a8f79e3d3e8572c" PackOffset="1395776" />
<Blob Hash="f8220e49c24fd3065dd35aeb29b65524fb3f5c88" Size="1468" PackHash="02f911003167be7b08c3fbf9bdababa124958f48" PackOffset="998563" />
@@ -48921,7 +48921,6 @@
<Pack Hash="7f71721b1137c69284b129b62faab352613a6878" Size="9170952" CompressedSize="2784128" RemotePath="2941462-bc7508e880884c49aaa0481bd9dc3ce4" />
<Pack Hash="7f803418abf666f218e4fb96356d31245386d150" Size="2565268" CompressedSize="499636" RemotePath="3057215-a8cb2a7c3e8f42118ccdeba68eee51ec" />
<Pack Hash="7f8b724b75c6f29c33f33a1f310cb495e079aaa1" Size="2106179" CompressedSize="2105793" RemotePath="2487260-b428468bcd6545bfbb79f02a6605b9ef" />
<Pack Hash="7fc5dda654db28eeafb73eac158a0e7f9b8db967" Size="302761" CompressedSize="48742" RemotePath="3032739-f14a11ddb6824c5faecaac0a918edbbd" />
<Pack Hash="7fccc82f9be0fa0f6e6261d3f42e4d4ceffd3373" Size="12083912" CompressedSize="3554327" RemotePath="2823453-a1a8970ad3b340dab4a39033489ea93b" />
<Pack Hash="7fe64241b07105e31272f224ac763156f8b8296c" Size="5159922" CompressedSize="1274332" RemotePath="2369826-2acd3c361c9d4a858bd63938a2ab980e" />
<Pack Hash="7fef45bde9cd95e88de4acafea48670342c66480" Size="1210459" CompressedSize="1208768" RemotePath="2943240-c2a9d38c57e7438db3f8ee61341bdcec" />
@@ -49391,6 +49390,7 @@
<Pack Hash="b3374cffdc53a6ef70b1548fc15bdce8028a8568" Size="8001174" CompressedSize="2277343" RemotePath="2823453-a1a8970ad3b340dab4a39033489ea93b" />
<Pack Hash="b33dbe936d08959ce00d8d551c9861052b05a0e3" Size="2005160" CompressedSize="420491" RemotePath="2468936-39e1c39556f84e60be8d850c452aed67" />
<Pack Hash="b340df79902aa136e855ea8c79563a6004843491" Size="6146812" CompressedSize="1207197" RemotePath="2823453-a1a8970ad3b340dab4a39033489ea93b" />
<Pack Hash="b3601b8dd175b9ae50d3e89ee8acc3f3926bc447" Size="380506" CompressedSize="63395" RemotePath="3058822-e4dcfa8945ff4ed793f3cc8ab59f68c1" />
<Pack Hash="b3643e64562cf8928fe74794820c500f305fac17" Size="3846950" CompressedSize="1070791" RemotePath="2604938-a9e6e886491749ef99155ebfe50a18fa" />
<Pack Hash="b38e92132b3781a0b91304d588fe987368db4b5e" Size="12954632" CompressedSize="2965249" RemotePath="2902827-fcb0d018c7244c24a109c548187a724e" />
<Pack Hash="b3a267c43c45f392523e300a6f61318f4ae52d99" Size="42449972" CompressedSize="7029285" RemotePath="2746340-c2a61f9b32ff472ab773585edac060ee" />

View File

@@ -1,38 +1,34 @@
<?xml version='1.0' ?>
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../../Engine/Build/Graph/Schema.xsd" >
<!-- Directory to output Installed files to -->
<Property Name="LocalInstalledDir" Value="$(RootDir)\LocalBuilds\Installed\Windows"/>
<Property Name="LocalInstalledDirMac" Value="$(RootDir)/LocalBuilds/Installed/Mac"/>
<!-- Set base directory for output from installed builds if not already specified -->
<Property Name="OutputDir" Default="$(RootDir)\LocalBuilds\PublishedInstall"/>
<Property Name="OutputDirMac" Default="$(RootDir)/LocalBuilds/PublishedInstall"/>
<!-- The output directory to store zip files and full symbols -->
<Option Name="PublishDir" DefaultValue="$(RootDir)/LocalBuilds/Engine" Description="Root directory to contain published builds and symbols"/>
<!-- Create Labelled Directory to place published builds if specified -->
<Property Name="BuildLabel" Default=""/>
<Property Name="LabeledBuildDir" Value="$(BuildLabel)"/>
<Property Name="LabeledBuildDir" Value="$(LabeledBuildDir)/" If="'$(LabeledBuildDir)' != '' And !HasTrailingSlash('$(LabeledBuildDir)')"/>
<Property Name="PublishedInstallDir" Value="$(OutputDir)/Engine/$(LabeledBuildDir)Windows"/>
<Property Name="PublishedInstallDirMac" Value="$(OutputDirMac)/Engine/$(LabeledBuildDir)Mac"/>
<!-- Setup default target platforms for Installed build if they haven't been specified on the commandline -->
<Option Name="WithWin64" Restrict="true|false" DefaultValue="true" Description="Include the Win64 target platform"/>
<Option Name="WithWin32" Restrict="true|false" DefaultValue="true" Description="Include the Win32 target platform"/>
<Option Name="WithMac" Restrict="true|false" DefaultValue="true" Description="Include the Mac target platform"/>
<Option Name="WithAndroid" Restrict="true|false" DefaultValue="true" Description="Include the Android target platform"/>
<Option Name="WithIOS" Restrict="true|false" DefaultValue="true" Description="Include the iOS target platform"/>
<Option Name="WithTVOS" Restrict="true|false" DefaultValue="true" Description="Include the tvOS target platform"/>
<Option Name="WithLinux" Restrict="true|false" DefaultValue="true" Description="Include the Linux target platform"/>
<Option Name="WithHTML5" Restrict="true|false" DefaultValue="true" Description="Include the HTML5 target platform"/>
<Option Name="WithPS4" Restrict="true|false" DefaultValue="false" Description="Include the PS4 target platform"/>
<Option Name="WithXboxOne" Restrict="true|false" DefaultValue="false" Description="Include the XboxOne target platform"/>
<!-- Whether to create a prebuilt DDC -->
<Option Name="WithDDC" Restrict="true|false" DefaultValue="true" Description="Build a standalone derived-data cache for the engine content and templates" />
<!-- The analytics type -->
<Option Name="AnalyticsTypeOverride" DefaultValue="" Description="Identifier for analytic events to send"/>
<!-- The local output directory -->
<Property Name="LocalInstalledDir" Value="$(RootDir)/LocalBuilds/Engine/Windows"/>
<Property Name="LocalInstalledDirMac" Value="$(RootDir)/LocalBuilds/Engine/Mac"/>
<!-- Directory for storing build products like the Compressed DDC, Stripped and Signed files -->
<Property Name="SavedOutput" Value="$(RootDir)/Saved"/>
<!-- Setup default target platforms for Installed build if they haven't been specified on the commandline -->
<Property Name="WithWin64" Default="true"/>
<Property Name="WithWin32" Default="true"/>
<Property Name="WithMac" Default="true"/>
<Property Name="WithAndroid" Default="true"/>
<Property Name="WithIOS" Default="true"/>
<Property Name="WithTVOS" Default="true"/>
<Property Name="WithLinux" Default="true"/>
<Property Name="WithHTML5" Default="true"/>
<Property Name="WithPS4" Default="false"/>
<Property Name="WithXboxOne" Default="false"/>
<Property Name="WithDDC" Default="true"/>
<!-- Architectures that we build for Android -->
<Property Name="AndroidArchitectures" Value="armv7+arm64"/>
<Property Name="AndroidGPUArchitectures" Value="es2"/>
@@ -265,7 +261,7 @@
</Node>
</Agent>
<Property Name="CookPlatformsWin64" Default="Windows"/>
<Property Name="CookPlatformsWin64" Value="Windows"/>
<Property Name="CookPlatformsWin64" Value="$(CookPlatformsWin64)+WindowsNoEditor" If="'$(WithWin64)' == true Or '$(WithWin32)' == true"/>
<Property Name="CookPlatformsWin64" Value="$(CookPlatformsWin64)+Android_ATC" If="'$(WithAndroid)' == true"/>
<Property Name="CookPlatformsWin64" Value="$(CookPlatformsWin64)+IOS" If="'$(WithIOS)' == true"/>
@@ -308,7 +304,7 @@
</Node>
</Agent>
<Property Name="CookPlatformsMac" Default="Mac"/>
<Property Name="CookPlatformsMac" Value="Mac"/>
<Property Name="CookPlatformsMac" Value="$(CookPlatformsMac)+MacNoEditor" If="'$(WithMac)' == true"/>
<Property Name="CookPlatformsMac" Value="$(CookPlatformsMac)+Android_ATC" If="'$(WithAndroid)' == true"/>
<Property Name="CookPlatformsMac" Value="$(CookPlatformsMac)+IOS" If="'$(WithIOS)' == true"/>
@@ -452,7 +448,6 @@
<Tag Files="#UE4Game HTML5;#UE4Game HTML5 Includes" With="#Installed Win64"/>
<Property Name="CopyInstalledFilter" Value="$(CopyInstalledFilter);$(CopyHTML5Filter)"/>
<Property Name="CopyInstalledExceptions" Value="$(CopyInstalledExceptions);$(CopyHTML5Exceptions)"/>
<Property Name="CopyInstalledFilter" Value="$(CopyInstalledFilter);Engine/Source/ThirdParty/HTML5/emsdk/Win64/..."/>
</Do>
<Do If="'$(WithPS4)' == true">
<Tag Files="#UE4Game PS4;#UE4Game PS4 Includes" With="#Installed Win64"/>
@@ -552,7 +547,7 @@
<Zip FromDir="$(LocalInstalledDir)" Files="#EditorOnly" ZipFile="EditorInstall.zip" Tag="#Zipped Installs"/>
<!-- Copy the files to their final location -->
<Copy Files="#Zipped Installs" FromDir="$(RootDir)" ToDir="$(PublishedInstallDir)"/>
<Copy Files="#Zipped Installs" FromDir="$(RootDir)" ToDir="$(PublishDir)/WindowsZips"/>
<Delete Files="#Zipped Installs"/>
</Node>
@@ -568,7 +563,7 @@
<Node Name="Publish Installed Symbols Win64" Requires="$(SymbolRequirements)">
<!-- Also include all of the DotNET binaries -->
<Tag Files="Engine/Binaries/DotNET/...;$(SymbolRequirements)" Filter="*.pdb;*.dsym;*.map;*.exe;*.dll" Except=".../Binaries/Mac/..." With="#Symbols To Publish"/>
<Copy Files="#Symbols To Publish" FromDir="$(RootDir)" ToDir="$(PublishedInstallDir)Symbols"/>
<Copy Files="#Symbols To Publish" FromDir="$(RootDir)" ToDir="$(PublishDir)/WindowsSymbols"/>
</Node>
</Agent>
@@ -653,7 +648,6 @@
<Tag Files="#UE4Game HTML5;#UE4Game HTML5 Includes" With="#Installed Mac"/>
<Property Name="CopyInstalledFilter" Value="$(CopyInstalledFilter);$(CopyHTML5Filter)"/>
<Property Name="CopyInstalledExceptions" Value="$(CopyInstalledExceptions);$(CopyHTML5Exceptions)"/>
<Property Name="CopyInstalledFilter" Value="$(CopyInstalledFilter);Engine/Source/ThirdParty/HTML5/emsdk/Mac/..."/>
</Do>
<!-- Tag any dependencies from all previous build products -->
@@ -733,7 +727,7 @@
<Zip FromDir="$(LocalInstalledDirMac)" Files="#EditorOnly" ZipFile="EditorInstall_OnMac.zip" Tag="#Zipped Installs"/>
<!-- Copy the files to their final location -->
<Copy Files="#Zipped Installs" FromDir="$(RootDir)" ToDir="$(PublishedInstallDirMac)"/>
<Copy Files="#Zipped Installs" FromDir="$(RootDir)" ToDir="$(PublishDir)/MacZips"/>
<Delete Files="#Zipped Installs"/>
</Node>
@@ -747,7 +741,7 @@
<Node Name="Publish Installed Symbols Mac" Requires="$(SymbolRequirements)">
<Tag Files="$(SymbolRequirements)" Filter="*.pdb;*.dsym;*.map;*.exe;*.dll" Except=".../Binaries/Win64/...;.../Binaries/Win32/..." With="#Symbols To Publish"/>
<Copy Files="#Symbols To Publish" FromDir="$(RootDir)" ToDir="$(PublishedInstallDirMac)Symbols"/>
<Copy Files="#Symbols To Publish" FromDir="$(RootDir)" ToDir="$(PublishDir)/MacSymbols"/>
</Node>
</Agent>

View File

@@ -1,315 +0,0 @@
[CopyEditor]
; Tool dependencies
/Engine/Binaries/DotNET/Ionic.Zip.Reduced.dll
/Engine/Binaries/DotNET/OneSky.dll
; DDC
-/Engine/DerivedDataCache/...
/Engine/DerivedDataCache/Compressed.ddp
; In-editor documentation
/Engine/Documentation/Source/Shared/...
; Content folders
/Engine/Content/...
-/Engine/Content/....psd
-/Engine/Content/....pdn
-/Engine/Content/....fbx
-/Engine/Content/....po
; Config files
/Engine/Config/...
-/Engine/Config/....vdf
/Engine/Programs/...
-/Engine/Programs/UnrealGameSync/...
; Plugins
/Engine/Plugins/....uplugin
/Engine/Plugins/.../Content/...
/Engine/Plugins/.../Resources/...
/Engine/Plugins/.../Source/...
/Engine/Plugins/.../Templates/...
-/Engine/Plugins/Runtime/TwitchLiveStreaming/...
; Exclude Mac binaries on windows here, because previous wildcard for plugin resources matches OSX dsym resources on Windows
{Win64} -/Engine/Plugins/.../Binaries/Mac/...
; Source code
/Engine/Source/UE4Game.Target.cs
/Engine/Source/UE4Editor.Target.cs
/Engine/Source/Runtime/...
/Engine/Source/Developer/...
/Engine/Source/Editor/...
/Engine/Source/ThirdParty/.../*.Build.cs
/Engine/Source/ThirdParty/Licenses/...
/Engine/Source/Programs/UnrealHeaderTool/...
-/Engine/Source/Runtime/SQLiteSupport/...
; Shaders
/Engine/Shaders/...
; Exclude all the intermediate files in the Engine/Saved folder
-/Engine/Saved/...
; Valid templates will be included by name from the build script, but we need to exclude intermediates
-/Templates/*/Binaries/...
-/Templates/*/Build/Receipts/...
-/Templates/*/Intermediate/...
-/Templates/*/DerivedDataCache/...
-/Templates/*/Saved/...
-/Templates/*/manifest.json
-/Templates/*/contents.txt
; Win64-specific dependencies
{Win64} -/Engine/Binaries/Win64/UE4EditorServices.*
{Win64} -/Engine/Binaries/Win64/UnrealVersionSelector*
{Win64} /Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Win32/VS2015/*
{Win64} /Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Win64/VS2015/*
{Win64} /Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win64/VS2015/*.dll
{Win64} -/Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win64/VS2015/*DEBUG_x64.dll
{Win64} -/Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win64/VS2015/*CHECKED_x64.dll
{Win64} /Engine/Binaries/ThirdParty/Oculus/Audio/Win64/ovraudio64.dll
{Win64} /Engine/Binaries/ThirdParty/LeapMotion/...
{Win64} /Engine/Binaries/ThirdParty/OSVRClientKit/bin/Win64/...
{Win64} /Engine/Plugins/Runtime/LeapMotion/ThirdParty/LeapSDK/...
{Win64} /Engine/Build/BatchFiles/Build.bat
{Win64} /Engine/Build/BatchFiles/Clean.bat
{Win64} /Engine/Build/BatchFiles/Rebuild.bat
{Win64} /Engine/Build/BatchFiles/RunUAT.bat
{Win64} /Engine/Build/BatchFiles/GetVSComnToolsPath.bat
{Win64} -/Engine/Build/Receipts/PS4MapFile*
{Win64} -/Engine/Build/Receipts/XboxOnePDBFileUtil*
{Win64} -/Engine/Build/Receipts/UE4Client-Linux*
{Win64} -/Engine/Build/Receipts/UE4EditorServices*
{Win64} -/Engine/Build/Receipts/UE4Server-Linux*
{Win64} /Engine/Extras/3dsMaxScripts/...
{Win64} /Engine/Extras/VisualStudioDebugging/UE4.natvis
{Win64} /Engine/Extras/Maya_AnimationRiggingTools/MayaTools/...
{Win64} /Engine/Extras/MayaVelocityGridExporter/...
{Win64} /Engine/Extras/UnrealVS/...
{Win64} /Engine/Extras/Redist/en-us/*
; Mac-specific dependencies
{Mac} /Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Mac/*
{Mac} /Engine/Binaries/ThirdParty/Mono/Mac/...
{Mac} /Engine/Source/ThirdParty/CEF3/cef_binary_3.2357.1291.g47e6d4b_macosx64/Release/locale/...
{Mac} /Engine/Build/BatchFiles/Mac/Build.sh
{Mac} /Engine/Build/BatchFiles/Mac/GenerateLLDBInit.sh
{Mac} /Engine/Build/BatchFiles/Mac/FixDependencyFiles.sh
{Mac} /Engine/Build/BatchFiles/Mac/GenerateProjectFiles.sh
{Mac} /Engine/Build/BatchFiles/Mac/SetupMono.sh
{Mac} /Engine/Build/BatchFiles/Mac/FixMonoFiles.sh
{Mac} /Engine/Build/BatchFiles/Mac/RunMono.sh
{Mac} /Engine/Build/BatchFiles/Mac/RunXBuild.sh
{Mac} /Engine/Build/BatchFiles/RunUAT.command
{Mac} /Engine/Build/BatchFiles/RunUAT.sh
{Mac} /Engine/Extras/LLDBDataFormatters/UE4DataFormatters.py
{Mac} /Engine/Extras/Maya_AnimationRiggingTools/ArtToolsOSX/...
; Don't want these folders, even if they're part of ToolsForCompile
{Mac} -/Engine/Binaries/Win32/...
{Mac} -/Engine/Binaries/Win64/...
; Linux-specific dependencies
{Linux} /Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Linux/...
{Linux} /Engine/Build/BatchFiles/Linux/Build.sh
{Linux} /Engine/Build/BatchFiles/Linux/BuildThirdParty.sh
{Linux} /Engine/Build/BatchFiles/Linux/GenerateProjectFiles.sh
{Linux} /Engine/Build/BatchFiles/Linux/GitDependencies.sh
{Linux} /Engine/Build/BatchFiles/Linux/QASmokeManual.sh
{Linux} /Engine/Build/BatchFiles/Linux/RunMono.sh
{Linux} /Engine/Build/BatchFiles/Linux/RunXBuild.sh
{Linux} /Engine/Build/BatchFiles/Linux/Setup.sh
{Linux} /Engine/Build/BatchFiles/Linux/UpdateDeps.sh
{Linux} /Engine/Build/BatchFiles/RunUAT.sh
[CopyTargetPlatforms]
; API docs
/Engine/Documentation/CHM/API.chm
; Build files
/Engine/Build/Build.version
/Engine/Build/Target.cs.template
; Starter content
/Samples/StarterContent/Content/...
/Samples/MobileStarterContent/Content/...
; shared template resources
/Templates/TemplateResources/...
[CopyTargetPlatform.Android]
; Build files
/Engine/Build/Android/...
/Engine/Source/ThirdParty/Android/cxa_demangle/...
/Engine/Source/ThirdParty/GoogleVR/...
/Engine/Source/ThirdParty/Oculus/OculusMobile/SDK_1_0_0/Libs/...
-/Engine/Binaries/Android/....apk
; AndroidWorks installer
{Win64} /Engine/Extras/AndroidWorks/Win64/*.exe
{Mac} /Engine/Extras/AndroidWorks/Mac/*.dmg
[CopyTargetPlatform.IOS]
; Build files
/Engine/Build/IOS/...
/Engine/Source/ThirdParty/GoogleVR/...
-/Engine/Build/IOS/....psd
-/Engine/Build/IOS/....mobileprovision
-/Engine/Build/IOS/UnrealRemoteTool
; Content-only on Win64: exclude things we only need for code projects
{Win64} -/Engine/Binaries/IOS/*.a
{Win64} -/Engine/Binaries/IOS/.../*.a
{Win64} -/Engine/Binaries/IOS/UE4Game
{Win64} -/Engine/Binaries/IOS/UE4Game-IOS-Shipping
{Win64} -/Engine/Intermediate/.../IOS/...
{Win64} -/Engine/Plugins/.../Binaries/IOS/...
{Win64} /Engine/Binaries/DotNET/IOS/openssl.exe
{Win64} /Engine/Binaries/ThirdParty/IOS/*
; All tools for Mac
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentServer.exe
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentServer.exe.config
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentInterface.dll
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentInterface.dll.config
{Mac} /Engine/Binaries/DotNET/iOS/iPhonePackager.exe
{Mac} /Engine/Binaries/DotNET/iOS/iPhonePackager.exe.config
{Mac} /Engine/Binaries/DotNET/iOS/MobileDeviceInterface.dll
{Mac} /Engine/Binaries/DotNET/iOS/MobileDeviceInterface.dll.config
{Mac} /Engine/Source/ThirdParty/Facebook/IOS/...
[CopyTargetPlatform.TVOS]
; Build files
/Engine/Build/TVOS/...
-/Engine/Build/TVOS/....psd
-/Engine/Build/TVOS/....mobileprovision
; Content-only on Win64: exclude things we only need for code projects
{Win64} -/Engine/Binaries/TVOS/*.a
{Win64} -/Engine/Binaries/TVOS/.../*.a
{Win64} -/Engine/Binaries/TVOS/UE4Game
{Win64} -/Engine/Binaries/TVOS/UE4Game-TVOS-Shipping
{Win64} -/Engine/Intermediate/.../TVOS/...
{Win64} -/Engine/Plugins/.../Binaries/TVOS/...
{Win64} /Engine/Binaries/DotNET/IOS/openssl.exe
{Win64} /Engine/Binaries/ThirdParty/IOS/*
; All tools for Mac
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentServer.exe
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentServer.exe.config
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentInterface.dll
{Mac} /Engine/Binaries/DotNET/iOS/DeploymentInterface.dll.config
{Mac} /Engine/Binaries/DotNET/iOS/iPhonePackager.exe
{Mac} /Engine/Binaries/DotNET/iOS/iPhonePackager.exe.config
{Mac} /Engine/Binaries/DotNET/iOS/MobileDeviceInterface.dll
{Mac} /Engine/Binaries/DotNET/iOS/MobileDeviceInterface.dll.config
{Mac} /Engine/Source/ThirdParty/Facebook/IOS/...
[CopyTargetPlatform.HTML5]
; Build files
/Engine/Build/HTML5/...
; SDK
/Engine/Source/ThirdParty/HTML5/emsdk/emscripten/...
{Win64} /Engine/Source/ThirdParty/HTML5/emsdk/Win64/...
{Mac} /Engine/Source/ThirdParty/HTML5/emsdk/Mac/...
[CopyTargetPlatform.Win32]
; Just third party dependencies.
/Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win32/VS2015/*.dll
-/Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win32/VS2015/*DEBUG_x86.dll
-/Engine/Binaries/ThirdParty/PhysX/PhysX-3.3/Win32/VS2015/*CHECKED_x86.dll
[CopyTargetPlatform.Linux]
; Content-only: include pre-compiled executables manually
-/Engine/Binaries/Linux/*
/Engine/Binaries/Linux/CrashReportClient
/Engine/Binaries/Linux/libopenal.so.1
/Engine/Binaries/Linux/UE4Game
/Engine/Binaries/Linux/UE4Game.target
/Engine/Binaries/Linux/UE4Game-Linux-Shipping
/Engine/Binaries/Linux/UE4Game-Linux-Shipping.target
/Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Linux/x86_64-unknown-linux-gnu/*.so
/Engine/Config/Controller.vdf
/Engine/Binaries/ThirdParty/OpenAL/Linux/*
/Engine/Binaries/ThirdParty/Steamworks/Steamv132/Linux/*.so
[StripSymbols.Android]
/Engine/Binaries/Android/....a
/Engine/Binaries/Android/....so
/Engine/Plugins/.../Binaries/Android/....a
/Engine/Plugins/.../Binaries/Android/....so
[StripSymbols.IOS]
/Engine/Binaries/IOS/....a
/Engine/Plugins/.../Binaries/IOS/....a
[StripSymbols.TVOS]
/Engine/Binaries/TVOS/....a
/Engine/Plugins/.../Binaries/TVOS/....a
[StripSymbols.Mac]
/Engine/Binaries/Mac/....a
/Engine/Plugins/.../Binaries/Mac/....a
[StripSymbols.Win32]
/Engine/Binaries/Win32/....pdb
/Engine/Plugins/.../Binaries/Win32/....pdb
[StripSymbols.Win64]
/Engine/Binaries/Win64/....pdb
/Engine/Plugins/.../Binaries/Win64/....pdb
{Win64} -/Engine/Binaries/Win64/UE4Editor*.pdb
{Win64} -/Engine/Plugins/2D/Paper2D/Binaries/Win64/UE4Editor*.pdb
[StripSymbols.Linux]
/Engine/Binaries/Linux/*.
[LauncherAttribute.compressed]
*.pdb
*.lib
[LauncherAttribute.readonly]
/Engine/Source/...
[LauncherAttribute.tag:editor_symbols]
*.pdb
*.dsym
[LauncherAttribute.tag:starter_content]
/Samples/StarterContent/...
/Samples/MobileStarterContent/...
[LauncherAttribute.tag:templates]
/FeaturePacks/...
/Templates/...
[LauncherAttribute.tag:engine_source]
/Engine/Source/....cpp
[LauncherAttribute.tag:art_tools]
/Engine/Extras/3dsMaxScripts/...
/Engine/Extras/Maya_AnimationRiggingTools/...
/Engine/Extras/MayaVelocityGridExporter/...
[LauncherAttribute.tag:platform_IOS]
/Engine/Binaries/IOS/...
[LauncherAttribute.tag:platform_Android]
/Engine/Binaries/Android/...
[LauncherAttribute.tag:platform_HTML5]
/Engine/Binaries/HTML5/...
[LauncherAttribute.tag:platform_Linux]
/Engine/Binaries/Linux/...
[LauncherAttribute.tag:platform_TVOS]
/Engine/Binaries/TVOS/...

View File

@@ -35,8 +35,8 @@
<Property Name="ProjectsToBuildDDC" Value="$(ProjectsToBuildDDC);Samples/MobileStarterContent/MobileStarterContent.uproject"/>
<!-- Define Filters/Exceptions to make it easy to add to them -->
<Property Name="CopyEditorFilter" Default=""/>
<Property Name="CopyEditorExceptions" Default=""/>
<Property Name="CopyEditorFilter" Value=""/>
<Property Name="CopyEditorExceptions" Value=""/>
<!-- Tool dependencies -->
<Property Name="CopyEditorFilter" Value="$(CopyEditorFilter);Engine/Binaries/DotNET/Ionic.Zip.Reduced.dll"/>
@@ -134,20 +134,20 @@
<!-- Target Platform Filters/Exceptions -->
<!-- Win64 -->
<Property Name="CopyWin64Filter" Default=""/>
<Property Name="CopyWin64Exceptions" Default=""/>
<Property Name="CopyWin64Filter" Value=""/>
<Property Name="CopyWin64Exceptions" Value=""/>
<!-- Win32 -->
<Property Name="CopyWin32Filter" Default=""/>
<Property Name="CopyWin32Exceptions" Default=""/>
<Property Name="CopyWin32Filter" Value=""/>
<Property Name="CopyWin32Exceptions" Value=""/>
<!-- Mac -->
<Property Name="CopyMacFilter" Default=""/>
<Property Name="CopyMacExceptions" Default=""/>
<Property Name="CopyMacFilter" Value=""/>
<Property Name="CopyMacExceptions" Value=""/>
<!-- Android -->
<Property Name="CopyAndroidFilter" Default=""/>
<Property Name="CopyAndroidExceptions" Default=""/>
<Property Name="CopyAndroidFilter" Value=""/>
<Property Name="CopyAndroidExceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyAndroidFilter" Value="$(CopyAndroidFilter);Engine/Build/Android/..."/>
@@ -157,8 +157,8 @@
<Property Name="CopyAndroidExceptions" Value="$(CopyAndroidExceptions);Engine/Binaries/Android/....apk"/>
<!-- IOS -->
<Property Name="CopyIOSFilter" Default=""/>
<Property Name="CopyIOSExceptions" Default=""/>
<Property Name="CopyIOSFilter" Value=""/>
<Property Name="CopyIOSExceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyIOSFilter" Value="$(CopyIOSFilter);Engine/Build/IOS/..."/>
@@ -167,8 +167,8 @@
<Property Name="CopyIOSExceptions" Value="$(CopyIOSExceptions);Engine/Build/IOS/UnrealRemoteTool"/>
<!-- TVOS -->
<Property Name="CopyTVOSFilter" Default=""/>
<Property Name="CopyTVOSExceptions" Default=""/>
<Property Name="CopyTVOSFilter" Value=""/>
<Property Name="CopyTVOSExceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyTVOSFilter" Value="$(CopyTVOSFilter);Engine/Build/TVOS/..."/>
@@ -176,8 +176,8 @@
<Property Name="CopyTVOSExceptions" Value="$(CopyTVOSExceptions);Engine/Build/TVOS/....mobileprovision"/>
<!-- Linux -->
<Property Name="CopyLinuxFilter" Default=""/>
<Property Name="CopyLinuxExceptions" Default=""/>
<Property Name="CopyLinuxFilter" Value=""/>
<Property Name="CopyLinuxExceptions" Value=""/>
<!-- Content only - exclude things we only need for code projects -->
<Property Name="CopyLinuxExceptions" Value="$(CopyLinuxExceptions);Engine/Binaries/Linux/....a"/>
@@ -187,25 +187,27 @@
<Property Name="CopyLinuxFilter" Value="$(CopyLinuxFilter);Engine/Binaries/ThirdParty/ICU/icu4c-53_1/Linux/x86_64-unknown-linux-gnu/*.so"/>
<!-- HTML5 -->
<Property Name="CopyHTML5Filter" Default=""/>
<Property Name="CopyHTML5Exceptions" Default=""/>
<Property Name="CopyHTML5Filter" Value=""/>
<Property Name="CopyHTML5Exceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyHTML5Filter" Value="$(CopyHTML5Filter);Engine/Build/HTML5/..."/>
<!-- SDK -->
<Property Name="CopyHTML5Filter" Value="$(CopyHTML5Filter);Engine/Source/ThirdParty/HTML5/emsdk/emscripten/..."/>
<Property Name="CopyHTML5Filter" Value="$(CopyHTML5Filter);Engine/Extras/ThirdPartyNotUE/emsdk/emscripten/..."/>
<Property Name="CopyHTML5Filter" Value="$(CopyHTML5Filter);Engine/Extras/ThirdPartyNotUE/emsdk/Win64/..." If="'$(HostPlatform)' == 'Win64'"/>
<Property Name="CopyHTML5Filter" Value="$(CopyHTML5Filter);Engine/Extras/ThirdPartyNotUE/emsdk/Mac/..." If="'$(HostPlatform)' == 'Mac'"/>
<!-- PS4 -->
<Property Name="CopyPS4Filter" Default=""/>
<Property Name="CopyPS4Exceptions" Default=""/>
<Property Name="CopyPS4Filter" Value=""/>
<Property Name="CopyPS4Exceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyPS4Filter" Value="$(CopyHTML5Filter);Engine/Build/PS4/..."/>
<!-- XboxOne -->
<Property Name="CopyXboxOneFilter" Default=""/>
<Property Name="CopyXboxOneExceptions" Default=""/>
<Property Name="CopyXboxOneFilter" Value=""/>
<Property Name="CopyXboxOneExceptions" Value=""/>
<!-- Build Files -->
<Property Name="CopyXboxOneFilter" Value="$(CopyHTML5Filter);Engine/Build/XboxOne/..."/>

View File

@@ -31,7 +31,6 @@
+DeviceProfileNameAndTypes=Mac,Mac
+DeviceProfileNameAndTypes=MacNoEditor,MacNoEditor
+DeviceProfileNameAndTypes=MacServer,MacServer
+DeviceProfileNameAndTypes=WinRT,WinRT
+DeviceProfileNameAndTypes=Linux,Linux
+DeviceProfileNameAndTypes=LinuxNoEditor,LinuxNoEditor
+DeviceProfileNameAndTypes=LinuxServer,LinuxServer
@@ -434,10 +433,6 @@ BaseProfileName=Mac
DeviceType=MacServer
BaseProfileName=Mac
[WinRT DeviceProfile]
DeviceType=WinRT
BaseProfileName=
[Linux DeviceProfile]
DeviceType=Linux
BaseProfileName=

View File

@@ -115,8 +115,6 @@ static const FPlatformInfo PlatformInfoArray[] = {
BuildPlatformInfo(TEXT("AllDesktop"), TEXT("AllDesktop"), LOCTEXT("DesktopTargetPlatDisplay", "Desktop (Win+Mac+Linux)"), EPlatformType::Game, EPlatformFlags::None, FPlatformIconPaths(TEXT("Launcher/DesktopTarget/Platform_Desktop_24x"), TEXT("Launcher/DesktopTarget/Platform_Desktop_128x")), TEXT(""), TEXT(""), EPlatformSDKStatus::Unknown, TEXT(""), false/* see SProjectTargetPlatformSettings::Construct !!!! IsAvailableOnWindows || IsAvailableOnMac || IsAvailableOnLinux*/, TEXT(""), false, true),
BuildPlatformInfo(TEXT("TVOS"), TEXT("TVOS"), LOCTEXT("TVOSTargetPlatDisplay", "AppleTV"), EPlatformType::Game, EPlatformFlags::None, FPlatformIconPaths(TEXT("Launcher/TVOSTarget/Platform_TVOS_24x"), TEXT("Launcher/TVOSTarget/Platform_TVOS_128x")), TEXT(""), TEXT(""), EPlatformSDKStatus::Unknown, TEXT(""), IsAvailableOnWindows || IsAvailableOnMac, TEXT("TVOS"), false, true),
//BuildPlatformInfo(TEXT("WinRT"), TEXT("WinRT"), LOCTEXT("WinRT", "Windows RT"), EPlatformType::Game, EPlatformFlags::None, FPlatformIconPaths(TEXT("Launcher/WindowsTarget/Platform_WindowsNoEditor_24x"), TEXT("Launcher/WindowsTarget/Platform_WindowsNoEditor_128x")), TEXT("")),
};
} // anonymous namespace

View File

@@ -25,7 +25,7 @@
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Development|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Optimize>false</Optimize>
<OutputPath>..\..\..\..\Binaries\DotNET\AutomationScripts\AllDesktop\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>

View File

@@ -25,7 +25,7 @@
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Development|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Optimize>false</Optimize>
<OutputPath>..\..\..\..\Binaries\DotNET\AutomationScripts\Android\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>

View File

@@ -68,7 +68,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Development|AnyCPU' ">
<OutputPath>..\..\..\Binaries\DotNET\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<Optimize>false</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>

View File

@@ -25,7 +25,7 @@
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Development|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<Optimize>false</Optimize>
<OutputPath>..\..\..\..\Binaries\DotNET\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>

View File

@@ -17,7 +17,6 @@ using System.Reflection;
using System.Threading.Tasks;
using Tools.DotNETCommon;
using Tools.DotNETCommon.CaselessDictionary;
using Tools.DotNETCommon.HarvestEnvVars;
namespace AutomationTool
{

View File

@@ -144,7 +144,10 @@ namespace AutomationTool
HelpMessage += "Parameters: " + Environment.NewLine;
HelpMessage += Environment.NewLine;
HelpMessage += FormatParams(Params, 4, 24);
foreach(string Line in FormatParams(Params, 4, 24))
{
HelpMessage += Line + Environment.NewLine;
}
}
Log(HelpMessage);
@@ -163,7 +166,7 @@ namespace AutomationTool
/// <param name="Indent">Indent from the left hand side</param>
/// <param name="DefaultRightPadding">The minimum padding from the start of the param name to the start of the description (resizes with larger param names)</param>
/// <returns></returns>
static string FormatParams(List<string> Params, int Indent, int DefaultRightPadding)
public static IEnumerable<string> FormatParams(IEnumerable<string> Params, int Indent, int DefaultRightPadding)
{
Dictionary<string, string> ParamDict = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
@@ -215,8 +218,16 @@ namespace AutomationTool
}
}
// results string
string FormattedParams = string.Empty;
// Get the window width, using a default value if there's no console attached to this process.
int WindowWidth;
try
{
WindowWidth = Console.WindowWidth;
}
catch
{
WindowWidth = 240;
}
// Build the formatted params
foreach (var ParamName in ParamDict.Keys)
@@ -225,21 +236,16 @@ namespace AutomationTool
string ParamString = IndentString + ParamName.PadRight(RightPadding);
// Build the description line by line, adding the same amount of intending each time.
foreach (var DescriptionLine in WordWrap(ParamDict[ParamName], Console.WindowWidth - ParamString.Length))
foreach (var DescriptionLine in WordWrap(ParamDict[ParamName], WindowWidth - ParamString.Length))
{
// Formatting as following:
// <Indent>-param<Right Padding>Description<New line>
FormattedParams += ParamString + DescriptionLine + Environment.NewLine;
yield return ParamString + DescriptionLine;
// we replace the param string on subsequent lines with white space of the same length
ParamString = string.Empty.PadRight(IndentString.Length + RightPadding);
}
// new line after each param/desc combo
FormattedParams += Environment.NewLine;
}
return FormattedParams;
}
/// <summary>

View File

@@ -594,8 +594,6 @@ namespace AutomationTool
{
case UnrealTargetPlatform.Win32:
case UnrealTargetPlatform.Win64:
case UnrealTargetPlatform.WinRT:
case UnrealTargetPlatform.WinRT_ARM:
case UnrealTargetPlatform.XboxOne:
return ".exe";
case UnrealTargetPlatform.PS4:

View File

@@ -1566,9 +1566,7 @@ namespace AutomationTool
var UBTFiles = new List<string>(new string[]
{
"UnrealBuildTool.exe",
"UnrealBuildTool.exe.config",
"EnvVarsToXML.exe",
"EnvVarsToXML.exe.config"
"UnrealBuildTool.exe.config"
});
foreach (var UBTFile in UBTFiles)

View File

@@ -56,8 +56,8 @@ namespace AutomationTool
[Help("ShowNotifications", "Show notifications that will be sent for each node in the output")]
[Help("Trigger=<Name>[+<Name>...]", "Activates the given triggers, including all the nodes behind them in the graph")]
[Help("SkipTriggers", "Activate all triggers")]
[Help("TicketSignature=<Name>", "Specifies the signature identifying the current job, to be written to tickets for nodes that require them. Tickets are ignored if this parameter is not specified.")]
[Help("SkipTargetsWithoutTickets", "Excludes targets which we can't acquire tickets for, rather than failing")]
[Help("TokenSignature=<Name>", "Specifies the signature identifying the current job, to be written to tokens for nodes that require them. Tokens are ignored if this parameter is not specified.")]
[Help("SkipTargetsWithoutTokens", "Excludes targets which we can't acquire tokens for, rather than failing")]
[Help("Preprocess=<FileName>", "Writes the preprocessed graph to the given file")]
[Help("Export=<FileName>", "Exports a JSON file containing the preprocessed build graph, for use as part of a build system")]
[Help("PublicTasksOnly", "Only include built-in tasks in the schema, excluding any other UAT modules")]
@@ -80,12 +80,6 @@ namespace AutomationTool
}
string TargetNames = ParseParamValue("Target", null);
if(TargetNames == null)
{
LogError("Missing -Target= parameter for BuildGraph");
return ExitCode.Error_Unknown;
}
string SchemaFileName = ParseParamValue("Schema", null);
string ExportFileName = ParseParamValue("Export", null);
string PreprocessedFileName = ParseParamValue("Preprocess", null);
@@ -93,15 +87,15 @@ namespace AutomationTool
string SingleNodeName = ParseParamValue("SingleNode", null);
string[] TriggerNames = ParseParamValue("Trigger", "").Split(new char[]{ '+', ';' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
bool bSkipTriggers = ParseParam("SkipTriggers");
string TicketSignature = ParseParamValue("TicketSignature", null);
bool bSkipTargetsWithoutTickets = ParseParam("SkipTargetsWithoutTickets");
string TokenSignature = ParseParamValue("TokenSignature", null);
bool bSkipTargetsWithoutTokens = ParseParam("SkipTargetsWithoutTokens");
bool bClearHistory = ParseParam("Clean") || ParseParam("ClearHistory");
bool bListOnly = ParseParam("ListOnly");
bool bWriteToSharedStorage = ParseParam("WriteToSharedStorage") || CommandUtils.IsBuildMachine;
bool bPublicTasksOnly = ParseParam("PublicTasksOnly");
string ReportName = ParseParamValue("ReportName", null);
GraphPrintOptions PrintOptions = 0;
GraphPrintOptions PrintOptions = GraphPrintOptions.ShowCommandLineOptions;
if(ParseParam("ShowDeps"))
{
PrintOptions |= GraphPrintOptions.ShowDependencies;
@@ -121,14 +115,8 @@ namespace AutomationTool
}
}
// Read any environment variables
Dictionary<string, string> DefaultProperties = new Dictionary<string,string>(StringComparer.InvariantCultureIgnoreCase);
foreach(DictionaryEntry Entry in Environment.GetEnvironmentVariables())
{
DefaultProperties[Entry.Key.ToString()] = Entry.Value.ToString();
}
// Set up the standard properties which build scripts might need
Dictionary<string, string> DefaultProperties = new Dictionary<string,string>(StringComparer.InvariantCultureIgnoreCase);
DefaultProperties["Branch"] = P4Enabled ? P4Env.BuildRootP4 : "Unknown";
DefaultProperties["EscapedBranch"] = P4Enabled ? P4Env.BuildRootEscaped : "Unknown";
DefaultProperties["Change"] = P4Enabled ? P4Env.Changelist.ToString() : "0";
@@ -145,7 +133,8 @@ namespace AutomationTool
DefaultProperties["EnginePatchVersion"] = Version.PatchVersion.ToString();
}
// Add any additional custom parameters from the command line (of the form -Set:X=Y)
// Add any additional custom arguments from the command line (of the form -Set:X=Y)
Dictionary<string, string> Arguments = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
foreach (string Param in Params)
{
const string Prefix = "set:";
@@ -154,7 +143,7 @@ namespace AutomationTool
int EqualsIdx = Param.IndexOf('=');
if(EqualsIdx >= 0)
{
DefaultProperties[Param.Substring(Prefix.Length, EqualsIdx - Prefix.Length)] = Param.Substring(EqualsIdx + 1);
Arguments[Param.Substring(Prefix.Length, EqualsIdx - Prefix.Length)] = Param.Substring(EqualsIdx + 1);
}
else
{
@@ -179,7 +168,7 @@ namespace AutomationTool
// Read the script from disk
Graph Graph;
if(!ScriptReader.TryRead(new FileReference(ScriptFileName), DefaultProperties, Schema, out Graph))
if(!ScriptReader.TryRead(new FileReference(ScriptFileName), Arguments, DefaultProperties, Schema, out Graph))
{
return ExitCode.Error_Unknown;
}
@@ -198,63 +187,75 @@ namespace AutomationTool
// Convert the supplied target references into nodes
HashSet<Node> TargetNodes = new HashSet<Node>();
foreach(string TargetName in TargetNames.Split(new char[]{ '+', ';' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()))
if(TargetNames == null)
{
Node[] Nodes;
if(!Graph.TryResolveReference(TargetName, out Nodes))
{
LogError("Target '{0}' is not in graph", TargetName);
return ExitCode.Error_Unknown;
}
TargetNodes.UnionWith(Nodes);
}
// Try to acquire tickets for all the target nodes we want to build
if(TicketSignature != null)
{
// Find all the lock files
HashSet<FileReference> RequiredTickets = new HashSet<FileReference>(TargetNodes.SelectMany(x => x.RequiredTickets));
// Try to create all the lock files
List<FileReference> CreatedTickets = new List<FileReference>();
if(!bListOnly)
{
CreatedTickets.AddRange(RequiredTickets.Where(x => WriteTicket(x, TicketSignature)));
LogError("Missing -Target= parameter for BuildGraph");
return ExitCode.Error_Unknown;
}
TargetNodes.UnionWith(Graph.Agents.SelectMany(x => x.Nodes));
}
else
{
foreach(string TargetName in TargetNames.Split(new char[]{ '+', ';' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()))
{
Node[] Nodes;
if(!Graph.TryResolveReference(TargetName, out Nodes))
{
LogError("Target '{0}' is not in graph", TargetName);
return ExitCode.Error_Unknown;
}
TargetNodes.UnionWith(Nodes);
}
}
// Try to acquire tokens for all the target nodes we want to build
if(TokenSignature != null)
{
// Find all the lock files
HashSet<FileReference> RequiredTokens = new HashSet<FileReference>(TargetNodes.SelectMany(x => x.RequiredTokens));
// Try to create all the lock files
List<FileReference> CreatedTokens = new List<FileReference>();
if(!bListOnly)
{
CreatedTokens.AddRange(RequiredTokens.Where(x => WriteTokenFile(x, TokenSignature)));
}
// Find all the tickets that we don't have
Dictionary<FileReference, string> MissingTickets = new Dictionary<FileReference, string>();
foreach(FileReference RequiredTicket in RequiredTickets)
// Find all the tokens that we don't have
Dictionary<FileReference, string> MissingTokens = new Dictionary<FileReference, string>();
foreach(FileReference RequiredToken in RequiredTokens)
{
string CurrentOwner = ReadTicket(RequiredTicket);
if(CurrentOwner != null && CurrentOwner != TicketSignature)
string CurrentOwner = ReadTokenFile(RequiredToken);
if(CurrentOwner != null && CurrentOwner != TokenSignature)
{
MissingTickets.Add(RequiredTicket, CurrentOwner);
MissingTokens.Add(RequiredToken, CurrentOwner);
}
}
// If we want to skip all the nodes with missing locks, adjust the target nodes to account for it
if(MissingTickets.Count > 0)
if(MissingTokens.Count > 0)
{
if(bSkipTargetsWithoutTickets)
if(bSkipTargetsWithoutTokens)
{
foreach(KeyValuePair<FileReference, string> Pair in MissingTickets)
foreach(KeyValuePair<FileReference, string> Pair in MissingTokens)
{
List<Node> SkipNodes = TargetNodes.Where(x => x.RequiredTickets.Contains(Pair.Key)).ToList();
List<Node> SkipNodes = TargetNodes.Where(x => x.RequiredTokens.Contains(Pair.Key)).ToList();
Log("Skipping {0} due to previous build: {1}", String.Join(", ", SkipNodes), Pair.Value);
TargetNodes.ExceptWith(SkipNodes);
}
}
else
{
foreach(KeyValuePair<FileReference, string> Pair in MissingTickets)
foreach(KeyValuePair<FileReference, string> Pair in MissingTokens)
{
List<Node> SkipNodes = TargetNodes.Where(x => x.RequiredTickets.Contains(Pair.Key)).ToList();
List<Node> SkipNodes = TargetNodes.Where(x => x.RequiredTokens.Contains(Pair.Key)).ToList();
LogError("Cannot run {0} due to previous build: {1}", String.Join(", ", SkipNodes), Pair.Value);
}
foreach(FileReference CreatedTicket in CreatedTickets)
foreach(FileReference CreatedToken in CreatedTokens)
{
CreatedTicket.Delete();
CreatedToken.Delete();
}
return ExitCode.Error_Unknown;
}
@@ -307,7 +308,15 @@ namespace AutomationTool
return ExitCode.Error_Unknown;
}
// Print out all the diagnostic messages which still apply, unless we're running a step as part of a build system.
// If we just want to show the contents of the graph, do so and exit.
if(bListOnly)
{
HashSet<Node> CompletedNodes = FindCompletedNodes(Graph, Storage);
Graph.Print(CompletedNodes, PrintOptions);
return ExitCode.Success;
}
// Print out all the diagnostic messages which still apply, unless we're running a step as part of a build system or just listing the contents of the file.
if(SingleNode == null)
{
IEnumerable<GraphDiagnostic> Diagnostics = Graph.Diagnostics.Where(x => x.EnclosingTrigger == null || Triggers.Contains(x.EnclosingTrigger));
@@ -329,12 +338,7 @@ namespace AutomationTool
}
// Execute the command
if(bListOnly)
{
HashSet<Node> CompletedNodes = FindCompletedNodes(Graph, Storage);
Graph.Print(CompletedNodes, PrintOptions);
}
else if(ExportFileName != null)
if(ExportFileName != null)
{
HashSet<Node> CompletedNodes = FindCompletedNodes(Graph, Storage);
Graph.Print(CompletedNodes, PrintOptions);
@@ -394,19 +398,19 @@ namespace AutomationTool
}
/// <summary>
/// Reads the contents of the given ticket
/// Reads the contents of the given token
/// </summary>
/// <returns>Contents of the ticket, or null if it does not exist</returns>
public string ReadTicket(FileReference Location)
/// <returns>Contents of the token, or null if it does not exist</returns>
public string ReadTokenFile(FileReference Location)
{
return Location.Exists()? File.ReadAllText(Location.FullName) : null;
}
/// <summary>
/// Attempts to write an owner to a ticket file transactionally
/// Attempts to write an owner to a token file transactionally
/// </summary>
/// <returns>True if the lock was acquired, false otherwise</returns>
public bool WriteTicket(FileReference Location, string Signature)
public bool WriteTokenFile(FileReference Location, string Signature)
{
// Check it doesn't already exist
if(Location.Exists())

View File

@@ -18,15 +18,20 @@ namespace AutomationTool
/// </summary>
enum GraphPrintOptions
{
/// <summary>
/// Includes a list of the graph options
/// </summary>
ShowCommandLineOptions = 0x1,
/// <summary>
/// Includes the list of dependencies for each node
/// </summary>
ShowDependencies = 0x1,
ShowDependencies = 0x2,
/// <summary>
/// Includes the list of notifiers for each node
/// </summary>
ShowNotifications = 0x2,
ShowNotifications = 0x4,
}
/// <summary>
@@ -61,11 +66,57 @@ namespace AutomationTool
public ManualTrigger EnclosingTrigger;
}
/// <summary>
/// Represents a graph option. These are expanded during preprocessing, but are retained in order to display help messages.
/// </summary>
class GraphOption
{
/// <summary>
/// Name of this option
/// </summary>
public string Name;
/// <summary>
/// Description for this option
/// </summary>
public string Description;
/// <summary>
/// Default value for this option
/// </summary>
public string DefaultValue;
/// <summary>
/// Constructor
/// </summary>
/// <param name="Name">The name of this option</param>
public GraphOption(string Name, string Description, string DefaultValue)
{
this.Name = Name;
this.Description = Description;
this.DefaultValue = DefaultValue;
}
/// <summary>
/// Returns a name of this option for debugging
/// </summary>
/// <returns>Name of the option</returns>
public override string ToString()
{
return Name;
}
}
/// <summary>
/// Definition of a graph.
/// </summary>
class Graph
{
/// <summary>
/// List of options, in the order they were specified
/// </summary>
public List<GraphOption> Options = new List<GraphOption>();
/// <summary>
/// List of agents containing nodes to execute
/// </summary>
@@ -499,9 +550,38 @@ namespace AutomationTool
/// Print the contents of the graph
/// </summary>
/// <param name="NodeToState">Mapping of node to its current state</param>
/// <param name="Options">Options for how to print the graph</param>
public void Print(HashSet<Node> CompletedNodes, GraphPrintOptions Options)
/// <param name="PrintOptions">Options for how to print the graph</param>
public void Print(HashSet<Node> CompletedNodes, GraphPrintOptions PrintOptions)
{
// Print the options
if((PrintOptions & GraphPrintOptions.ShowCommandLineOptions) != 0)
{
// Get the list of messages
List<string> Messages = new List<string>();
foreach(GraphOption Option in Options)
{
StringBuilder Message = new StringBuilder();
Message.AppendFormat("-set:{0}=... {1}", Option.Name, Option.Description);
if(!String.IsNullOrEmpty(Option.DefaultValue))
{
Message.AppendFormat(" (Default: {0})", Option.DefaultValue);
}
Messages.Add(Message.ToString());
}
// Format them to the log
if(Messages.Count > 0)
{
CommandUtils.Log("");
CommandUtils.Log("Options:");
CommandUtils.Log("");
foreach(string Line in CommandUtils.FormatParams(Messages, 4, 24))
{
CommandUtils.Log(Line);
}
}
}
// Get a list of all the triggers, including the null global one
List<ManualTrigger> AllTriggers = new List<ManualTrigger>();
AllTriggers.Add(null);
@@ -531,7 +611,7 @@ namespace AutomationTool
// Print the trigger name
CommandUtils.Log(" Trigger: {0}", (Trigger == null)? "None" : Trigger.QualifiedName);
if(Trigger != null && Options.HasFlag(GraphPrintOptions.ShowNotifications))
if(Trigger != null && PrintOptions.HasFlag(GraphPrintOptions.ShowNotifications))
{
foreach(string User in Trigger.NotifyUsers)
{
@@ -549,7 +629,7 @@ namespace AutomationTool
foreach(Node Node in Nodes)
{
CommandUtils.Log(" Node: {0}{1}", Node.Name, CompletedNodes.Contains(Node)? " (completed)" : "");
if(Options.HasFlag(GraphPrintOptions.ShowDependencies))
if(PrintOptions.HasFlag(GraphPrintOptions.ShowDependencies))
{
HashSet<Node> InputDependencies = new HashSet<Node>(Node.GetDirectInputDependencies());
foreach(Node InputDependency in InputDependencies)
@@ -562,7 +642,7 @@ namespace AutomationTool
CommandUtils.Log(" after> {0}", OrderDependency.Name);
}
}
if(Options.HasFlag(GraphPrintOptions.ShowNotifications))
if(PrintOptions.HasFlag(GraphPrintOptions.ShowNotifications))
{
string Label = Node.bNotifyOnWarnings? "warnings" : "errors";
foreach(string User in Node.NotifyUsers)

View File

@@ -81,9 +81,9 @@ namespace AutomationTool
public ManualTrigger ControllingTrigger;
/// <summary>
/// Tickets which must be acquired for this node to run
/// Tokens which must be acquired for this node to run
/// </summary>
public FileReference[] RequiredTickets;
public FileReference[] RequiredTokens;
/// <summary>
/// List of tasks to execute
@@ -114,8 +114,8 @@ namespace AutomationTool
/// <param name="InInputDependencies">Nodes which this node is dependent on for its inputs</param>
/// <param name="InOrderDependencies">Nodes which this node needs to run after. Should include all input dependencies.</param>
/// <param name="InControllingTrigger">The trigger which this node is behind</param>
/// <param name="InTicket">Optional ticket which must be required for this node to run</param>
public Node(string InName, NodeOutput[] InInputs, string[] InOutputNames, Node[] InInputDependencies, Node[] InOrderDependencies, ManualTrigger InControllingTrigger, FileReference[] InRequiredTickets)
/// <param name="InRequiredTokens">Optional tokens which must be required for this node to run</param>
public Node(string InName, NodeOutput[] InInputs, string[] InOutputNames, Node[] InInputDependencies, Node[] InOrderDependencies, ManualTrigger InControllingTrigger, FileReference[] InRequiredTokens)
{
Name = InName;
Inputs = InInputs;
@@ -128,7 +128,7 @@ namespace AutomationTool
InputDependencies = InInputDependencies;
OrderDependencies = InOrderDependencies;
ControllingTrigger = InControllingTrigger;
RequiredTickets = InRequiredTickets;
RequiredTokens = InRequiredTokens;
}
/// <summary>

View File

@@ -119,6 +119,8 @@ namespace AutomationTool
Badge,
Notify,
Include,
Option,
EnvVar,
Property,
Warning,
Error,
@@ -164,10 +166,15 @@ namespace AutomationTool
/// </summary>
public readonly XmlSchema CompiledSchema;
/// <summary>
/// Characters which are not permitted in names.
/// </summary>
public const string IllegalNameCharacters = "^<>:\"/\\|?*";
/// <summary>
/// Pattern which matches any name; alphanumeric characters, with single embedded spaces.
/// </summary>
const string NamePattern = @"[A-Za-z0-9_]+( [A-Za-z0-9_]+)*";
const string NamePattern = "[^ " + IllegalNameCharacters +"]+( [^ " + IllegalNameCharacters + "]+)*";
/// <summary>
/// Pattern which matches a list of names, separated by semicolons.
@@ -281,6 +288,8 @@ namespace AutomationTool
NewSchema.Items.Add(CreateBadgeType());
NewSchema.Items.Add(CreateNotifyType());
NewSchema.Items.Add(CreateIncludeType());
NewSchema.Items.Add(CreateOptionType());
NewSchema.Items.Add(CreateEnvVarType());
NewSchema.Items.Add(CreatePropertyType());
NewSchema.Items.Add(CreateDiagnosticType(ScriptSchemaStandardType.Warning));
NewSchema.Items.Add(CreateDiagnosticType(ScriptSchemaStandardType.Error));
@@ -395,6 +404,8 @@ namespace AutomationTool
GraphChoice.MinOccurs = 0;
GraphChoice.MaxOccursString = "unbounded";
GraphChoice.Items.Add(CreateSchemaElement("Include", ScriptSchemaStandardType.Include));
GraphChoice.Items.Add(CreateSchemaElement("Option", ScriptSchemaStandardType.Option));
GraphChoice.Items.Add(CreateSchemaElement("EnvVar", ScriptSchemaStandardType.EnvVar));
GraphChoice.Items.Add(CreateSchemaElement("Property", ScriptSchemaStandardType.Property));
GraphChoice.Items.Add(CreateSchemaElement("Agent", ScriptSchemaStandardType.Agent));
GraphChoice.Items.Add(CreateSchemaElement("Trigger", ScriptSchemaStandardType.Trigger));
@@ -405,7 +416,7 @@ namespace AutomationTool
GraphChoice.Items.Add(CreateSchemaElement("Warning", ScriptSchemaStandardType.Warning));
GraphChoice.Items.Add(CreateSchemaElement("Error", ScriptSchemaStandardType.Error));
GraphChoice.Items.Add(CreateDoElement(ScriptSchemaStandardType.Graph));
GraphChoice.Items.Add(CreateChooseElement(ScriptSchemaStandardType.Graph));
GraphChoice.Items.Add(CreateSwitchElement(ScriptSchemaStandardType.Graph));
GraphChoice.Items.Add(CreateForEachElement(ScriptSchemaStandardType.Graph));
XmlSchemaComplexType GraphType = new XmlSchemaComplexType();
GraphType.Name = GetTypeName(ScriptSchemaStandardType.Graph);
@@ -443,12 +454,13 @@ namespace AutomationTool
TriggerChoice.MinOccurs = 0;
TriggerChoice.MaxOccursString = "unbounded";
TriggerChoice.Items.Add(CreateSchemaElement("Property", ScriptSchemaStandardType.Property));
TriggerChoice.Items.Add(CreateSchemaElement("EnvVar", ScriptSchemaStandardType.EnvVar));
TriggerChoice.Items.Add(CreateSchemaElement("Agent", ScriptSchemaStandardType.Agent));
TriggerChoice.Items.Add(CreateSchemaElement("Aggregate", ScriptSchemaStandardType.Aggregate));
TriggerChoice.Items.Add(CreateSchemaElement("Warning", ScriptSchemaStandardType.Warning));
TriggerChoice.Items.Add(CreateSchemaElement("Error", ScriptSchemaStandardType.Error));
TriggerChoice.Items.Add(CreateDoElement(ScriptSchemaStandardType.TriggerBody));
TriggerChoice.Items.Add(CreateChooseElement(ScriptSchemaStandardType.TriggerBody));
TriggerChoice.Items.Add(CreateSwitchElement(ScriptSchemaStandardType.TriggerBody));
TriggerChoice.Items.Add(CreateForEachElement(ScriptSchemaStandardType.TriggerBody));
XmlSchemaComplexType TriggerType = new XmlSchemaComplexType();
@@ -488,11 +500,12 @@ namespace AutomationTool
AgentChoice.MinOccurs = 0;
AgentChoice.MaxOccursString = "unbounded";
AgentChoice.Items.Add(CreateSchemaElement("Property", ScriptSchemaStandardType.Property));
AgentChoice.Items.Add(CreateSchemaElement("EnvVar", ScriptSchemaStandardType.EnvVar));
AgentChoice.Items.Add(CreateSchemaElement("Node", ScriptSchemaStandardType.Node));
AgentChoice.Items.Add(CreateSchemaElement("Warning", ScriptSchemaStandardType.Warning));
AgentChoice.Items.Add(CreateSchemaElement("Error", ScriptSchemaStandardType.Error));
AgentChoice.Items.Add(CreateDoElement(ScriptSchemaStandardType.AgentBody));
AgentChoice.Items.Add(CreateChooseElement(ScriptSchemaStandardType.AgentBody));
AgentChoice.Items.Add(CreateSwitchElement(ScriptSchemaStandardType.AgentBody));
AgentChoice.Items.Add(CreateForEachElement(ScriptSchemaStandardType.AgentBody));
XmlSchemaComplexType AgentType = new XmlSchemaComplexType();
@@ -513,7 +526,7 @@ namespace AutomationTool
Extension.Attributes.Add(CreateSchemaAttribute("Requires", ScriptSchemaStandardType.NameOrTagList, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("Produces", ScriptSchemaStandardType.TagList, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("After", ScriptSchemaStandardType.NameOrTagList, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("Ticket", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("Token", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
Extension.Attributes.Add(CreateSchemaAttribute("NotifyOnWarnings", ScriptSchemaStandardType.Boolean, XmlSchemaUse.Optional));
@@ -536,10 +549,11 @@ namespace AutomationTool
NodeChoice.MinOccurs = 0;
NodeChoice.MaxOccursString = "unbounded";
NodeChoice.Items.Add(CreateSchemaElement("Property", ScriptSchemaStandardType.Property));
NodeChoice.Items.Add(CreateSchemaElement("EnvVar", ScriptSchemaStandardType.EnvVar));
NodeChoice.Items.Add(CreateSchemaElement("Warning", ScriptSchemaStandardType.Warning));
NodeChoice.Items.Add(CreateSchemaElement("Error", ScriptSchemaStandardType.Error));
NodeChoice.Items.Add(CreateDoElement(ScriptSchemaStandardType.NodeBody));
NodeChoice.Items.Add(CreateChooseElement(ScriptSchemaStandardType.NodeBody));
NodeChoice.Items.Add(CreateSwitchElement(ScriptSchemaStandardType.NodeBody));
NodeChoice.Items.Add(CreateForEachElement(ScriptSchemaStandardType.NodeBody));
foreach (KeyValuePair<string, XmlSchemaComplexType> Pair in TaskNameToType.OrderBy(x => x.Key))
{
@@ -628,6 +642,35 @@ namespace AutomationTool
return PropertyType;
}
/// <summary>
/// Creates the schema type representing a parameter type
/// </summary>
/// <returns>Type definition for a parameter</returns>
static XmlSchemaType CreateOptionType()
{
XmlSchemaComplexType OptionType = new XmlSchemaComplexType();
OptionType.Name = GetTypeName(ScriptSchemaStandardType.Option);
OptionType.Attributes.Add(CreateSchemaAttribute("Name", ScriptSchemaStandardType.Name, XmlSchemaUse.Required));
OptionType.Attributes.Add(CreateSchemaAttribute("Restrict", StringTypeName, XmlSchemaUse.Optional));
OptionType.Attributes.Add(CreateSchemaAttribute("DefaultValue", StringTypeName, XmlSchemaUse.Required));
OptionType.Attributes.Add(CreateSchemaAttribute("Description", StringTypeName, XmlSchemaUse.Required));
OptionType.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
return OptionType;
}
/// <summary>
/// Creates the schema type representing a environment variable type
/// </summary>
/// <returns>Type definition for an environment variable property</returns>
static XmlSchemaType CreateEnvVarType()
{
XmlSchemaComplexType EnvVarType = new XmlSchemaComplexType();
EnvVarType.Name = GetTypeName(ScriptSchemaStandardType.EnvVar);
EnvVarType.Attributes.Add(CreateSchemaAttribute("Name", ScriptSchemaStandardType.Name, XmlSchemaUse.Required));
EnvVarType.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
return EnvVarType;
}
/// <summary>
/// Creates the schema type representing a property type
/// </summary>
@@ -637,9 +680,7 @@ namespace AutomationTool
XmlSchemaComplexType PropertyType = new XmlSchemaComplexType();
PropertyType.Name = GetTypeName(ScriptSchemaStandardType.Property);
PropertyType.Attributes.Add(CreateSchemaAttribute("Name", ScriptSchemaStandardType.Name, XmlSchemaUse.Required));
PropertyType.Attributes.Add(CreateSchemaAttribute("Value", StringTypeName, XmlSchemaUse.Optional));
PropertyType.Attributes.Add(CreateSchemaAttribute("Restrict", StringTypeName, XmlSchemaUse.Optional));
PropertyType.Attributes.Add(CreateSchemaAttribute("Default", StringTypeName, XmlSchemaUse.Optional));
PropertyType.Attributes.Add(CreateSchemaAttribute("Value", StringTypeName, XmlSchemaUse.Required));
PropertyType.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Optional));
return PropertyType;
}
@@ -681,48 +722,48 @@ namespace AutomationTool
}
/// <summary>
/// Creates an element representing a conditional "Choose" block, which recursively contains another type
/// Creates an element representing a conditional "Switch" block, which recursively contains another type
/// </summary>
/// <param name="InnerType">The base type for the do block to contain</param>
/// <returns>New schema element for the block</returns>
static XmlSchemaElement CreateChooseElement(ScriptSchemaStandardType InnerType)
static XmlSchemaElement CreateSwitchElement(ScriptSchemaStandardType InnerType)
{
// Create the "Option" element
XmlSchemaComplexContentExtension OptionExtension = new XmlSchemaComplexContentExtension();
OptionExtension.BaseTypeName = GetQualifiedTypeName(InnerType);
OptionExtension.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Required));
XmlSchemaComplexContentExtension CaseExtension = new XmlSchemaComplexContentExtension();
CaseExtension.BaseTypeName = GetQualifiedTypeName(InnerType);
CaseExtension.Attributes.Add(CreateSchemaAttribute("If", ScriptSchemaStandardType.BalancedString, XmlSchemaUse.Required));
XmlSchemaComplexContent OptionContentModel = new XmlSchemaComplexContent();
OptionContentModel.Content = OptionExtension;
XmlSchemaComplexContent CaseContentModel = new XmlSchemaComplexContent();
CaseContentModel.Content = CaseExtension;
XmlSchemaComplexType OptionSchemaType = new XmlSchemaComplexType();
OptionSchemaType.ContentModel = OptionContentModel;
XmlSchemaComplexType CaseSchemaType = new XmlSchemaComplexType();
CaseSchemaType.ContentModel = CaseContentModel;
XmlSchemaElement OptionElement = new XmlSchemaElement();
OptionElement.Name = "Option";
OptionElement.SchemaType = OptionSchemaType;
OptionElement.MinOccurs = 0;
OptionElement.MaxOccursString = "unbounded";
XmlSchemaElement CaseElement = new XmlSchemaElement();
CaseElement.Name = "Case";
CaseElement.SchemaType = CaseSchemaType;
CaseElement.MinOccurs = 0;
CaseElement.MaxOccursString = "unbounded";
// Create the "Otherwise" element
XmlSchemaElement OtherwiseElement = new XmlSchemaElement();
OtherwiseElement.Name = "Otherwise";
OtherwiseElement.Name = "Default";
OtherwiseElement.SchemaTypeName = GetQualifiedTypeName(InnerType);
OtherwiseElement.MinOccurs = 0;
OtherwiseElement.MaxOccurs = 1;
// Create the "Choose" element
XmlSchemaSequence ChooseSequence = new XmlSchemaSequence();
ChooseSequence.Items.Add(OptionElement);
ChooseSequence.Items.Add(OtherwiseElement);
// Create the "Switch" element
XmlSchemaSequence SwitchSequence = new XmlSchemaSequence();
SwitchSequence.Items.Add(CaseElement);
SwitchSequence.Items.Add(OtherwiseElement);
XmlSchemaComplexType ChooseSchemaType = new XmlSchemaComplexType();
ChooseSchemaType.Particle = ChooseSequence;
XmlSchemaComplexType SwitchSchemaType = new XmlSchemaComplexType();
SwitchSchemaType.Particle = SwitchSequence;
XmlSchemaElement ChooseElement = new XmlSchemaElement();
ChooseElement.Name = "Choose";
ChooseElement.SchemaType = ChooseSchemaType;
return ChooseElement;
XmlSchemaElement SwitchElement = new XmlSchemaElement();
SwitchElement.Name = "Switch";
SwitchElement.SchemaType = SwitchSchemaType;
return SwitchElement;
}
/// <summary>

View File

@@ -10,6 +10,7 @@ using AutomationTool;
using System.Reflection;
using System.Diagnostics;
using System.Xml.Schema;
using System.Text.RegularExpressions;
namespace AutomationTool
{
@@ -188,27 +189,30 @@ namespace AutomationTool
/// <summary>
/// Private constructor. Use ScriptReader.TryRead() to read a script file.
/// </summary>
/// <param name="Properties">Predefined property name to value mapping</param>
/// <param name="InSchema">Schema for the script</param>
private ScriptReader(IDictionary<string, string> Properties, ScriptSchema InSchema)
/// <param name="DefaultProperties">Default properties available to the script</param>
/// <param name="Schema">Schema for the script</param>
private ScriptReader(IDictionary<string, string> DefaultProperties, ScriptSchema Schema)
{
this.Schema = Schema;
EnterScope();
foreach(KeyValuePair<string, string> Pair in Properties)
foreach(KeyValuePair<string, string> Pair in DefaultProperties)
{
ScopedProperties[ScopedProperties.Count - 1].Add(Pair.Key, Pair.Value);
}
Schema = InSchema;
}
/// <summary>
/// Try to read a script file from the given file.
/// </summary>
/// <param name="File">File to read from</param>
/// <param name="DefaultProperties">Manually defined properties to parse the graph with</param>
/// <param name="InSchema">Schema for the script</param>
/// <param name="Arguments">Arguments passed in to the graph on the command line</param>
/// <param name="DefaultProperties">Default properties available to the script</param>
/// <param name="Schema">Schema for the script</param>
/// <param name="Graph">If successful, the graph constructed from the given script</param>
/// <returns>True if the graph was read, false if there were errors</returns>
public static bool TryRead(FileReference File, IDictionary<string, string> DefaultProperties, ScriptSchema Schema, out Graph Graph)
public static bool TryRead(FileReference File, Dictionary<string, string> Arguments, Dictionary<string, string> DefaultProperties, ScriptSchema Schema, out Graph Graph)
{
// Check the file exists before doing anything.
if (!File.Exists())
@@ -220,23 +224,36 @@ namespace AutomationTool
// Read the file and build the graph
ScriptReader Reader = new ScriptReader(DefaultProperties, Schema);
if (Reader.TryRead(File) && Reader.NumErrors == 0)
{
Graph = Reader.Graph;
return true;
}
else
if (!Reader.TryRead(File, Arguments) || Reader.NumErrors > 0)
{
Graph = null;
return false;
}
// Make sure all the arguments were valid
bool bInvalidArgument = false;
foreach(string InvalidArgumentName in Arguments.Keys.Except(Reader.Graph.Options.Select(x => x.Name), StringComparer.InvariantCultureIgnoreCase))
{
CommandUtils.LogWarning("Unknown argument '{0}' for '{1}'", InvalidArgumentName, File.FullName);
bInvalidArgument = true;
}
if(bInvalidArgument)
{
Graph = null;
return false;
}
// Return the constructed graph
Graph = Reader.Graph;
return true;
}
/// <summary>
/// Read the script from the given file
/// </summary>
/// <param name="File">File to read from</param>
bool TryRead(FileReference File)
/// <param name="Arguments">Arguments passed in to the graph on the command line</param>
bool TryRead(FileReference File, Dictionary<string, string> Arguments)
{
// Read the document and validate it against the schema
ScriptDocument Document;
@@ -247,7 +264,7 @@ namespace AutomationTool
}
// Read the root BuildGraph element
ReadGraphBody(Document.DocumentElement, File.Directory);
ReadGraphBody(Document.DocumentElement, File.Directory, Arguments);
return true;
}
@@ -256,18 +273,25 @@ namespace AutomationTool
/// </summary>
/// <param name="Element">The parent element to read from</param>
/// <param name="BaseDirectory">Base directory to resolve includes against</param>
void ReadGraphBody(XmlElement Element, DirectoryReference BaseDirectory)
/// <param name="Arguments">Arguments passed in to the graph on the command line</param>
void ReadGraphBody(XmlElement Element, DirectoryReference BaseDirectory, Dictionary<string, string> Arguments)
{
foreach (ScriptElement ChildElement in Element.ChildNodes.OfType<ScriptElement>())
{
switch (ChildElement.Name)
{
case "Include":
ReadInclude(ChildElement, BaseDirectory);
ReadInclude(ChildElement, BaseDirectory, Arguments);
break;
case "Option":
ReadOption(ChildElement, Arguments);
break;
case "Property":
ReadProperty(ChildElement);
break;
case "EnvVar":
ReadEnvVar(ChildElement);
break;
case "Agent":
ReadAgent(ChildElement, null);
break;
@@ -293,13 +317,13 @@ namespace AutomationTool
ReadDiagnostic(ChildElement, LogEventType.Error, null, null, null);
break;
case "Do":
ReadBlock(ChildElement, x => ReadGraphBody(x, BaseDirectory));
ReadBlock(ChildElement, x => ReadGraphBody(x, BaseDirectory, Arguments));
break;
case "Choose":
ReadChoice(ChildElement, x => ReadGraphBody(x, BaseDirectory));
case "Switch":
ReadSwitch(ChildElement, x => ReadGraphBody(x, BaseDirectory, Arguments));
break;
case "ForEach":
ReadForEach(ChildElement, x => ReadGraphBody(x, BaseDirectory));
ReadForEach(ChildElement, x => ReadGraphBody(x, BaseDirectory, Arguments));
break;
default:
LogError(ChildElement, "Invalid element '{0}'", ChildElement.Name);
@@ -344,6 +368,61 @@ namespace AutomationTool
ShadowProperties.RemoveAt(ShadowProperties.Count - 1);
}
/// <summary>
/// Sets a property value in the current scope
/// </summary>
/// <param name="Element">Element containing the property assignment. Used for error messages if the property is shadowed in another scope.</param>
/// <param name="Name">Name of the property</param>
/// <param name="Value">Value for the property</param>
void SetPropertyValue(ScriptElement Element, string Name, string Value)
{
// Find the scope containing this property, defaulting to the current scope
int ScopeIdx = 0;
while(ScopeIdx < ScopedProperties.Count - 1 && !ScopedProperties[ScopeIdx].ContainsKey(Name))
{
ScopeIdx++;
}
// Make sure this property name was not already used in a child scope; it likely indicates an error.
if(ShadowProperties[ScopeIdx].Contains(Name))
{
LogError(Element, "Property '{0}' was already used in a child scope. Move this definition before the previous usage if they are intended to share scope, or use a different name.", Name);
}
else
{
// Make sure it's added to the shadow property list for every parent scope
for(int Idx = 0; Idx < ScopeIdx; Idx++)
{
ShadowProperties[Idx].Add(Name);
}
ScopedProperties[ScopeIdx][Name] = Value;
}
}
/// <summary>
/// Tries to get the value of a property
/// </summary>
/// <param name="Name">Name of the property</param>
/// <param name="Value">On success, contains the value of the property. Set to null otherwise.</param>
/// <returns>True if the property was found, false otherwise</returns>
bool TryGetPropertyValue(string Name, out string Value)
{
// Check each scope for the property
for (int ScopeIdx = ScopedProperties.Count - 1; ScopeIdx >= 0; ScopeIdx--)
{
string ScopeValue;
if (ScopedProperties[ScopeIdx].TryGetValue(Name, out ScopeValue))
{
Value = ScopeValue;
return true;
}
}
// If we didn't find it, return false.
Value = null;
return false;
}
/// <summary>
/// Reads the definition for a trigger.
/// </summary>
@@ -424,8 +503,8 @@ namespace AutomationTool
case "Do":
ReadBlock(ChildElement, x => ReadTriggerBody(x, Trigger));
break;
case "Choose":
ReadChoice(ChildElement, x => ReadTriggerBody(x, Trigger));
case "Switch":
ReadSwitch(ChildElement, x => ReadTriggerBody(x, Trigger));
break;
case "ForEach":
ReadForEach(ChildElement, x => ReadTriggerBody(x, Trigger));
@@ -443,18 +522,83 @@ namespace AutomationTool
/// </summary>
/// <param name="Element">Xml element to read the definition from</param>
/// <param name="BaseDir">Base directory to resolve relative include paths from </param>
void ReadInclude(ScriptElement Element, DirectoryReference BaseDir)
/// <param name="Arguments">Arguments passed in to the graph on the command line</param>
void ReadInclude(ScriptElement Element, DirectoryReference BaseDir, Dictionary<string, string> Arguments)
{
if (EvaluateCondition(Element))
{
FileReference Script = FileReference.Combine(BaseDir, Element.GetAttribute("Script"));
if (Script.Exists())
if (!Script.Exists())
{
TryRead(Script);
LogError(Element, "Cannot find included script '{0}'", Script.FullName);
}
else
{
LogError(Element, "Cannot find included script '{0}'", Script.FullName);
TryRead(Script, Arguments);
}
}
}
/// <summary>
/// Reads the definition of a graph option; a parameter which can be set by the user on the command-line or via an environment variable.
/// </summary>
/// <param name="Element">Xml element to read the definition from</param>
/// <param name="Arguments">Arguments passed in to the graph on the command line</param>
void ReadOption(ScriptElement Element, IDictionary<string, string> Arguments)
{
if (EvaluateCondition(Element))
{
string Name = ReadAttribute(Element, "Name");
if (ValidateName(Element, Name))
{
// Make sure we're at global scope
if(ScopedProperties.Count > 1)
{
throw new AutomationException("Incorrect scope depth for reading option settings");
}
// Check if the property already exists. If it does, we don't need to register it as an option.
string ExistingValue;
if(TryGetPropertyValue(Name, out ExistingValue))
{
// If there's a restriction on this definition, check it matches
string Restrict = ReadAttribute(Element, "Restrict");
if(!String.IsNullOrEmpty(Restrict) && !Regex.IsMatch(ExistingValue, "^" + Restrict + "$", RegexOptions.IgnoreCase))
{
LogError(Element, "'{0} is already set to '{1}', which does not match the given restriction ('{2}')", Name, ExistingValue, Restrict);
}
}
else
{
// Create a new option object to store the settings
string Description = ReadAttribute(Element, "Description");
string DefaultValue = ReadAttribute(Element, "DefaultValue");
GraphOption Option = new GraphOption(Name, Description, DefaultValue);
Graph.Options.Add(Option);
// Get the value of this property
string Value;
if(!Arguments.TryGetValue(Name, out Value))
{
Value = Option.DefaultValue;
}
SetPropertyValue(Element, Name, Value);
// If there's a restriction on it, check it's valid
string Restrict = ReadAttribute(Element, "Restrict");
if(!String.IsNullOrEmpty(Restrict))
{
string Pattern = "^" + Restrict + "$";
if(!Regex.IsMatch(Value, Pattern, RegexOptions.IgnoreCase))
{
LogError(Element, "'{0}' is not a valid value for '{1}' (required: '{2}')", Value, Name, Restrict);
}
if(Option.DefaultValue != Value && !Regex.IsMatch(Option.DefaultValue, Pattern, RegexOptions.IgnoreCase))
{
LogError(Element, "Default value '{0}' is not valid for '{1}' (required: '{2}')", Option.DefaultValue, Name, Restrict);
}
}
}
}
}
}
@@ -470,52 +614,25 @@ namespace AutomationTool
string Name = ReadAttribute(Element, "Name");
if (ValidateName(Element, Name))
{
// Find the scope containing this property, defaulting to the current scope
int ScopeIdx = 0;
while(ScopeIdx < ScopedProperties.Count - 1 && !ScopedProperties[ScopeIdx].ContainsKey(Name))
{
ScopeIdx++;
}
string Value = ReadAttribute(Element, "Value");
SetPropertyValue(Element, Name, Value);
}
}
}
// Make sure this property name was not already used in a child scope; it likely indicates an error.
if(ShadowProperties[ScopeIdx].Contains(Name))
{
LogError(Element, "Property '{0}' was already used in a child scope. Move this definition before the previous usage if they are intended to share scope, or use a different name.", Name);
}
else
{
// Make sure it's added to the shadow property list for every parent scope
for(int Idx = 0; Idx < ScopeIdx; Idx++)
{
ShadowProperties[Idx].Add(Name);
}
// Assign the property value
if(Element.HasAttribute("Value"))
{
ScopedProperties[ScopeIdx][Name] = ReadAttribute(Element, "Value");
}
if(Element.HasAttribute("Default") && !ScopedProperties[ScopeIdx].ContainsKey(Name))
{
ScopedProperties[ScopeIdx][Name] = ReadAttribute(Element, "Default");
}
if(Element.HasAttribute("Restrict"))
{
// Find the valid values for this property
string[] Values = ReadListAttribute(Element, "Restrict");
// Get the property value, and check it matches
string Value;
if(!ScopedProperties[ScopeIdx].TryGetValue(Name, out Value))
{
LogError(Element, "Property '{0}' is not defined.", Name);
}
else if(!Values.Any(x => String.Compare(x, Value, StringComparison.InvariantCultureIgnoreCase) == 0))
{
LogError(Element, "Property '{0}' is set to an invalid value ({1}). Valid values are {2}.", Name, Value, String.Join(", ", Values));
}
}
}
/// <summary>
/// Reads a property assignment from an environment variable.
/// </summary>
/// <param name="Element">Xml element to read the definition from</param>
void ReadEnvVar(ScriptElement Element)
{
if (EvaluateCondition(Element))
{
string Name = ReadAttribute(Element, "Name");
if (ValidateName(Element, Name))
{
string Value = Environment.GetEnvironmentVariable(Name) ?? "";
SetPropertyValue(Element, Name, Value);
}
}
}
@@ -594,8 +711,8 @@ namespace AutomationTool
case "Do":
ReadBlock(ChildElement, x => ReadAgentBody(x, ParentAgent, ControllingTrigger));
break;
case "Choose":
ReadChoice(ChildElement, x => ReadAgentBody(x, ParentAgent, ControllingTrigger));
case "Switch":
ReadSwitch(ChildElement, x => ReadAgentBody(x, ParentAgent, ControllingTrigger));
break;
case "ForEach":
ReadForEach(ChildElement, x => ReadAgentBody(x, ParentAgent, ControllingTrigger));
@@ -679,7 +796,7 @@ namespace AutomationTool
string[] RequiresNames = ReadListAttribute(Element, "Requires");
string[] ProducesNames = ReadListAttribute(Element, "Produces");
string[] AfterNames = ReadListAttribute(Element, "After");
string[] TicketFileNames = ReadListAttribute(Element, "Ticket");
string[] TokenFileNames = ReadListAttribute(Element, "Token");
bool bNotifyOnWarnings = ReadBooleanAttribute(Element, "NotifyOnWarnings", true);
// Resolve all the inputs we depend on
@@ -700,12 +817,12 @@ namespace AutomationTool
}
// Remove all the lock names from the list of required names
HashSet<FileReference> RequiredTickets = new HashSet<FileReference>(TicketFileNames.Select(x => FileReference.Combine(CommandUtils.RootDirectory, x)));
HashSet<FileReference> RequiredTokens = new HashSet<FileReference>(TokenFileNames.Select(x => FileReference.Combine(CommandUtils.RootDirectory, x)));
// Recursively include all their dependencies too
foreach (Node InputDependency in InputDependencies.ToArray())
{
RequiredTickets.UnionWith(InputDependency.RequiredTickets);
RequiredTokens.UnionWith(InputDependency.RequiredTokens);
InputDependencies.UnionWith(InputDependency.InputDependencies);
}
@@ -756,7 +873,7 @@ namespace AutomationTool
if (CheckNameIsUnique(Element, Name))
{
// Add it to the node lookup
Node NewNode = new Node(Name, Inputs.ToArray(), ValidOutputNames.ToArray(), InputDependencies.ToArray(), OrderDependencies.ToArray(), ControllingTrigger, RequiredTickets.ToArray());
Node NewNode = new Node(Name, Inputs.ToArray(), ValidOutputNames.ToArray(), InputDependencies.ToArray(), OrderDependencies.ToArray(), ControllingTrigger, RequiredTokens.ToArray());
NewNode.bNotifyOnWarnings = bNotifyOnWarnings;
Graph.NameToNode.Add(Name, NewNode);
@@ -801,8 +918,8 @@ namespace AutomationTool
case "Do":
ReadBlock(ChildElement, x => ReadNodeBody(x, NewNode, ParentAgent, ControllingTrigger));
break;
case "Choose":
ReadChoice(ChildElement, x => ReadNodeBody(x, NewNode, ParentAgent, ControllingTrigger));
case "Switch":
ReadSwitch(ChildElement, x => ReadNodeBody(x, NewNode, ParentAgent, ControllingTrigger));
break;
case "ForEach":
ReadForEach(ChildElement, x => ReadNodeBody(x, NewNode, ParentAgent, ControllingTrigger));
@@ -829,15 +946,15 @@ namespace AutomationTool
}
/// <summary>
/// Reads a "Choose" element
/// Reads a "Switch" element
/// </summary>
/// <param name="Element">Xml element to read the definition from</param>
/// <param name="ReadContents">Delegate to read the contents of the element, if the condition evaluates to true</param>
void ReadChoice(ScriptElement Element, Action<ScriptElement> ReadContents)
void ReadSwitch(ScriptElement Element, Action<ScriptElement> ReadContents)
{
foreach (ScriptElement ChildElement in Element.ChildNodes.OfType<ScriptElement>())
{
if (ChildElement.Name == "Otherwise" || EvaluateCondition(ChildElement))
if (ChildElement.Name == "Default" || EvaluateCondition(ChildElement))
{
ReadContents(ChildElement);
break;
@@ -1256,7 +1373,7 @@ namespace AutomationTool
LogError(Element, "Consecutive spaces in object name");
return false;
}
if (!Char.IsLetterOrDigit(Name[Idx]) && Name[Idx] != '_' && Name[Idx] != ' ')
if(Char.IsControl(Name[Idx]) || ScriptSchema.IllegalNameCharacters.IndexOf(Name[Idx]) != -1)
{
LogError(Element, "Invalid character in object name - '{0}'", Name[Idx]);
return false;
@@ -1417,17 +1534,8 @@ namespace AutomationTool
string Name = Result.Substring(Idx + 2, EndIdx - (Idx + 2));
// Find the value for it, either from the dictionary or the environment block
string Value = null;
for (int ScopeIdx = ScopedProperties.Count - 1; ScopeIdx >= 0; ScopeIdx--)
{
if (ScopedProperties[ScopeIdx].TryGetValue(Name, out Value))
{
break;
}
}
// Write a warning if the property does not exist
if(Value == null)
string Value;
if(!TryGetPropertyValue(Name, out Value))
{
LogWarning(Element, "Property '{0}' is not defined", Name);
Value = "";

Some files were not shown because too many files have changed in this diff Show More