/*----------------------------------------------------------------------
Prof-It for C#
Copyright (c) 2004 Klaus Lehner, University of Linz
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
----------------------------------------------------------------------*/
using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Resources;
using System.Reflection;
using at.jku.ssw.ProfIt.Components;
using at.jku.ssw.ProfIt.Runtime;
namespace at.jku.ssw.ProfIt.CodeGen{
/// <summary>
/// Summary description for Compiler.
/// </summary>
public class Compiler {
public static bool Compile(Solution solution) {
Console.WriteLine("[Prof-It] Starting compiling Solution '" + solution.Name + "'");
foreach (Project project in solution.Projects) {
project.BuildExists = false;
}
solution.CounterArray = new CounterArray();
solution.CounterArray.Counters = new System.Collections.ArrayList();
CodeGenerator.ResetCurrentId();
DateTime time = System.DateTime.Now;
int failed = 0, succeeded = 0;
CompilerResults results = null;
foreach (Project project in solution.Projects) {
if (!project.BuildExists) {
results = Compile(project);
if (results.Errors.HasErrors) {
failed++;
break;
}
else {
succeeded++;
}
}
}
TimeSpan elapsedTime = System.DateTime.Now - time;
Console.WriteLine("[Prof-It] Build Done in " + elapsedTime.TotalSeconds + " seconds ---------------\n");
Console.WriteLine("[Prof-It] Build: " + succeeded + " succeeded, " + failed + " failed\n");
solution.CounterArray.SetArrayLength(CodeGenerator.CurrentId);
return failed == 0;
}
/// <summary>
/// Compiles the specified project to the output directory
/// </summary>
private static CompilerResults Compile(Project project) {
Console.WriteLine("[Prof-It] Trying to build project " + project.Name);
if (!Directory.Exists(project.OutputDirectory)) {
Directory.CreateDirectory(project.OutputDirectory);
}
Microsoft.CSharp.CSharpCodeProvider p = new Microsoft.CSharp.CSharpCodeProvider();
ICodeCompiler compiler = p.CreateCompiler();
CompilerParameters parameters = new CompilerParameters(new string[]{});
parameters.GenerateExecutable = project.OutputType == OutputType.WinExe;
parameters.IncludeDebugInformation = false;
// Include resource files into the manifest
string options = "";
foreach (SourceFile file in project.Files) {
if (file.BuildAction == BuildAction.EmbeddedResource) {
try {
options += "/res:\"" + ResourceGenerator.GenerateResourceFile(file.FileName, project.Name) + "\" ";
} catch {
// TODO CHECK THIS
}
}
}
parameters.CompilerOptions = options;
//File.Copy(SystemInfo.StartDirectory + @"\at.jku.ssw.ProfIt.Runtime.dll",
// project.OutputDirectory + "/at.jku.ssw.ProfIt.Runtime.dll", true);
//parameters.ReferencedAssemblies.Add(project.OutputDirectory + "/at.jku.ssw.ProfIt.Runtime.dll");
//Console.WriteLine(SystemInfo.ExeDirectory + "at.jku.ssw.ProfIt.Runtime.dll");
parameters.ReferencedAssemblies.Add(SystemInfo.ExeDirectory + "/at.jku.ssw.ProfIt.Runtime.dll");
parameters.ReferencedAssemblies.Add("System.dll");
foreach (IReference reference in project.References) {
if (reference is ProjectReference) {
if (!((ProjectReference)reference).Project.BuildExists) {
Compile(((ProjectReference)reference).Project);
}
copyAllFiles(((ProjectReference)reference).Project, project);
} else {
// check if dll in GAC
//Console.Write("trying to copy " + reference.FileName + " to " + project.OutputDirectory);
if (!System.Reflection.Assembly.LoadFile(reference.FileName).GlobalAssemblyCache) {
if (reference.FileName.IndexOf("Microsoft") < 0) {
File.Copy(reference.FileName, project.OutputDirectory + "/" + FileUtility.ToShortFileName(reference.FileName), true);
//if (!parameters.ReferencedAssemblies.Contains(reference.FileName))
//Console.WriteLine(" COPIED");
}
} else {
//Console.WriteLine(" IS FROM GAC");
}
parameters.ReferencedAssemblies.Add(reference.FileName);
}
}
foreach (string ra in Directory.GetFiles(project.OutputDirectory)) {
if (ra.EndsWith("dll")) parameters.ReferencedAssemblies.Add(ra);
}
parameters.OutputAssembly = project.OutputFileName;
int cnt=0;
foreach (SourceFile file in project.Files) {
if (file.BuildAction == BuildAction.Compile) {
cnt++;
}
}
CompilerResults results = null;
string[] modifiedSources = new string[cnt++];
cnt = 0;
if (SystemInfo.CreateProfiledSourceFiles) {
foreach (SourceFile file in project.Files) {
if (file.BuildAction == BuildAction.Compile) {
CodeGenerator.Generate(file);
//if (file.Profile)
modifiedSources[cnt++] = file.FileName + "2";
}
}
results = compiler.CompileAssemblyFromFileBatch(parameters, modifiedSources);
} else {
foreach (SourceFile file in project.Files) {
if (file.BuildAction == BuildAction.Compile) {
modifiedSources[cnt++] = CodeGenerator.Generate(file);
}
}
results = compiler.CompileAssemblyFromSourceBatch(parameters, modifiedSources);
}
if (results.Errors.HasErrors) {
foreach (CompilerError error in results.Errors) {
if (!error.IsWarning)
Console.WriteLine(error.ToString());
}
} else {
Console.WriteLine("[Prof-It] " + project.Name + " compiled successfully");
project.BuildExists = true;
}
return results;
}
/// <summary>
/// Copies all files of one directory to another one
/// </summary>
/// <param name="source">source directory</param>
/// <param name="dest">destination directory</param>
private static void copyAllFiles(Project source, Project dest) {
string[] files = Directory.GetFiles(source.OutputDirectory);
foreach (string fileName in files) {
try {
File.Copy(fileName, dest.OutputDirectory + "/" + FileUtility.ToShortFileName(fileName), true);
} catch (Exception e) {
Console.WriteLine(e);
}
}
}
}
}
|