From 0d18990630b2f2990ed652bd2cf67d6f187e9239 Mon Sep 17 00:00:00 2001 From: sneeker Date: Wed, 20 Dec 2017 12:00:00 +0000 Subject: [PATCH] Install runtime artifacts and verify external builds --- .gitignore | 2 +- Makefile | 11 +++++--- opam | 1 + test/test_codegen.ml | 66 ++++++++++++++++++++++++++++++++++++++++++++ test/test_main.ml | 1 + 5 files changed, 76 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 7c78b53..fbb23ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -_build/ +_build*/ /deltac _bench_out/ bench/bench_results.txt diff --git a/Makefile b/Makefile index d8fd972..41522fc 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ LIBS = unix.cmxa .PHONY: all clean test bench install uninstall -all: deltac $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) $(TEST_EXE) +all: deltac $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) $(RUNTIME_BYTE) $(TEST_EXE) $(BUILD): mkdir -p $(BUILD) @@ -139,9 +139,12 @@ $(RUNTIME_ARCHIVE) $(RUNTIME_NATIVE): $(RT_CMX) ifeq ($(strip $(RT_ML)),) @echo "no runtime sources" else - $(OCAMLOPT) -a -o $@ $(RT_CMX) + $(OCAMLOPT) -a -o $@ $(RT_ORDER) endif +$(RUNTIME_BYTE): $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmo,$(RT_ML)) + $(OCAMLC) -a -o $@ $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmo,$(RT_ML)) + ifeq ($(strip $(TEST_ML)),) TEST_EXE = else @@ -157,12 +160,12 @@ $(BENCH_EXE): $(BUILD)/bench.cmx $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) deltac endif test: $(TEST_EXE) - DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) DELTA_OCAMLOPT="$(OCAMLOPT)" ./$(TEST_EXE) + DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) DELTA_RUNTIME_DIR=$(CURDIR)/$(BUILD) DELTA_OCAMLOPT="$(OCAMLOPT)" ./$(TEST_EXE) bench: $(BENCH_EXE) DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) DELTA_OCAMLOPT="$(OCAMLOPT)" ./$(BENCH_EXE) -install: deltac $(RUNTIME_ARCHIVE) +install: deltac $(RUNTIME_ARCHIVE) $(RUNTIME_BYTE) $(INSTALL) -d $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(INSTALL) -m 755 deltac $(DESTDIR)$(BINDIR)/deltac $(INSTALL) -m 644 $(RUNTIME_ARTIFACTS) $(DESTDIR)$(LIBDIR)/ diff --git a/opam b/opam index 3b350d9..1bcd9e8 100644 --- a/opam +++ b/opam @@ -2,6 +2,7 @@ opam-version: "1.2" name: "delta" version: "0.1.0" maintainer: "deltac@localhost" +authors: [ "deltac@localhost" ] build: [ [make] ] diff --git a/test/test_codegen.ml b/test/test_codegen.ml index fe9aba7..a3777b4 100644 --- a/test/test_codegen.ml +++ b/test/test_codegen.ml @@ -23,6 +23,23 @@ let run command = (try Sys.remove log with _ -> ()); (status, text) +let run_env environment command = + let log = Filename.temp_file "delta_test" ".log" in + let fd = Unix.openfile log [ Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC ] 0o600 in + let argv = Array.of_list command in + let pid = Unix.create_process_env argv.(0) argv environment Unix.stdin fd fd in + let status = snd (Unix.waitpid [] pid) in + Unix.close fd; + let text = Native.read_file log in + (try Sys.remove log with _ -> ()); + (status, text) + +let environment_without name = + Array.of_list + (List.filter + (fun entry -> not (Util.starts_with (name ^ "=") entry)) + (Array.to_list (Unix.environment ()))) + let compile source_path output_path = let command = [ ocamlopt (); "-I"; build_dir (); "-I"; "+unix"; "-o"; output_path; @@ -692,3 +709,52 @@ let generated_differential_cases = ("generated programs match full evaluation on a short run", fun () -> generated_differential_case 2 3); ] + +let install_cases = + [ + ( "the installed compiler builds programs outside the source tree", + fun () -> + let destdir = Filename.concat (Filename.get_temp_dir_name ()) (unique "delta_install") in + Unix.mkdir destdir 0o700; + let make = try Sys.getenv "DELTA_MAKE" with Not_found -> "make" in + let status, output = + run [ make; "-C"; root (); "install"; "DESTDIR=" ^ destdir; "PREFIX=/usr/local" ] + in + check ("install succeeds: " ^ output) (status = Unix.WEXITED 0); + let bindir = Filename.concat destdir "usr/local/bin" in + let libdir = Filename.concat destdir "usr/local/lib/delta" in + check "deltac is installed" (Sys.file_exists (Filename.concat bindir "deltac")); + check "the native runtime is installed" + (Sys.file_exists (Filename.concat libdir "delta_runtime.cmxa")); + check "the bytecode runtime is installed" + (Sys.file_exists (Filename.concat libdir "delta_runtime.cma")); + check "the wire interface is installed" (Sys.file_exists (Filename.concat libdir "wire.cmi")); + let source = Filename.concat destdir "outside.delta" in + write_file source (read_fixture "expensive_order.delta"); + let application = Filename.concat destdir "application" in + let status, output = + run_env (environment_without "DELTA_RUNTIME_DIR") + [ Filename.concat bindir "deltac"; "build"; source; "-o"; application ] + in + check ("the installed compiler builds: " ^ output) (status = Unix.WEXITED 0); + check "the executable exists" (Sys.file_exists application); + let input = Filename.concat destdir "order.sexp" in + write_file input "(1 (record (customer \"Ada\") (total 1500)))\n(2 (record (customer \"Bo\") (total 40)))\n"; + let updates = Filename.concat destdir "update.sexp" in + write_file updates "(batch (insert 3 (record (customer \"Lin\") (total 2200))))\n"; + let status, output = + run_env (environment_without "DELTA_RUNTIME_DIR") + [ application; "--input"; input; "--updates"; updates; "--print-result" ] + in + check "the installed compiler's output runs" (status = Unix.WEXITED 0); + check_equal_string "result" + "(collection (1 (tuple \"Ada\" 300)) (3 (tuple \"Lin\" 440)))" (String.trim output); + let status, _ = + run [ make; "-C"; root (); "uninstall"; "DESTDIR=" ^ destdir; "PREFIX=/usr/local" ] + in + check "uninstall succeeds" (status = Unix.WEXITED 0); + check "deltac is removed" (not (Sys.file_exists (Filename.concat bindir "deltac"))); + check "the runtime is removed" + (not (Sys.file_exists (Filename.concat libdir "delta_runtime.cmxa"))); + Native.remove_dir destdir ); + ] diff --git a/test/test_main.ml b/test/test_main.ml index 1cfd639..c2b26d7 100644 --- a/test/test_main.ml +++ b/test/test_main.ml @@ -388,6 +388,7 @@ let () = Test_harness.run_suite "generated updates" Test_codegen.update_cases; Test_harness.run_suite "wire" Test_codegen.wire_cases; Test_harness.run_suite "cli" Test_codegen.cli_cases; + Test_harness.run_suite "install" Test_codegen.install_cases; Test_harness.run_suite "regression" Test_incremental.regression_cases; Test_harness.run_suite "differential" Test_incremental.differential_cases; Test_harness.run_suite "generated differential" Test_codegen.generated_differential_cases;