[Assorted-commits] SF.net SVN: assorted: [481] simple-build/trunk
Brought to you by:
yangzhang
From: <yan...@us...> - 2008-02-24 01:11:46
|
Revision: 481 http://assorted.svn.sourceforge.net/assorted/?rev=481&view=rev Author: yangzhang Date: 2008-02-23 17:11:46 -0800 (Sat, 23 Feb 2008) Log Message: ----------- exploratory code Added Paths: ----------- simple-build/trunk/experimental/ simple-build/trunk/experimental/Schema1.scala simple-build/trunk/experimental/Schema2 Added: simple-build/trunk/experimental/Schema1.scala =================================================================== --- simple-build/trunk/experimental/Schema1.scala (rev 0) +++ simple-build/trunk/experimental/Schema1.scala 2008-02-24 01:11:46 UTC (rev 481) @@ -0,0 +1,166 @@ +// +// Attribute types +// + +class Void +object Null extends Void + +abstract class Attr { + def valid: Boolean +} +case class Str extends Attr { + var value: Option[String] = None + var isSet = false + def :=(n: Void) = { + value = None + isSet = true + this + } + def :=(s: String) = { + value = Some(s) + isSet = true + this + } + override def valid = isSet + def get = { + if (!valid) throw new Exception("unset!") + value.get + } + override def toString = getClass.getName + "(" + value + ")" +} +case class Sym extends Str +case class Path(val baseDir: String) extends Str +case class AttrList extends Attr { + import scala.collection.mutable.ArrayBuffer + var values: Option[ArrayBuffer[String]] = None + def :=(n: Void) = { + values = Some(new ArrayBuffer) + this + } + def :=(xs: Seq[String]) = { + if (values == None) values = Some(new ArrayBuffer) + values.get ++= xs + this + } + def +=(x: String) = { + if (values == None) values = Some(new ArrayBuffer) + values.get += x + this + } + def valid = !values.isEmpty + def get = values.get mkString "," + override def toString = + getClass.getName + "(" + (values map (_ mkString ",")) + ")" +} +case class PathList(val baseDir: String) extends AttrList +case class SymList extends AttrList +object Implicits { + implicit def Str2String(s: Str) = s.get + implicit def AttrList2String(xs: AttrList) = xs.get +} +import Implicits._ + +// +// Target types +// + +trait Target { + val name = Sym() + val version = Str() := Null + val descrip = Str() := Null + val srcs = PathList(srcdir) + val compiler = Str() + def emit: String + def valid = true + // XXX +// def valid = { +// this.getClass.getMethods map ( +// _.get(this)) filter ( +// _.isInstanceOf[Attr]) forall ( +// _.asInstanceOf[Attr]valid) +// } +} + +trait JavaPlatformTarget extends Target { + val classpath = PathList(srcdir) := Null + override def emit = <p> + name {name} + version {version} + descrip {descrip} + srcs {srcs} + compiler {compiler} + classpath {classpath} + </p>.text +} +trait JavaPlatformLibrary extends JavaPlatformTarget +trait JavaPlatformProgram extends JavaPlatformTarget { + val mainclass = Sym() + val runner = Str() +} + +trait JavaLanguageMixin extends Target { + compiler := "javac" +} +case class JavaLanguageLibrary extends JavaPlatformLibrary with JavaLanguageMixin +case class JavaLanguageProgram extends JavaPlatformProgram with JavaLanguageMixin { + runner := "java" +} + +trait ScalaMixin extends Target { + compiler := "fsc" +} +case class ScalaLibrary extends JavaPlatformLibrary with ScalaMixin +case class ScalaProgram extends JavaPlatformProgram with ScalaMixin { + runner := "scala" +} + +trait NativeTarget extends Target { + val libs = SymList() := Null + val libpaths = PathList(srcdir) := Null + val ldflags = Str() := Null + override def emit = <p> + name {name} + version {version} + descrip {descrip} + srcs {srcs} + compiler {compiler} + libs {libs} + libpaths {libpaths} + ldflags {ldflags} + </p>.text +} + +trait NativeProgram extends NativeTarget +trait NativeLibrary extends NativeTarget + +trait CMixin extends Target { + compiler := "gcc" + val cflags = Str() := Null +} +trait CppMixin extends Target { + compiler := "g++" + val cxxflags = Str() := Null +} + +trait CProgram extends NativeProgram with CMixin +trait CLibrary extends NativeLibrary with CMixin + +case class CppProgram extends NativeProgram with CppMixin +case class CppLibrary extends NativeLibrary with CppMixin + +// +// Test +// + +object SchemaTest extends Application { + val cpp = new CppProgram { + name := "hello" + srcs := List("hello.cc") + } + println(cpp.emit) + val java = new JavaLanguageProgram { + name := "Hello" + srcs := List("Hello.java") + } + println(java.emit) +} Added: simple-build/trunk/experimental/Schema2 =================================================================== --- simple-build/trunk/experimental/Schema2 (rev 0) +++ simple-build/trunk/experimental/Schema2 2008-02-24 01:11:46 UTC (rev 481) @@ -0,0 +1,101 @@ +target: + fields: + name: sym + version: str + descrip: str + srcs: pathlist + compiler: str + overrides: + version: + descrip: + +java platform target: + extends: + target + fields: + classpath: pathlist + +java platform program: + extends: + java platform target + fields: + mainclass: sym + runner: str + +java language: + extends: + target + overrides: + compiler: "javac" + applies to: java platform + +java program: + extends: + java platform program + java language + overrides: + runner: "java" + +scala language: + extends: [target] + overrides: + compiler: "javac" + applies to: java platform + +scala program: + extends: + java platform program + scala language + name: Hello + runner: scala + +native target: + extends: + target + fields: + flags: strlist + overrides: + flags: [] + +c++: + extends: + native target + overrides: + compiler: g++ + applies to: native target + +c: + extends: + native target + overrides: + compiler: gcc + applies to: native target + +complete native: + extends: + native target: + name: name + "-gprof" // TODO how to do this? + flags: [-pg] + native target: + name: name + "-opt" + flags: [-O3] + native target: + name: name + "-dbg" + flags: [-g3] + +c++ program: + extends: + complete native + c++ + +c program: + extends: + complete native + c + +===== + +java program: + name: Hello + version: 0.1 + srcs: [Hello.java] + +c++ program: + name: hello + srcs: [hello.cc] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |