//
// Copyright (c) 2006, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 10 Jan 06 Brian Frank Creation
//
**
** BuildCs is the base class for build scripts used to manage
** building C# source code into a .NET exe or dll.
**
abstract class BuildCs : BuildScript
{
//////////////////////////////////////////////////////////////////////////
// Pod Meta-Data
//////////////////////////////////////////////////////////////////////////
**
** Required output file created by the compiler.
**
Uri? output
**
** Required output type. Possible values are 'exe',
** 'winexe', 'library' or 'module'.
**
Str? targetType
**
** Required list of directories to compile. All C# source
** files in each directory will be compiled.
**
Uri[]? srcDirs
**
** List of libraries to link to.
**
Uri[] libs := Uri[,]
**
** Should we skip compiling .NET code? Default only
** runs C# compiler if running on Windows.
**
Bool skip := Env.cur.os != "win32"
//////////////////////////////////////////////////////////////////////////
// Validate
//////////////////////////////////////////////////////////////////////////
private Void validate()
{
if (output == null) throw fatal("Must set BuildCs.output")
if (targetType == null) throw fatal("Must set BuildCs.targetType")
if (srcDirs == null) throw fatal("Must set BuildCs.srcDirs")
}
//////////////////////////////////////////////////////////////////////////
// Dump Env
//////////////////////////////////////////////////////////////////////////
override Void dumpEnv()
{
super.dumpEnv
if (skip)
{
log.out.printLine(" skipped (not windows)")
return
}
oldLevel := log.level
log.level = LogLevel.silent
try
log.out.printLine(" dotnetHome: ${CompileCs(this).dotnetHomeDir}")
catch (Err e)
log.out.printLine(" dotnetHome: $e")
finally
log.level = oldLevel
}
//////////////////////////////////////////////////////////////////////////
// Compile
//////////////////////////////////////////////////////////////////////////
**
** Compile C# source into exe or dll
**
@Target { help = "Compile C# source into exe or dll" }
Void compile()
{
if (skip)
{
log.info("skipping [${scriptDir.name}]")
return
}
validate
log.info("compile [${scriptDir.name}]")
log.indent
// compile source
csc := CompileCs(this)
csc.output = output.toFile
csc.targetType = targetType
csc.src = resolveDirs(srcDirs)
csc.libs = resolveFiles(libs)
csc.run
log.unindent
}
//////////////////////////////////////////////////////////////////////////
// Clean
//////////////////////////////////////////////////////////////////////////
**
** Delete all intermediate and target files
**
@Target { help = "Delete all intermediate and target files" }
Void clean()
{
log.info("clean [${scriptDir.name}]")
log.indent
Delete(this, output.toFile).run
log.unindent
}
//////////////////////////////////////////////////////////////////////////
// Full
//////////////////////////////////////////////////////////////////////////
**
** Run clean, compile
**
@Target { help = "Run clean, compile" }
Void full()
{
clean
compile
}
}