OSDN Git Service

add AVM2 instructions
[happyabc/happyabc.git] / OMakefile
index 30394af..cb16c73 100644 (file)
--- a/OMakefile
+++ b/OMakefile
-PREFIX =
+# ------------------------------
+# global configuration
+# ------------------------------
+PREFIX=
        if $(not $(defined PREFIX))
                value /usr/local
        else
                value $(PREFIX)
-VERSION=
-       if $(not $(defined VERSION))
-               value 0.4.1[2009-xx-xx]+auto-import
+ENABLE_DEBUG=
+       if $(not $(defined ENABLE_DEBUG))
+               value false
+       else
+               value $(ENABLE_DEBUG)
+
+ENABLE_NATIVE=
+       if $(not $(defined ENABLE_NATIVE))
+               value true
+       else
+               value $(ENABLE_NATIVE)
+
+if $(file-exists VERSION)
+       VERSION=$(shell head -1 VERSION)
+       export
+else
+       VERSION=local-HEAD
+       export
+
+# ocamlfind
+USE_OCAMLFIND = true
 
+if $(not $(OCAMLFIND_EXISTS))
+   eprintln('This project requires ocamlfind, but is was not found.')
+   eprintln('You need to install ocamlfind and run "omake --configure".')
+   exit 1
+
+# behavior as traditional cpp
+CPPFLAGS=-traditional-cpp
+
+OCAML_WARN_FLAGS=-w A -warn-error A
+OCAMLFLAGS=$`(OCAML_WARN_FLAGS)
+
+.PHONY: all install config clean package
+# ------------------------------
+# util function
+# ------------------------------
 Shell. +=
-    ounit-postproc(argv) =
-      (grep "FAIL\|ERROR" && exit 1) || exit 0
     ocaml-clean(argv) =
-      rm -f *.cm[iox] *.o *.omc *.opt *.run *~ $(argv) *.cmxa *.a *.spot *.annot
+      rm -f *.cm[aiox] *.o *.omc *.opt *.run *~ $(argv) *.cmxa *.a *.spot *.spit *.annot *-runner
+
+public.AddDepend(target,files) =
+    section
+       .SCANNER: $(target) :
+               echo "$(target) : $(files)"
 
+# ------------------------------
+# camlp4 rules
+# ------------------------------
+public.UseCamlp4(files) =
+       protected.CAMLP4CMO = $(addprefix $(ROOT)/camlp4/,$(addsuffix .cmo,$(files)))
+       OCAMLPPFLAGS+=-pp 'camlp4o $(CAMLP4CMO)'
+       OCAMLDEPFLAGS+=-pp 'camlp4o $(CAMLP4CMO)'
+       export
 
-.PHONY: clean all install install-win32 config config-clean
-.SUBDIRS: scm xml driver base
+       .SCANNER: scan-ocaml-%.ml: %.ml $(CAMLP4CMO)
 
-habc-scm$(EXE): scm/src/habc-scm$(EXE)
-       cp $^ .
+# ------------------------------
+# package
+# ------------------------------
+public.MyOCamlPackage(name, files) =
+   # XXX: JYH: these variables should be marked private in 0.9.9
+   protected.OFILES   = $(addsuffix $(EXT_OBJ), $(files))
+   protected.CMOFILES = $(addsuffix .cmo, $(files))
+   protected.CMXFILES = $(addsuffix .cmx, $(files))
 
-habc-xml$(EXE): xml/src/habc-xml$(EXE)
-       cp $^ .
+   protected.OBJ       = $(file $(name)$(EXT_OBJ))
+   protected.CMO       = $(file $(name).cmo)
+   protected.CMX       = $(file $(name).cmx)
+   protected.CMI       = $(file $(name).cmi)
+   protected.MLI       = $(file $(name).mli)
 
-habc$(EXE) : driver/habc$(EXE)
-       cp $^ .
+   protected.BYTE_TARGETS   = $(CMO)
+   protected.NATIVE_TARGETS = $(CMX) $(OBJ)
 
-PROGRAM = habc$(EXE) habc-xml$(EXE) habc-scm$(EXE)
+   protected.TARGETS = $(CMI)
+   if $(NATIVE_ENABLED)
+       TARGETS += $(NATIVE_TARGETS)
+       export
 
+   if $(BYTE_ENABLED)
+       TARGETS += $(BYTE_TARGETS)
+       export
 
+   #
+   # Link commands
+   #
+   protected.BYTE_DEPS = $(CMOFILES)
+   if $(and $(not $(NATIVE_ENABLED)), $(target-exists $(MLI)))
+      BYTE_DEPS += $(CMI)
+      export
+   else
+      BYTE_TARGETS += $(CMI)
+      export
 
-all: config $(PROGRAM)
+   protected.NATIVE_DEPS = $(CMXFILES) $(OFILES)
+   if $(target-exists $(MLI))
+      NATIVE_DEPS += $(CMI)
+      export
+   else
+      NATIVE_TARGETS += $(CMI)
+      export
 
-.DEFAULT: all
+   if $(target-exists $(MLI))
+      $(CMI): $(MLI) :scanner: scan-ocaml-$(name).mli
+           $(OCamlC) -c $<
+   elseif $(NATIVE_ENABLED)
+      $(NATIVE_TARGETS) $(CMI): $(NATIVE_DEPS)
+           $(OCAMLFIND) $(OCAMLOPTLINK) $(LAZY_OCAMLFINDFLAGS) $(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
+               $(OCAMLOPTFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMX) $(OCamlLinkSort $(CMXFILES))
+   else
+      $(BYTE_TARGETS) $(CMI): $(BYTE_DEPS)
+           $(OCAMLFIND) $(OCAMLC) $(LAZY_OCAMLFINDFLAGS) $(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
+               $(OCAMLCFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMO) $(OCamlLinkSort $(CMOFILES))
+
+   return $(TARGETS)
 
 # ------------------------------
-# clean
+# ounit
 # ------------------------------
-clean:
-       ocaml-clean *.abc $(PROGRAM) OMakefile.config base/config.ml
+OUNIT_SRC_DIR=./
+OUNIT_LIBS[]=
+
+public.OUnitTest(name,files) =
+       protected.test_file = $(addsuffix Test,$(name))
+       protected.target    = $(addsuffix -runner,$(test_file))
+       protected.src_files = $(addprefix $(OUNIT_SRC_DIR),$(files))
+
+       .PHONY: check check-$(name) clean check-detail-$(name) check-detail
+       OCamlProgram($(target), $(test_file) $(src_files) $(OUNIT_LIBS))
+
+       check-$(name): $(target)
+               $(addprefix ./,$(target))
+
+       check-detail-$(name): $(target)
+               ($(addprefix ./,$(target)) -verbose ; true) | tee -a $(ROOT)/unittest.log
+
+       check: check-$(name)
+       check-detail: check-detail-$(name)
+
+       export
 
-config-clean:
-       rm -rf OMakefile.config base/config.ml
+# ------------------------------
+# other rules
+# ------------------------------
+%.mli : %.mlip
+    @rm -f $@
+    @echo "(* CAUTION: this is a generated file.  If you edit it, all changes will be lost! *)" > $@
+    $(CPP) $(CPPFLAGS) $*.mlip >> $@
+    @chmod 444 $@
+
+.SCANNER: %.mli : %.mlip
+    $(CPP) $(CPPFLAGS) -M $< ;  true
+
+%.ml: %.mlp
+    @rm -f $@
+    @echo "(* CAUTION: this is a generated file.  If you edit it, all changes will be lost! *)" > $@
+    $(CPP) $(CPPFLAGS) $*.mlp >> $@
+    @chmod 444 $@
+
+.SCANNER: %.ml : %.mlp
+    $(CPP) $(CPPFLAGS) -M $< /dev/null ; true
 
 # ------------------------------
 # config
 # ------------------------------
-config: OMakefile.config base/config.ml
+config: OMakefile.config config.ml
 
 .INCLUDE: OMakefile.config
-       if $(not $(file-exists $@))
+       if $(mem config,$(TARGETS))
+               rm -f $@
                if $(and $(defined RELATIVE),$(RELATIVE))
                        echo LIB_DIR=$(PREFIX) >> $@
                        echo SHARE_DIR=$(PREFIX) >> $@
@@ -68,23 +195,72 @@ config: OMakefile.config base/config.ml
                        else
                                echo BIN_DIR=$(BIN_DIR) >> $@
 
-base/config.ml:
-       if $(not $(file-exists $@))
+               if $(shell-success-null ocamlc$(if $(OCAMLC_OPT_EXISTS), .opt) -annot)
+                       @echo "static.OCAMLFLAGS +=-annot" >> $@
+               else
+                       @echo "static.OCAMLFLAGS +=-dtypes" >> $@
+               if $(ENABLE_DEBUG)
+                       @echo "static.OCAMLFLAGS +=-g" >> $@
+               if $(ENABLE_NATIVE)
+                       @echo "static.NATIVE_ENABLED = true"  >> $@
+                       @echo "static.BYTE_ENABLED   = false" >> $@
+               else
+                       @echo "static.NATIVE_ENABLED = false" >> $@
+                       @echo "static.BYTE_ENABLED   = true"  >> $@
+
+
+       if $(not $(file-exists OMakefile.config))
+               @echo "Please refer to the installation instructions in file README.mkdn."
+               @echo "If you've just unpacked the distribution, something like"
+               @echo "   omake config"
+               @echo "   omake all"
+               @echo "   omake install"
+               @echo "should work.  But see the file README.mkdn for more details."
+
+config.ml:
+       if $(mem config,$(TARGETS))
+               rm -f $@
                echo 'let version = "$(VERSION)"' >> $@
                if $(and $(defined RELATIVE),$(RELATIVE))
-                       @echo 'let base = Filename.dirname Sys.executable_name' >> $@
-                       @echo 'let default_includes = [Filename.concat base "./lib";"."]' >> $@
-                       @echo 'let default_template = Filename.concat base "./template.xml"' >> $@
+                       @echo 'let bin_dir   = Str.global_replace (Str.regexp "\\\\") "/" (Filename.dirname Sys.executable_name)' >> $@
+                       @echo 'let share_dir = bin_dir' >> $@
+                       @echo 'let lib_dir   = bin_dir' >> $@
                else
-                       @echo 'let default_includes = ["$(LIB_DIR)";"."]' >> $@
-                       @echo 'let default_template = "$(SHARE_DIR)/template.xml"' >> $@
-                       @echo 'let bin_dir = "$(BIN_DIR)"' >> $@
-                       @echo 'let share_dir = "$(SHARE_DIR)"' >> $@
-                       @echo 'let lib_dir = "$(LIB_DIR)"' >> $@
+                       @echo 'let bin_dir   = "$(ocaml-escaped  $(BIN_DIR))"' >> $@
+                       @echo 'let share_dir = "$(ocaml-escaped  $(SHARE_DIR))"' >> $@
+                       @echo 'let lib_dir   = "$(ocaml-escaped  $(LIB_DIR))"' >> $@
+               @echo 'let default_includes = [lib_dir;"."]' >> $@
+               @echo 'let default_template = share_dir ^ "/template.xml"' >> $@
                @echo 'let path_sep="$(PATHSEP)"' >> $@
                @echo 'let exe="$(EXE)"' >> $@
 
 
+################################################
+OCAMLINCLUDES += $(ROOT)
+.SUBDIRS: scm driver base lib camlp4 swflib link
+
+# ------------------------------
+# all
+# ------------------------------
+
+public.CopyFrom(paths) =
+       PROGRAMS=
+       foreach(path,$(paths))
+               protected.PROG = $(basename $(path))
+               $(PROG) : $(path)
+                       ln-or-cp $(file $(path)) $(PROG)
+               PROGRAMS += $(PROG)
+               export
+       return $(PROGRAMS)
+
+
+
+PROGRAM = $(CopyFrom scm/habc-scm$(EXE) driver/habc$(EXE) link/habc-link$(EXE))
+
+all: config $(PROGRAM) lib
+
+.DEFAULT: all
+
 # ------------------------------
 # install
 # ------------------------------
@@ -92,11 +268,21 @@ install: $(PROGRAM)
        mkdir -p $(BIN_DIR)
        mkdir -p $(LIB_DIR)
        mkdir -p $(SHARE_DIR)
+       mkdir -p $(SHARE_DIR)/example
        $(INSTALL) $(PROGRAM)   $(BIN_DIR)
        $(INSTALL) share/habc/* $(SHARE_DIR)
+       $(INSTALL) example/*    $(SHARE_DIR)/example/
        $(INSTALL) lib/habc/*   $(LIB_DIR)
+       if $(or $(equal Win32,$(OSTYPE)),$(equal Cygwin,$(OSTYPE)))
+               $(INSTALL) win32/swfmill/* $(BIN_DIR)/
+               $(INSTALL) README.mkdn $(BIN_DIR)/
+
+# ------------------------------
+# other
+# ------------------------------
+clean:
+       ocaml-clean *.abc $(PROGRAM)
+
+package:
+       git archive --format=tar --prefix=habc-$(shell cat VERSION)-src/ HEAD | gzip > habc-$(shell cat VERSION)-src.tar.gz
 
-install-win32: $(PROGRAM) install
-       mkdir -p $(PREFIX)/
-       $(INSTALL) win32/swfmill/* $(PREFIX)/
-       $(INSTALL) README.mkdn $(PREFIX)/
\ No newline at end of file