Requires( Target other) { lock (this) { var existingTargetDep = this.TargetDependencies.Where(item => item.Dependency == other).FirstOrDefault(); if (null != existingTargetDep) { return; } if (this.Project == other.Project) { var itemProxy = this.Project.ContainerItemProxies.Where(item => (item.ContainerPortal == this.Project) && (item.Remote == other)).FirstOrDefault(); if (null == itemProxy) { itemProxy = new ContainerItemProxy(this.Project, this.Project, other, false); } var dependency = this.TargetDependencies.Where(item => (item.Dependency == other) && (item.Proxy == itemProxy)).FirstOrDefault(); if (null == dependency) { dependency = new TargetDependency(this.Project, other, itemProxy); this.TargetDependencies.AddUnique(dependency); } } else { var fileRef = this.Project.EnsureFileReferenceExists( other.Project.ProjectDir, FileReference.EFileType.Project, explicitType: false, sourceTree: FileReference.ESourceTree.Absolute); this.Project.MainGroup.AddChild(fileRef); var itemProxy = this.Project.ContainerItemProxies.Where(item => (item.ContainerPortal == fileRef) && (item.Remote == other)).FirstOrDefault(); if (null == itemProxy) { itemProxy = new ContainerItemProxy(this.Project, fileRef, other, false); } var refProxy = this.Project.ReferenceProxies.Where(item => item.RemoteRef == itemProxy).FirstOrDefault(); if (null == refProxy) { refProxy = new ReferenceProxy( this.Project, other.FileReference.Type, other.FileReference.Path, itemProxy, other.FileReference.SourceTree); } var productRefGroup = this.Project.Groups.Where(item => item.Children.Contains(refProxy)).FirstOrDefault(); if (null == productRefGroup) { productRefGroup = new Group("Products"); productRefGroup.AddChild(refProxy); this.Project.Groups.Add(productRefGroup); } var productRef = this.Project.ProjectReferences.Where(item => item.Key == productRefGroup).FirstOrDefault(); if (productRef.Equals(default(System.Collections.Generic.Dictionary <Group, FileReference>))) { this.Project.ProjectReferences.Add(productRefGroup, fileRef); } var dependency = this.TargetDependencies.Where(item => (item.Dependency == null) && (item.Proxy == itemProxy)).FirstOrDefault(); if (null == dependency) { dependency = new TargetDependency(this.Project, null, itemProxy); this.TargetDependencies.AddUnique(dependency); } } } }
appendReferenceProxy( ReferenceProxy proxy) { // no lock required, added in serial code this.ReferenceProxies.Add(proxy); }
public void Requires( Target other) { lock (this) { var existingTargetDep = this.TargetDependencies.Where(item => item.Dependency == other).FirstOrDefault(); if (null != existingTargetDep) { return; } if (this.Project == other.Project) { var itemProxy = this.Project.ContainerItemProxies.Where(item => (item.ContainerPortal == this.Project) && (item.Remote == other)).FirstOrDefault(); if (null == itemProxy) { itemProxy = new ContainerItemProxy(this.Project, this.Project, other, false); } var dependency = this.TargetDependencies.Where(item => (item.Dependency == other) && (item.Proxy == itemProxy)).FirstOrDefault(); if (null == dependency) { dependency = new TargetDependency(this.Project, other, itemProxy); this.TargetDependencies.AddUnique(dependency); } } else { var fileRef = this.Project.EnsureFileReferenceExists( other.Project.ProjectDir, FileReference.EFileType.Project, explicitType: false, sourceTree: FileReference.ESourceTree.Absolute); this.Project.MainGroup.AddChild(fileRef); var itemProxy = this.Project.ContainerItemProxies.Where(item => (item.ContainerPortal == fileRef) && (item.Remote == other)).FirstOrDefault(); if (null == itemProxy) { itemProxy = new ContainerItemProxy(this.Project, fileRef, other, false); } var refProxy = this.Project.ReferenceProxies.Where(item => item.RemoteRef == itemProxy).FirstOrDefault(); if (null == refProxy) { refProxy = new ReferenceProxy( this.Project, other.FileReference.Type, other.FileReference.Path, itemProxy, other.FileReference.SourceTree); } var productRefGroup = this.Project.Groups.Where(item => item.Children.Contains(refProxy)).FirstOrDefault(); if (null == productRefGroup) { productRefGroup = new Group("Products"); productRefGroup.AddChild(refProxy); this.Project.Groups.Add(productRefGroup); } var productRef = this.Project.ProjectReferences.Where(item => item.Key == productRefGroup).FirstOrDefault(); if (productRef.Equals(default(System.Collections.Generic.Dictionary<Group, FileReference>))) { this.Project.ProjectReferences.Add(productRefGroup, fileRef); } var dependency = this.TargetDependencies.Where(item => (item.Dependency == null) && (item.Proxy == itemProxy)).FirstOrDefault(); if (null == dependency) { dependency = new TargetDependency(this.Project, null, itemProxy); this.TargetDependencies.AddUnique(dependency); } } } }
groupWithChild( ReferenceProxy proxy) { return(this.Groups.FirstOrDefault(item => item.Children.Contains(proxy))); }
ResolveTargetDependencies() { foreach (var depTarget in this.ProposedTargetDependencies) { if (this.Project == depTarget.Project) { var nativeTargetItemProxy = this.Project.getContainerItemProxy(depTarget, depTarget.Project); if (null == nativeTargetItemProxy) { nativeTargetItemProxy = new ContainerItemProxy(this.Project, depTarget); } // note that target dependencies can be shared in a project by many Targets // but each Target needs a reference to it var dependency = this.Project.getTargetDependency(depTarget, nativeTargetItemProxy); if (null == dependency) { dependency = new TargetDependency(this.Project, depTarget, nativeTargetItemProxy); } this.TargetDependencies.AddUnique(dependency); } else { if (null == depTarget.FileReference) { // expect header libraries not to have a build output if (!(depTarget.Module is C.HeaderLibrary)) { Bam.Core.Log.ErrorMessage("Project {0} cannot be a target dependency as it has no output FileReference", depTarget.Name); } continue; } var relativePath = this.Project.GetRelativePathToProject(depTarget.Project.ProjectDir); var sourceTree = FileReference.ESourceTree.NA; if (null == relativePath) { sourceTree = FileReference.ESourceTree.Absolute; } else { sourceTree = FileReference.ESourceTree.Group; // note: not relative to SOURCE } var dependentProjectFileRef = this.Project.EnsureFileReferenceExists( depTarget.Project.ProjectDir, relativePath, FileReference.EFileType.Project, explicitType: false, sourceTree: sourceTree); this.Project.MainGroup.AddChild(dependentProjectFileRef); // need a ContainerItemProxy for the dependent NativeTarget // which is associated with a local PBXTargetDependency var nativeTargetItemProxy = this.Project.getContainerItemProxy(depTarget, dependentProjectFileRef); if (null == nativeTargetItemProxy) { nativeTargetItemProxy = new ContainerItemProxy(this.Project, dependentProjectFileRef, depTarget); } // note that target dependencies can be shared in a project by many Targets // but each Target needs a reference to it var targetDependency = this.Project.getTargetDependency(depTarget.Name, nativeTargetItemProxy); if (null == targetDependency) { // no 'target', but does have the name of the dependent targetDependency = new TargetDependency(this.Project, depTarget.Name, nativeTargetItemProxy); } this.TargetDependencies.AddUnique(targetDependency); // need a ContainerItemProxy for the filereference of the dependent NativeTarget // which is associated with a local PBXReferenceProxy var dependentFileRefItemProxy = this.Project.getContainerItemProxy(depTarget.FileReference, dependentProjectFileRef); if (null == dependentFileRefItemProxy) { // note, uses the name of the Target, not the FileReference dependentFileRefItemProxy = new ContainerItemProxy(this.Project, dependentProjectFileRef, depTarget.FileReference, depTarget.Name); } var refProxy = this.Project.getReferenceProxyForRemoteRef(dependentFileRefItemProxy); if (null == refProxy) { refProxy = new ReferenceProxy( this.Project, depTarget.FileReference.Type, depTarget.FileReference.Path, dependentFileRefItemProxy, depTarget.FileReference.SourceTree); } // TODO: all PBXReferenceProxies could go into the same group // but at the moment, a group is made for each var productRefGroup = this.Project.groupWithChild(refProxy); if (null == productRefGroup) { productRefGroup = new Group(this.Project, "Products", refProxy); this.Project.appendGroup(productRefGroup); } this.Project.EnsureProjectReferenceExists(productRefGroup, dependentProjectFileRef); } } }