Build( XmlUtilities.TextFileModule moduleToBuild, out bool success) { var locationMap = moduleToBuild.Locations; var outputDir = locationMap[XmlUtilities.TextFileModule.OutputDir]; var outputDirPath = outputDir.GetSingleRawPath(); if (!System.IO.Directory.Exists(outputDirPath)) { System.IO.Directory.CreateDirectory(outputDirPath); } var outputFileLoc = locationMap[XmlUtilities.TextFileModule.OutputFile]; var outputFilePath = outputFileLoc.GetSingleRawPath(); // write a script that can be invoked by the MakeFile to generate the output file var shellScriptLeafName = "writeTextFile.py"; var shellScriptLoc = Bam.Core.FileLocation.Get(outputDir, shellScriptLeafName, Bam.Core.Location.EExists.WillExist); var shellScriptPath = shellScriptLoc.GetSingleRawPath(); XmlUtilities.TextToPythonScript.Write(moduleToBuild.Content, shellScriptPath, outputFilePath); var node = moduleToBuild.OwningNode; var makeFile = new MakeFile(node, this.topLevelMakeFilePath); var dirsToCreate = moduleToBuild.Locations.FilterByType(Bam.Core.ScaffoldLocation.ETypeHint.Directory, Bam.Core.Location.EExists.WillExist); var recipe = new Bam.Core.StringArray(); recipe.Add(System.String.Format("$(shell python {0})", shellScriptPath)); var rule = new MakeFileRule( moduleToBuild, XmlUtilities.TextFileModule.OutputFile, node.UniqueModuleName, dirsToCreate, null, null, recipe); rule.OutputLocationKeys = new Bam.Core.Array <Bam.Core.LocationKey>(XmlUtilities.TextFileModule.OutputFile); makeFile.RuleArray.Add(rule); var makeFilePath = MakeFileBuilder.GetMakeFilePathName(node); System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(makeFilePath)); using (var makeFileWriter = new System.IO.StreamWriter(makeFilePath)) { makeFile.Write(makeFileWriter); } var exportedTargets = makeFile.ExportedTargets; var exportedVariables = makeFile.ExportedVariables; var returnData = new MakeFileData(makeFilePath, exportedTargets, exportedVariables, null); success = true; return(returnData); }
Build( XmlUtilities.TextFileModule moduleToBuild, out bool success) { var node = moduleToBuild.OwningNode; var outputLoc = moduleToBuild.Locations[XmlUtilities.TextFileModule.OutputFile]; var outputPath = outputLoc.GetSinglePath(); if (null == outputPath) { throw new Bam.Core.Exception("Text output path was not set"); } // dependency checking { var outputFiles = new Bam.Core.StringArray(); outputFiles.Add(outputPath); if (!RequiresBuilding(outputFiles, new Bam.Core.StringArray())) { Bam.Core.Log.DebugMessage("'{0}' is up-to-date", node.UniqueModuleName); success = true; return(null); } } Bam.Core.Log.Info("Writing text file '{0}'", outputPath); // create all directories required var dirsToCreate = moduleToBuild.Locations.FilterByType(Bam.Core.ScaffoldLocation.ETypeHint.Directory, Bam.Core.Location.EExists.WillExist); foreach (var dir in dirsToCreate) { var dirPath = dir.GetSinglePath(); NativeBuilder.MakeDirectory(dirPath); } using (var writer = new System.IO.StreamWriter(outputPath, false, System.Text.Encoding.ASCII)) { var content = moduleToBuild.Content.ToString(); writer.Write(content); } success = true; return(null); }
Build( XmlUtilities.TextFileModule moduleToBuild, out bool success) { var node = moduleToBuild.OwningNode; var targetNode = node.ExternalDependents[0]; var project = this.Workspace.GetProject(targetNode); var baseTarget = (Bam.Core.BaseTarget)targetNode.Target; var configuration = project.BuildConfigurations.Get(baseTarget.ConfigurationName('='), targetNode.ModuleName); var outputFileLoc = moduleToBuild.Locations[XmlUtilities.TextFileModule.OutputFile]; var outputFilePath = outputFileLoc.GetSingleRawPath(); var moduleName = node.ModuleName; var fileRef = project.FileReferences.Get(moduleName, PBXFileReference.EType.Text, outputFilePath, project.RootUri); var sourcesBuildPhase = project.SourceBuildPhases.Get("MiscSources", moduleName); var data = project.BuildFiles.Get(moduleName, fileRef, sourcesBuildPhase); if (null == data) { throw new Bam.Core.Exception("Build file not available"); } var content = moduleToBuild.Content.ToString(); string shellScriptName = "Writing text file for " + targetNode.UniqueModuleName; var shellScriptBuildPhase = project.ShellScriptBuildPhases.Get(shellScriptName, node.ModuleName); shellScriptBuildPhase.OutputPaths.Add(outputFilePath); shellScriptBuildPhase.ShellScriptLines.Add(System.String.Format("if [ \\\"${{CONFIGURATION}}\\\" = \\\"{0}\\\" ]; then", configuration.Name)); foreach (var line in content.Split('\n')) { var escapedLine = line.Replace("\"", "\\\""); shellScriptBuildPhase.ShellScriptLines.Add(System.String.Format("echo \\\"{0}\\\" >> $SCRIPT_OUTPUT_FILE_0", escapedLine)); } shellScriptBuildPhase.ShellScriptLines.Add("fi"); // is this a post action? { // because this is performed AFTER the application, we can directly add to the build phases var nativeTarget = targetNode.Data as PBXNativeTarget; nativeTarget.BuildPhases.Insert(0, shellScriptBuildPhase); } success = true; return(data); }
Build( XmlUtilities.TextFileModule moduleToBuild, out bool success) { var node = moduleToBuild.OwningNode; var locationMap = moduleToBuild.Locations; var outputDir = locationMap[XmlUtilities.TextFileModule.OutputDir]; var outputDirPath = outputDir.GetSingleRawPath(); if (!System.IO.Directory.Exists(outputDirPath)) { System.IO.Directory.CreateDirectory(outputDirPath); } var outputFileLoc = locationMap[XmlUtilities.TextFileModule.OutputFile]; var outputFilePath = outputFileLoc.GetSingleRawPath(); var targetNode = node.ExternalDependents[0]; var targetData = targetNode.Data as QMakeData; // write a script that can be invoked by QMake to generate the text file var shellScriptLeafName = "writeTextFile.py"; var shellScriptLoc = Bam.Core.FileLocation.Get(outputDir, shellScriptLeafName, Bam.Core.Location.EExists.WillExist); var shellScriptPath = shellScriptLoc.GetSingleRawPath(); XmlUtilities.TextToPythonScript.Write(moduleToBuild.Content, shellScriptPath, outputFilePath); if (null == targetData.CustomRules) { targetData.CustomRules = new Bam.Core.StringArray(); } targetData.CustomRules.Add("writeTextFileTarget.target=" + outputFilePath.Replace('\\', '/')); targetData.CustomRules.Add("writeTextFileTarget.depends=FORCE"); targetData.CustomRules.Add("writeTextFileTarget.commands=python " + shellScriptPath.Replace('\\', '/')); targetData.CustomRules.Add("PRE_TARGETDEPS+=" + outputFilePath.Replace('\\', '/')); targetData.CustomRules.Add("QMAKE_EXTRA_TARGETS+=writeTextFileTarget"); success = true; return(null); }
Build( XmlUtilities.TextFileModule moduleToBuild, out bool success) { var node = moduleToBuild.OwningNode; var targetNode = node.ExternalDependents[0]; var toProject = targetNode.Data as IProject; var configCollection = toProject.Configurations; var configurationName = configCollection.GetConfigurationNameForTarget((Bam.Core.BaseTarget)targetNode.Target); // TODO: not accurate var configuration = configCollection[configurationName]; var toolName = "VCPreBuildEventTool"; var vcPreBuildEventTool = configuration.GetTool(toolName); if (null == vcPreBuildEventTool) { vcPreBuildEventTool = new ProjectTool(toolName); configuration.AddToolIfMissing(vcPreBuildEventTool); } var commandLine = new System.Text.StringBuilder(); var locationMap = moduleToBuild.Locations; var outputDir = locationMap[XmlUtilities.TextFileModule.OutputDir]; var outputDirPath = outputDir.GetSingleRawPath(); commandLine.AppendFormat("IF NOT EXIST {0} MKDIR {0}{1}", outputDirPath, System.Environment.NewLine); var outputFileLoc = locationMap[XmlUtilities.TextFileModule.OutputFile]; var outputFilePath = outputFileLoc.GetSingleRawPath(); foreach (var line in moduleToBuild.Content.ToString().Split('\n')) { commandLine.AppendFormat("ECHO {0} >> {1}{2}", line, outputFilePath, System.Environment.NewLine); } { string attributeName = null; if (VisualStudioProcessor.EVisualStudioTarget.VCPROJ == toProject.VSTarget) { attributeName = "CommandLine"; } else if (VisualStudioProcessor.EVisualStudioTarget.MSBUILD == toProject.VSTarget) { attributeName = "Command"; } lock (vcPreBuildEventTool) { if (vcPreBuildEventTool.HasAttribute(attributeName)) { var currentValue = vcPreBuildEventTool[attributeName]; currentValue += commandLine.ToString(); vcPreBuildEventTool[attributeName] = currentValue; } else { vcPreBuildEventTool.AddAttribute(attributeName, commandLine.ToString()); } } } success = true; return(null); }