
# default to on for now
DEBUG = 1 ;

# set up debug flags

if $(DEBUG) {
	OPTIM ?= -O0 ;
	CCFLAGS += -g ;
	C++FLAGS += -g ;
	LINKFLAGS += -g ;
} else {
	OPTIM ?= -O2 ;
}

# the location of NewPlan

EUROPA_ROOT ?= [ FDirName $(TOP) .. ] ;

# Full path of the convert2 program
CONVERT2 = [ FDirName $(EUROPA_ROOT) ModelLoader converter convert2 ] ;

# compiler options
if $(CC_OVERRIDE) {
CC = $(CC_OVERRIDE) ;
C++ = $(CC_OVERRIDE) ;
} else {
CC = gcc ;
C++ = g++ ;
}
LINK = $(C++) ;

# os specific parts
if $(OS) = BEOS {
	# compiler options
	LINKLIBS += -lbe -lstdc++.r4 ;
	# parser generation options
	JAVA ?= java ;
}

if $(OS) = SOLARIS {
	# compiler options
	LINKLIBS += -lc ;
	# parser generation options
	JAVA ?= java ;
}

if $(OS) = LINUX {
	# compiler options
	LINKLIBS += -lc ;
	# parser generation options
	JAVA ?= java ;
}

if $(OS) = CYGWIN {
	CCFLAGS += -Wno-deprecated ;
	C++FLAGS += -Wno-deprecated ;
}

ANTLR_OBJECTS = 
	ANTLRException.o ASTFactory.o ASTRefCount.o BaseAST.o
	BitSet.o CharBuffer.o CharScanner.o CommonAST.o
	CommonASTWithHiddenTokens.o CommonHiddenStreamToken.o
	CommonToken.o InputBuffer.o LLkParser.o LexerSharedInputState.o
	MismatchedCharException.o MismatchedTokenException.o
	NoViableAltException.o NoViableAltForCharException.o
	Parser.o ParserSharedInputState.o RecognitionException.o
	String.o Token.o TokenBuffer.o TokenStreamBasicFilter.o
	TokenStreamHiddenTokenFilter.o TokenStreamSelector.o
	TreeParser.o TreeParserSharedInputState.o
	;

rule Antlr
{
	if $(JAVA) {
		local t = $(1) ;
		local g = $(2) ;
		SEARCH on $(g) = $(LOCATE_TARGET) ;
		MakeLocate $(t) : $(LOCATE_TARGET) ;
		runAntlr $(t) : $(g) ;
	}
}

rule runAntlr
{
  Depends $(1) : $(2) ;
  Clean clean : $(1) ;
}

actions runAntlr
{
	cd $(2:P) ;
	$(JAVA) -cp antlrall.jar antlr.Tool $(2:B)$(2:S) ;
}

rule BuildAntlr
{
	local l = $(1:S=$(SUFLIB)) ;
	local antlr = $(SUBDIR) ;
	Depends lib : $(l) ;
	MakeLocate $(l) : [ FDirName $(antlr) lib ] ;
	BuildAntlr1 $(l) $(ANTLR_OBJECTS) : .. ;
	for _object in $(ANTLR_OBJECTS) {
		MakeLocate $(_object) : [ FDirName $(antlr) src ] ;
	}
	BigObjectFromObjects libantlr.o : $(ANTLR_OBJECTS) ;
	Clean cleanAntlr : $(l) $(ANTLR_OBJECTS) ;
}

actions BuildAntlr1
{
	cd $(2) ;
        ./configure --prefix=`pwd` ;
	make install ;
}

NotFile tests ;

rule ParseTest
{
	local _passfile = $(1:S=.pass) ;
	Depends tests : $(_passfile) ;
	DoParseTest $(_passfile) : [ FGristFiles $(1) ] ;
}

rule DoParseTest
{
	Depends $(1) : $(2) ;
	Clean clean : $(1) ;
	MakeLocate $(1) : [ FDirName $(LOCATE_TARGET) ] ;
	SEARCH on $(2) = $(LOCATE_TARGET) ;
	Depends $(1) : parse ;
}

actions DoParseTest
{
        [ FDirName $(TOP) nddlparser parse ] [ FDirName $(2) ] "&&" touch [ FDirName $(1) ] ;
}

rule ConvertModel
{
	local nddl = $(1) ;
	local ddl = $(2) ;

	Depends $(nddl) : $(ddl) ;
	Clean clean : $(nddl) ;
	MakeLocate $(nddl) : [ FDirName $(LOCATE_TARGET) ] ;
	SEARCH on $(ddl) = $(LOCATE_TARGET) ;
	Depends $(nddl) : $(CONVERT2) ;
}

actions ConvertModel 
{
        $(CONVERT2) -n $(1) $(2) ;
}

rule ConvertInitialState
{
	local nddl = $(1) ;
	local init = $(2) ;
	local ddl = $(3) ;

	Depends $(nddl) : $(init) ;
        Depends $(nddl) : $(ddl) ;
	Clean clean : $(nddl) ;
	MakeLocate $(nddl) : [ FDirName $(LOCATE_TARGET) ] ;
	SEARCH on $(init) = $(LOCATE_TARGET) ;
	SEARCH on $(ddl) = $(LOCATE_TARGET) ;
	Depends $(nddl) : $(CONVERT2) ;

	INIT on $(nddl) = $(init) ;
	MODEL on $(nddl) = $(ddl) ;
}

actions ConvertInitialState bind INIT MODEL
{
        $(CONVERT2) -x $(1) -i $(INIT) $(MODEL) ;
}

rule ConvertHeuristics
{
	local nddl = $(1) ;
        local nobr = $(2) ;
	local heur = $(3) ;
	local ddl = $(4) ;

	Depends $(nddl) : $(heur) $(ddl) ;
	Clean clean : $(nddl) ;
	MakeLocate $(nddl) : [ FDirName $(LOCATE_TARGET) ] ;
	SEARCH on $(heur) = $(LOCATE_TARGET) ;
	SEARCH on $(ddl) = $(LOCATE_TARGET) ;
	Depends $(nddl) : $(CONVERT2) ;

	HEUR on $(nddl) = $(heur) ;
	MODEL on $(nddl) = $(ddl) ;
        NOBR on $(nddl) = $(nobr) ;
}

actions ConvertHeuristics bind HEUR MODEL NOBR
{
	$(CONVERT2) -l $(1) -b $(NOBR) -u $(HEUR) $(MODEL) ;
}



ALL_OBJECTS = ;
for _object in $(ANTLR_OBJECTS) {
  ALL_OBJECTS += [ FDirName ModelLoader antlr src $(_object) ] ;
}

rule BigObject
{
  local _objects ;
  local _cygwin_objects ;
  for _source in $(2) {
    local _cygwin_object = $(_source:S=.o) ;
    _cygwin_objects += [ FDirName $(SUBDIR) $(_cygwin_object) ] ;
    local _object = [ FGristFiles $(_cygwin_object) ] ;
    _objects += $(_object) ;
    Object $(_object) : $(_source) ;
  }
  BigObjectFromObjects $(1) : [ FGristFiles $(_objects) ] ;
  ALL_OBJECTS += [ FDirName ModelLoader $(_cygwin_objects) ] ;
  MakeLocate $(1) : [ FDirName $(LOCATE_TARGET) ] ;
}

rule BigObjectFromObjects
{
  Depends $(1) : $(2) ;
  Clean clean : $(1) ;
  MakeLocate $(1) : [ FDirName $(LOCATE_TARGET) ] ;
}

rule BigObjectFromBigObjects
{
  Depends $(1) : $(2) ;
  Clean clean : $(1) ;
  MakeLocate $(1) : [ FDirName $(LOCATE_TARGET) ] ;
}

if $(OS) != CYGWIN {

actions BigObjectFromObjects
{
  ld -r -o $(1) $(2) ;
}

actions BigObjectFromBigObjects
{
  ld -r -o $(1) $(2) ;
}

}

rule DumpObjects {
   Depends $(1) : $(2) ;
}

if $(OS) = CYGWIN {

actions DumpObjects {
   rm -f $(1) ;
   echo MODEL_LOADER_OBJECTS = $(ALL_OBJECTS) > $(1) ;
}

}
