[Assorted-commits] SF.net SVN: assorted: [456] simple-build
Brought to you by:
yangzhang
From: <yan...@us...> - 2008-02-16 21:37:39
|
Revision: 456 http://assorted.svn.sourceforge.net/assorted/?rev=456&view=rev Author: yangzhang Date: 2008-02-16 13:37:39 -0800 (Sat, 16 Feb 2008) Log Message: ----------- added simple-build! Added Paths: ----------- simple-build/ simple-build/trunk/ simple-build/trunk/README simple-build/trunk/example.build simple-build/trunk/src/ simple-build/trunk/src/Makefile simple-build/trunk/src/SimpleBuild.scala simple-build/trunk/src/build simple-build/trunk/src/build-templates/ simple-build/trunk/src/build-templates/Makefile simple-build/trunk/src/build-templates/common.mk simple-build/trunk/src/build-templates/cpp simple-build/trunk/src/build-templates/scala simple-build/trunk/src/build-templates/scala.mk.part simple-build/trunk/src/build-templates/variant.mk simple-build/trunk/src/build.bash simple-build/trunk/src/capture-scala-deps simple-build/trunk/src/setup.bash Added: simple-build/trunk/README =================================================================== --- simple-build/trunk/README (rev 0) +++ simple-build/trunk/README 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,4 @@ +Requirements +------------- + +jyaml-1.3.jar Added: simple-build/trunk/example.build =================================================================== --- simple-build/trunk/example.build (rev 0) +++ simple-build/trunk/example.build 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,39 @@ +template: assorted + +hash-join + inherits c++-program + name: Hash-Join + hashjoin <- hashjoin.cc + +hashjoin-tools inherits scala-program + prep <- DbPrep.scala + proc <- LogProc.scala + titles <- Titles.scala + +web(graphs) inherits assorted-project-website + index.html <- README + analysis.html <- doc/analysis.txt + graphs/ <- graphs + +# Standard commands include: +# - doc: generate doxygen, epydoc, scaladoc, javadoc, etc. based on what it +# detects. +# - dist: tar.gz containing autotools, setuptools, etc. +# - + +AssortedProjectWebsite(webdir): + mkdir -p webdir + publish: + ssh asdf + +everything is a goal + inherited goals + rules are lexically scoped (applicable only within defining goal) + +c++-program(name) inherits c++-project(name) +c++-library(name) inherits c++-project(name) +c++-project(name) + gen-autotools + build + doc + asdf Added: simple-build/trunk/src/Makefile =================================================================== --- simple-build/trunk/src/Makefile (rev 0) +++ simple-build/trunk/src/Makefile 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,8 @@ +all: meta/SimpleBuild.class + +meta/SimpleBuild.class: SimpleBuild.scala + mkdir -p meta + fsc -deprecation -unchecked -d meta -cp jyaml-1.3.jar SimpleBuild.scala -sourcepath ~/scom/.. + +run: meta/SimpleBuild.class + scala -cp meta:jyaml-1.3.jar SimpleBuild Added: simple-build/trunk/src/SimpleBuild.scala =================================================================== --- simple-build/trunk/src/SimpleBuild.scala (rev 0) +++ simple-build/trunk/src/SimpleBuild.scala 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,164 @@ +import _root_.commons.Collections._ +import _root_.commons.Control._ +import _root_.commons.Io._ +import _root_.commons.Path._ +import _root_.scala.collection.mutable._ +import _root_.org.ho.yaml._ +import _root_.scala.collection.jcl +import _root_.java.util.regex._ +import _root_.java.io.File + +object SimpleBuild { + case class HandledException(e: Exception) extends Exception(e) + val ext2template = Map( + "c" -> "c", + "cc" -> "cpp", + "cpp" -> "cpp", + "scala" -> "scala" + ) + def err(x: AnyRef) { Console.err println x } + def doOrDie[a](f: => a)(mkmsg: Exception => String) = { + try { f } catch { + case e: Exception => { + err(mkmsg(e)) + throw HandledException(e) + } + } + } + val structspec = """ + mainclass: required symbol + classpath: optional list of paths relative to srcdir joined by ':' default [] + srcs: required list of files relative to srcdir joined by ' ' + """ + val structs = Map( + "scala" -> Map( + "mainclass" -> "symbol", + "classpath" -> "list|srcdir|:", + "srcs" -> "list|srcdir| " + ) + ) + val ids = Iterator from 0 + val basedir = System getenv "SIMPLEBUILD" + val pwd = new File(System getProperty "user.dir").getCanonicalPath + def templateByFilename(s: String) = { + val name = ext2template(s split "\\." last) + val fname = basedir / "build-templates" / name + val template = using (TextReader(fname)) (_ read) + val struct = structs(name) + (template, struct) + } + def instantiate(template: String, aggs: MultiMap[String,String]) = { + val internalVars = new HashMap[String,String] + val tid = ids.next + def substVars(s: String) = + (s /: internalVars.elements) { case (s,(from,to)) => + s replaceAll ("\\$\\(" + from + "\\)", "\\$(" + to + ")") + } + val newLines0 = for (line <- template split "\n") yield { + if (line contains " := ") { + // Assignment. + val Seq(lhs, rhs) = line split " := " + val newLhs = lhs.trim + "_" + tid + val newRhs = substVars(rhs) + internalVars += (lhs.trim -> newLhs) + newLhs + " := " + newRhs + } else { + // Everything else. + substVars(line) + } + } + val goal = Pattern compile "^(\\w+):" + val newLines1 = + for (line <- newLines0) yield { + val m = goal matcher line + if (m find) { + val replacement = "$1-\\$(TARGET_" + tid + ")" + val newLine = m replaceFirst (replacement + ":") + val hd = (newLine split ":")(0) + aggs add (m group 1, hd) + newLine + } else { + line + } + } + newLines1 mkString "\n" + } + def emitMakeFrag(target: String, rules: String) { + using (TextWriter(target + ".mk")) (_ println rules) + } + implicit def node2map(n: YamlNode) = n.asInstanceOf[YamlMap] + implicit def node2seq(n: YamlNode) = n.asInstanceOf[YamlSeq] + implicit def node2str(n: YamlNode) = n.asInstanceOf[YamlStr] + implicit def node2nil(n: YamlNode) = n.asInstanceOf[YamlNil] + abstract class YamlNode + case class YamlSeq(xs: Seq[YamlNode]) extends YamlNode + case class YamlMap(m: Map[YamlNode,YamlNode]) extends YamlNode + case class YamlStr(s: String) extends YamlNode + case class YamlNil extends YamlNode + def yaml(s: String) = { + def r(x: AnyRef): YamlNode = { + x match { + case null => YamlNil() + case x: java.util.HashMap[_,_] => YamlMap(Map({ + val m = x.asInstanceOf[java.util.HashMap[AnyRef,AnyRef]] + for ((a,b) <- new jcl.HashMap(m)) + yield (r(a), r(b)) + } toStream: _*)) + case x: java.util.ArrayList[_] => YamlSeq( + new jcl.ArrayList(x.asInstanceOf[java.util.ArrayList[String]]) map r + ) + case x: String => YamlStr(x) + } + } + r(Yaml.load(s)) + } + def main(args: Array[String]) { + try { + val rawfname = if (args.length > 0) args(0) else "build" + val infile = new File(rawfname).getCanonicalFile + val fname = infile.getPath + val srcdir = infile.getParent + // Read build file. + val contents = doOrDie { + using (TextReader(fname)) (_.read) + } { + e => "could not open file: " + fname + } + val build = yaml(contents) + // For each target, emit a make frag. + val aggs = multimap(List[(String,String)]()) + val targets = for ((target, attrs) <- build.m) yield { + val srcs = attrs.m(YamlStr("srcs")).xs + val (template,struct) = templateByFilename(srcs(0).s) + val hdrs = ( + for ((k,v) <- attrs.m.elements ++ List((YamlStr("target"), target)) + if v.isInstanceOf[YamlStr] || v.isInstanceOf[YamlSeq]) + yield k.s.toUpperCase + " := " + (v match { + case YamlSeq(xs) => xs map (_.s) map (rel2abs(srcdir,_)) mkString (struct(k.s) split "|" last) + case YamlStr(s) => s + }) + ) mkString "\n" + val site = "PREFIX := /opt/" + target.s + "\nBINDIR := $(PREFIX)/bin\n" + val rules = instantiate(site + '\n' + hdrs + "\n\n" + template, aggs) + emitMakeFrag(target.s, rules) + target.s + } + // Makefiles. + using (TextWriter("GNUmakefile")) { w => + w println "OUTDIR := " + pwd / "out" + w println "SRCDIR := " + srcdir + w println "SRCPATH := " + srcdir + w println ("all: " + (targets mkString " ")) + w println(targets map ("include "+_+".mk") mkString "\n") + w println ((for ((k,vs) <- aggs) yield (k + ": " + (vs mkString " "))) mkString "\n") + w println ("clean:\n\trm -rf out") + w println ("GNUmakefile: " + srcdir + "/build\n\tbuild.bash build") + w println (".PHONY: clean") + } + } catch { + // Catch-all for handled exceptions (the rest should be displayed in + // their full ugly glory). + case HandledException(e) => () + } + } +} Added: simple-build/trunk/src/build =================================================================== --- simple-build/trunk/src/build (rev 0) +++ simple-build/trunk/src/build 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,8 @@ +simple-build: + mainclass: SimpleBuild + srcs: [SimpleBuild.scala] + classpath: [jyaml-1.3.jar] + +#hashjoin: +# srcs: [hashjoin.cc] +# libs: [pthreads] Added: simple-build/trunk/src/build-templates/Makefile =================================================================== --- simple-build/trunk/src/build-templates/Makefile (rev 0) +++ simple-build/trunk/src/build-templates/Makefile 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,9 @@ +TARGET := asdf +SRCS := src/asdf.c +OUTDIR := out +include common.mk + +TARGET := Asdf +SRCDIR := . +SRCS := Asdf.scala +include scala.mk Added: simple-build/trunk/src/build-templates/common.mk =================================================================== --- simple-build/trunk/src/build-templates/common.mk (rev 0) +++ simple-build/trunk/src/build-templates/common.mk 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,12 @@ +VARIANT := dbg +VARIANT_CFLAGS := -g3 +include variant.mk + +VARIANT := opt +VARIANT_CFLAGS := -O3 +include variant.mk + +clean: + rm -rf $(OUTDIR) + +.PHONY: clean Added: simple-build/trunk/src/build-templates/cpp =================================================================== --- simple-build/trunk/src/build-templates/cpp (rev 0) +++ simple-build/trunk/src/build-templates/cpp 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,7 @@ +[instantiate variant.mk] + VARIANT := dbg + VARIANT_CFLAGS := -g3 + +[instantiate variant.mk] + VARIANT := opt + VARIANT_CFLAGS := -O3 Added: simple-build/trunk/src/build-templates/scala =================================================================== --- simple-build/trunk/src/build-templates/scala (rev 0) +++ simple-build/trunk/src/build-templates/scala 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,38 @@ +# Output locations. + +SCRIPT := $(OUTDIR)/$(TARGET) +ifeq (,$(VERSION)) + JAR := $(OUTDIR)/$(TARGET).jar +else + JAR := $(OUTDIR)/$(TARGET)-$(VERSION).jar +endif +CLASSDIR := $(OUTDIR)/$(TARGET)-classes + +# Flags. + +SRCPATH := $(SRCPATH):$(SCALA_COMMONS_SRC) +SFLAGS := -deprecation -unchecked -sourcepath $(SRCPATH) -d $(CLASSDIR) -cp $(CLASSPATH) +SCALAC := capture-scala-deps $(JAR) $(OUTDIR)/.deps fsc -verbose + +$(TARGET): $(SCRIPT) $(JAR) + +$(SCRIPT): $(MAKEFILE_LIST) + mkdir -p $(@D) + echo "#!/usr/bin/env bash\n\nJAVA_OPTS=\"$(JRUNFLAGS) \$${JAVA_OPTS:-}\" exec scala -cp $(JAR):$(CLASSPATH) $(MAINCLASS) \"\$$@\"" > $(SCRIPT) + chmod +x $(SCRIPT) + +$(JAR): $(SRCS) + mkdir -p $(CLASSDIR) + $(SCALAC) $(SFLAGS) $< + jar cf $@ -C $(CLASSDIR) . + +-include $(OUTDIR)/.deps + +install: $(TARGET) + mkdir -p $(BINDIR) + cp $(SCRIPT) $(BINDIR) + +clean: + rm -rf $(SCRIPT) $(JAR) $(CLASSDIR) + +.PHONY: $(TARGET) clean Added: simple-build/trunk/src/build-templates/scala.mk.part =================================================================== --- simple-build/trunk/src/build-templates/scala.mk.part (rev 0) +++ simple-build/trunk/src/build-templates/scala.mk.part 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,14 @@ +# Global environment variable (if missing, then Scala Commons should be +# available on the classpath). + +SCALA_COMMONS_SRC := ~/scom + +# Project settings. + +TARGET := myapp +MAINCLASS := myapp.MyApp +OUTDIR := out +SRCPATH := . +SRCS := MyApp.scala Other.scala +JRUNFLAGS := -Xmx512M +CLASSPATH := Added: simple-build/trunk/src/build-templates/variant.mk =================================================================== --- simple-build/trunk/src/build-templates/variant.mk (rev 0) +++ simple-build/trunk/src/build-templates/variant.mk 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,34 @@ +OUTDIR := $(OUTDIR)/$(VARIANT) +CFLAGS := $(CFLAGS) $(CFLAGS) +CXXFLAGS := $(CXXFLAGS) $(CXXFLAGS) +CPPFLAGS := $(CPPFLAGS) +LDFLAGS := $(LDFLAGS) $(LIBS) + +OBJS := $(foreach src,$(SRCS),$(OUTDIR)/$(patsubst %.c,%.o,$(src))) + +CC := gcc +CXX := g++ + +$(VARIANT): $(OUTDIR)/$(TARGET) + +$(OUTDIR)/$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +$(OUTDIR)/%.o: %.c + mkdir -p $(@D) + $(CC) $(CPPFLAGS) $(CFLAGS) -MD -c -o $@ $< + +$(OUTDIR)/%.o: %.cc + mkdir -p $(@D) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MD -c -o $@ $< + +$(OUTDIR)/.deps: $(shell find $(OUTDIR) -name '*.d' 2> /dev/null || true) + mkdir -p $(OUTDIR) + [ "$^" ] && cat $^ > $@ + +-include $(OUTDIR)/.deps + +clean: + rm -rf $(OUTDIR) + +.PHONY: clean Added: simple-build/trunk/src/build.bash =================================================================== --- simple-build/trunk/src/build.bash (rev 0) +++ simple-build/trunk/src/build.bash 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +. common.bash + +userfiles=( AUTHORS ChangeLog NEWS README ) + +build() { + # XXX fix this path (assume it's installed) + "$( dirname "$0" )/out/simple-build" "$@" +} + +gnu-proj() { + # Find all includes. + # Generate rules. + touch -a "${userfiles[@]}" + autoreconf -iv +} + +clean() { + [ -f Makefile ] && make -s distclean + rm -rf aclocal.m4 config.h.in configure COPYING INSTALL install-sh missing depcomp autom4te.cache Makefile.in + rm-empty "${userfiles[@]}" +} + +"$@" Property changes on: simple-build/trunk/src/build.bash ___________________________________________________________________ Name: svn:executable + * Added: simple-build/trunk/src/capture-scala-deps =================================================================== --- simple-build/trunk/src/capture-scala-deps (rev 0) +++ simple-build/trunk/src/capture-scala-deps 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -o errexit -o nounset + +target="$1" +depsfile="$2" +shift; shift + +# Get the top-level source files. This is no longer used. +mainsrcs=() +for i in "$@" ; do + if [[ "${i%.scala}" != "$i" ]] + then mainsrcs=( "${mainsrcs[@]:-$i}" "$i" ) + fi +done + +# Run the compiler. +"$@" | while read line ; do + if [[ "${line#[}" == "$line" ]] ; then + # Line doesn't start with '[' (normal output). + echo "$line" + else + # Line starts with '[' (verbose output). + echo "$line" 1>&3 + fi +done 3> >( + { + # Parse just the verbose output and emit the deps file. + echo "$target: \\" + sed -n ' + /^\[loaded source file / { + s/^\[loaded source file \(.*\) in [[:digit:]]*ms\]/\1/ + p + } + ' | sed ' + { s/^/\t/; s/$/ \\/ } + $ { a\\t + } + ' + } > "$depsfile" +) Property changes on: simple-build/trunk/src/capture-scala-deps ___________________________________________________________________ Name: svn:executable + * Added: simple-build/trunk/src/setup.bash =================================================================== --- simple-build/trunk/src/setup.bash (rev 0) +++ simple-build/trunk/src/setup.bash 2008-02-16 21:37:39 UTC (rev 456) @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +pkg=simple-build +. simple-setup.bash + +install bin/ build.bash capture-scala-deps Property changes on: simple-build/trunk/src/setup.bash ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |