// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #pragma once class FBuildAction { public: int32 SortIndex; FString Caption; FString Prefix; FString ToolPath; FString ToolArguments; FString WorkingDirectory; bool bSkipIfProjectFailed; TArray Dependants; TArray Dependencies; int32 TotalDependants; int32 MissingDependencyCount; FBuildAction(); ~FBuildAction(); }; class FBuildActionExecutor : public FRunnable { public: FBuildAction* Action; TArray Log; int32 ExitCode; FBuildActionExecutor(FBuildAction* InAction, FCriticalSection& InCriticalSection, FEvent* InCompletedEvent, TArray& InCompletedActions, const TMap& InEnvironment, void* InJobObject); virtual uint32 Run() override; private: FCriticalSection& CriticalSection; FEvent* CompletedEvent; TArray& CompletedActions; const TMap& Environment; void* JobObject; int32 ExecuteAction(); static FString ExpandEnvironmentVariables(const FString& Input); static FProcHandle CreateChildProcess(const FString& FileName, const FString& Arguments, const FString& WorkingDir, const TMap& Environment, void* WritePipe, void* JobObject); static void WaitForOutput(FProcHandle ProcessHandle, void* ReadPipe); }; class FBuildGraph { public: FBuildGraph(); ~FBuildGraph(); bool ReadFromFile(const FString& InputPath); int32 ExecuteInParallel(int32 MaxProcesses); private: TArray Actions; TMap Variables; FBuildAction* FindOrAddAction(TMap& NameToAction, const FString& Name); static void RecursiveIncDependants(FBuildAction* Action, TSet& VisitedActions); static void* CreateJobObject(); };