public override Entity Resolve(Entity owner, string key, bool fallback = false)
        {
            if (key == EntityKeys.InternalDeployPathKey)
            {
                TargetEntity     targetEntity  = TargetEntity.Decorate(owner);
                BuildEntity      buildEntity   = BuildEntity.Decorate(owner);
                Entity           project       = owner.Root;
                CommandEntity    commandOrigin = CommandEntity.Decorate(owner.Origin);
                VirtualDirectory outputRoot    = fileSystem.GetDirectory(commandOrigin.Output, project.Path);
                VirtualDirectory deployRoot    = outputRoot.Directory(targetEntity.FullName.Replace(',', '_'),
                                                                      buildEntity.BuildType);
                return(owner.Create(key, deployRoot.FullName, deployRoot));
            }

            CommandEntity command           = CommandEntity.Decorate(owner);
            FileEntity    projectFileEntity = FileEntity.Decorate(owner.Root);
            string        outputDirectory   = command.GetSingleValueArgument(Constants.OutputArgumentName);

            if (string.IsNullOrEmpty(outputDirectory))
            {
                outputDirectory = projectFileEntity.Directory
                                  .Directory(Constants.LibraryFolderName)
                                  .FullName;
            }

            return(owner.Create(key, outputDirectory));
        }
        public void Execute(Entity dataModel, ChangeObservable observable)
        {
            ProjectEntity project = ProjectEntity.Decorate(dataModel.Root);

            IEnumerable <Entity> targets = project.Targets.ToArray();

            if (!targets.Any())
            {
                throw new FormattableException("Please use --target to specify for which targets the library shall be generated.");
            }

            foreach (Entity target in targets)
            {
                VirtualDirectory deployRoot      = DeployEntity.Decorate(target).DeployDirectory;
                VirtualDirectory deployDirectory = deployRoot.Directory("lib", project.Name);
                BuildEntity      buildEntity     = BuildEntity.Decorate(target);
                if (!buildEntity.HasBuildSystem)
                {
                    TargetEntity targetEntity = TargetEntity.Decorate(target);
                    executionContext.WriteWarning(new CMakeBuildSystemNotFoundException(targetEntity.FullName, buildEntity.BuildType).Message);
                    return;
                }

                foreach (string externalLibrary in buildEntity.BuildSystem.ExternalLibraries)
                {
                    VirtualFile newFile = fileSystem.GetFile(externalLibrary).CopyTo(deployDirectory);
                    executionContext.Observable.OnNext(new Change(() => newFile.Delete(), $"Copied {externalLibrary} to {newFile.FullName}."));
                }
            }
        }