1*cc02d7e2SAndroid Build Coastguard Worker #region Copyright notice and license 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2018 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker // 5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker // 9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker // 11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Worker #endregion 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker using System.Collections.Generic; 20*cc02d7e2SAndroid Build Coastguard Worker using Microsoft.Build.Framework; 21*cc02d7e2SAndroid Build Coastguard Worker using Microsoft.Build.Utilities; 22*cc02d7e2SAndroid Build Coastguard Worker 23*cc02d7e2SAndroid Build Coastguard Worker namespace Grpc.Tools 24*cc02d7e2SAndroid Build Coastguard Worker { 25*cc02d7e2SAndroid Build Coastguard Worker public class ProtoReadDependencies : Task 26*cc02d7e2SAndroid Build Coastguard Worker { 27*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 28*cc02d7e2SAndroid Build Coastguard Worker /// The collection is used to collect possible additional dependencies 29*cc02d7e2SAndroid Build Coastguard Worker /// of proto files cached under ProtoDepDir. 30*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 31*cc02d7e2SAndroid Build Coastguard Worker [Required] 32*cc02d7e2SAndroid Build Coastguard Worker public ITaskItem[] Protobuf { get; set; } 33*cc02d7e2SAndroid Build Coastguard Worker 34*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 35*cc02d7e2SAndroid Build Coastguard Worker /// Directory where protoc dependency files are cached. 36*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 37*cc02d7e2SAndroid Build Coastguard Worker [Required] 38*cc02d7e2SAndroid Build Coastguard Worker public string ProtoDepDir { get; set; } 39*cc02d7e2SAndroid Build Coastguard Worker 40*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 41*cc02d7e2SAndroid Build Coastguard Worker /// Additional items that a proto file depends on. This list may include 42*cc02d7e2SAndroid Build Coastguard Worker /// extra dependencies; we do our best to include as few extra positives 43*cc02d7e2SAndroid Build Coastguard Worker /// as reasonable to avoid missing any. The collection item is the 44*cc02d7e2SAndroid Build Coastguard Worker /// dependency, and its Source metadatum is the dependent proto file, like 45*cc02d7e2SAndroid Build Coastguard Worker /// <ItemName Include="/usr/include/proto/wrapper.proto" 46*cc02d7e2SAndroid Build Coastguard Worker /// Source="my_proto.proto" /> 47*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 48*cc02d7e2SAndroid Build Coastguard Worker [Output] 49*cc02d7e2SAndroid Build Coastguard Worker public ITaskItem[] Dependencies { get; private set; } 50*cc02d7e2SAndroid Build Coastguard Worker Execute()51*cc02d7e2SAndroid Build Coastguard Worker public override bool Execute() 52*cc02d7e2SAndroid Build Coastguard Worker { 53*cc02d7e2SAndroid Build Coastguard Worker // Read dependency files, where available. There might be none, 54*cc02d7e2SAndroid Build Coastguard Worker // just use a best effort. 55*cc02d7e2SAndroid Build Coastguard Worker if (ProtoDepDir != null) 56*cc02d7e2SAndroid Build Coastguard Worker { 57*cc02d7e2SAndroid Build Coastguard Worker var dependencies = new List<ITaskItem>(); 58*cc02d7e2SAndroid Build Coastguard Worker foreach (var proto in Protobuf) 59*cc02d7e2SAndroid Build Coastguard Worker { 60*cc02d7e2SAndroid Build Coastguard Worker string[] deps = DepFileUtil.ReadDependencyInputs(ProtoDepDir, proto.ItemSpec, Log); 61*cc02d7e2SAndroid Build Coastguard Worker foreach (string dep in deps) 62*cc02d7e2SAndroid Build Coastguard Worker { 63*cc02d7e2SAndroid Build Coastguard Worker var ti = new TaskItem(dep); 64*cc02d7e2SAndroid Build Coastguard Worker ti.SetMetadata(Metadata.Source, proto.ItemSpec); 65*cc02d7e2SAndroid Build Coastguard Worker dependencies.Add(ti); 66*cc02d7e2SAndroid Build Coastguard Worker } 67*cc02d7e2SAndroid Build Coastguard Worker } 68*cc02d7e2SAndroid Build Coastguard Worker Dependencies = dependencies.ToArray(); 69*cc02d7e2SAndroid Build Coastguard Worker } 70*cc02d7e2SAndroid Build Coastguard Worker else 71*cc02d7e2SAndroid Build Coastguard Worker { 72*cc02d7e2SAndroid Build Coastguard Worker Dependencies = new ITaskItem[0]; 73*cc02d7e2SAndroid Build Coastguard Worker } 74*cc02d7e2SAndroid Build Coastguard Worker 75*cc02d7e2SAndroid Build Coastguard Worker return !Log.HasLoggedErrors; 76*cc02d7e2SAndroid Build Coastguard Worker } 77*cc02d7e2SAndroid Build Coastguard Worker }; 78*cc02d7e2SAndroid Build Coastguard Worker } 79