mojo/syncbase: Refactored the Makefile so the shared mojo parts of the
Makefile is in mojo/shared/mojo.mk

MultiPart: 1/2
Change-Id: I0c8ea8f5992a0d49a07d4b79a623aca16578f5ca
diff --git a/Makefile b/Makefile
index cec05ee..07a4870 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,10 @@
-SHELL := /bin/bash -euo pipefail
 PWD := $(shell pwd)
-V23_GOPATH := $(shell echo `v23 run env | grep GOPATH | cut -d\= -f2`)
 DART_FILES := $(shell find dart/bin dart/lib dart/test sky_demo/lib -name "*.dart" -not -path "dart/lib/gen/*")
 GO_FILES := $(shell find go/src -name "*.go")
 V23_GO_FILES := $(shell find $(V23_ROOT) -name "*.go")
 
+include ../shared/mojo.mk
+
 # Flags for Syncbase service running as Mojo service.
 # See v.io/x/ref/runtime/internal/mojo_util.go for the wonderful magic that
 # makes this work.
@@ -19,22 +19,6 @@
 endif
 
 ifdef ANDROID
-	# Configure compiler and linker for Android.
-	export GOROOT := $(MOJO_DIR)/src/third_party/go/tool/android_arm
-	export CGO_ENABLED := 1
-	export GOOS := android
-	export GOARCH := arm
-	export GOARM := 7
-
-	ANDROID_NDK := $(V23_ROOT)/third_party/android/ndk-toolchain
-
-	export CC := $(ANDROID_NDK)/bin/arm-linux-androideabi-gcc
-	export CXX := $(ANDROID_NDK)/bin/arm-linux-androideabi-g++
-
-	MOJO_ANDROID_FLAGS := --android
-	MOJO_BUILD_DIR := $(MOJO_DIR)/src/out/android_Debug
-	MOJO_SHARED_LIB := $(PWD)/gen/lib/android/libsystem_thunk.a
-	MOJO_SHELL_PATH := $(MOJO_BUILD_DIR)/apks/MojoShell.apk
 	SKY_BUILD_DIR := $(SKY_DIR)/src/out/android_Debug
 	ETHER_BUILD_DIR := $(PWD)/gen/mojo/android
 
@@ -49,12 +33,6 @@
 	APP_HOME_DIR = /data/data/org.chromium.mojo.shell/app_home
 	V23_MOJO_FLAGS += --logtostderr=true --root-dir=$(APP_HOME_DIR)/syncbase_data
 else
-	# Configure compiler and linker for Linux.
-	export GOROOT := $(MOJO_DIR)/src/third_party/go/tool/linux_amd64
-
-	MOJO_BUILD_DIR := $(MOJO_DIR)/src/out/Debug
-	MOJO_SHARED_LIB := $(PWD)/gen/lib/linux_amd64/libsystem_thunk.a
-	MOJO_SHELL_PATH := $(MOJO_BUILD_DIR)/mojo_shell
 	SKY_BUILD_DIR := $(SKY_DIR)/src/out/Debug
 	ETHER_BUILD_DIR := $(PWD)/gen/mojo/linux_amd64
 
@@ -63,41 +41,14 @@
 	V23_MOJO_FLAGS += --root-dir=/tmp/syncbase_data
 endif
 
-GOPATH := $(V23_GOPATH):$(MOJO_DIR):$(MOJO_DIR)/third_party/go:$(MOJO_BUILD_DIR)/gen/go:$(PWD)/go:$(PWD)/gen/go
-
 # NOTE(nlacasse): Running Go Mojo services requires passing the
 # --enable-multiprocess flag to mojo_shell.  This is because the Go runtime is
 # very large, and can interfere with C++ memory if they are in the same
 # process.
-MOJO_SHELL_FLAGS := -v --enable-multiprocess \
-	--config-alias MOJO_BUILD_DIR=$(MOJO_BUILD_DIR) \
+MOJO_SHELL_FLAGS := $(MOJO_SHELL_FLAGS) \
 	--config-alias ETHER_DIR=$(PWD) \
 	--config-alias ETHER_BUILD_DIR=$(ETHER_BUILD_DIR)
 
-LDFLAGS := -shared
-
-# Compiles a Go program and links against the Mojo C library.
-# $1 is input filename.
-# $2 is output filename.
-define MOGO_BUILD
-	mkdir -p $(dir $2)
-	GOPATH="$(GOPATH)" \
-	CGO_CFLAGS="-I$(MOJO_DIR)/src $(CGO_CFLAGS)" \
-	CGO_CXXFLAGS="-I$(MOJO_DIR)/src $(CGO_CXXFLAGS)" \
-	CGO_LDFLAGS="-L$(dir $(MOJO_SHARED_LIB)) -lsystem_thunk $(CGO_LDFLAGS)" \
-	$(GOROOT)/bin/go build -o $2 -tags=mojo -ldflags="$(LDFLAGS)" -buildmode=c-shared $1
-	rm -f $(basename $2).h
-endef
-
-# Generates go bindings from .mojom file.
-# $1 is input filename.
-# $2 is output directory.
-# $3 is language (go, dart, ...).
-define MOJOM_GEN
-	mkdir -p $2
-	$(MOJO_DIR)/src/mojo/public/tools/bindings/mojom_bindings_generator.py $1 -d . -o $2 -g $3
-endef
-
 .DELETE_ON_ERROR:
 
 all: test
@@ -106,7 +57,7 @@
 build: $(ETHER_BUILD_DIR)/echo_server.mojo  $(ETHER_BUILD_DIR)/syncbase_server.mojo
 
 # Builds mounttabled, principal, and syncbased.
-bin: $(V23_GO_FILES) | env-check
+bin: $(V23_GO_FILES) | syncbase-env-check
 	v23 go build -a -o $@/mounttabled v.io/x/ref/services/mounttable/mounttabled
 	v23 go build -a -o $@/principal v.io/x/ref/cmd/principal
 	v23 go build -a -o $@/syncbased v.io/syncbase/x/ref/services/syncbase/syncbased
@@ -117,18 +68,13 @@
 	./bin/principal seekblessings --v23.credentials creds
 	touch $@
 
-# Builds the library that Mojo services must be linked with.
-$(MOJO_SHARED_LIB): | env-check
-	mkdir -p $(dir $@)
-	ar rcs $@ $(MOJO_BUILD_DIR)/obj/mojo/public/platform/native/system.system_thunks.o
-
 .PHONY: gen-mojom
 gen-mojom: dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart gen/go/src/mojom/echo/echo.mojom.go
 gen-mojom: dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart gen/go/src/mojom/syncbase/syncbase.mojom.go
 
 dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart: mojom/echo.mojom
 dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart: mojom/syncbase.mojom
-dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart: | env-check
+dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart: | synbase-env-check
 	$(call MOJOM_GEN,$<,dart/lib/gen,dart)
 	# TODO(nlacasse): mojom_bindings_generator creates bad symlinks on dart
 	# files, so we delete them.  Stop doing this once the generator is fixed.
@@ -137,11 +83,11 @@
 
 gen/go/src/mojom/echo/echo.mojom.go: mojom/echo.mojom
 gen/go/src/mojom/syncbase/syncbase.mojom.go: mojom/syncbase.mojom
-gen/go/src/mojom/echo/echo.mojom.go gen/go/src/mojom/syncbase/syncbase.mojom.go: | env-check
+gen/go/src/mojom/echo/echo.mojom.go gen/go/src/mojom/syncbase/syncbase.mojom.go: | synbase-env-check
 	$(call MOJOM_GEN,$<,gen,go)
 	gofmt -w $@
 
-$(ETHER_BUILD_DIR)/echo_server.mojo: $(GO_FILES) $(MOJO_SHARED_LIB) gen/go/src/mojom/echo/echo.mojom.go | env-check
+$(ETHER_BUILD_DIR)/echo_server.mojo: $(GO_FILES) $(MOJO_SHARED_LIB) gen/go/src/mojom/echo/echo.mojom.go | syncbase-env-check
 	$(call MOGO_BUILD,$(PWD)/go/src/echo_server.go,$@)
 
 # TODO(nlacasse): These target-specific variables will affect this task and all
@@ -153,7 +99,7 @@
 $(ETHER_BUILD_DIR)/syncbase_server.mojo: CGO_CXXFLAGS := -I$(THIRD_PARTY_LIBS)/leveldb/include
 $(ETHER_BUILD_DIR)/syncbase_server.mojo: CGO_LDFLAGS := -L$(THIRD_PARTY_LIBS)/leveldb/lib -lleveldb -L$(THIRD_PARTY_LIBS)/snappy/lib -lsnappy
 $(ETHER_BUILD_DIR)/syncbase_server.mojo: LDFLAGS := -X v.io/x/ref/runtime/internal.commandLineFlags '$(V23_MOJO_FLAGS)'
-$(ETHER_BUILD_DIR)/syncbase_server.mojo: $(GO_FILES) $(V23_GO_FILES) $(MOJO_SHARED_LIB) gen/go/src/mojom/syncbase/syncbase.mojom.go | env-check
+$(ETHER_BUILD_DIR)/syncbase_server.mojo: $(GO_FILES) $(V23_GO_FILES) $(MOJO_SHARED_LIB) gen/go/src/mojom/syncbase/syncbase.mojom.go | synbase-env-check
 	$(call MOGO_BUILD,v.io/syncbase/x/ref/services/syncbase/syncbased,$@)
 
 # Formats dart files to follow dart style conventions.
@@ -179,36 +125,27 @@
 	cd sky_demo && pub get
 
 .PHONY: run-syncbase-example
-run-syncbase-example: $(ETHER_BUILD_DIR)/syncbase_server.mojo dart/packages dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart | env-check
+run-syncbase-example: $(ETHER_BUILD_DIR)/syncbase_server.mojo dart/packages dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart | synbase-env-check
 	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/syncbase_example.dart
 
 .PHONY: run-echo-example
-run-echo-example: $(ETHER_BUILD_DIR)/echo_server.mojo dart/packages dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart | env-check
+run-echo-example: $(ETHER_BUILD_DIR)/echo_server.mojo dart/packages dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart | synbase-env-check
 	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/echo_example.dart
 
 .PHONY: run-sky-demo
 run-sky-demo: MOJO_SHELL_FLAGS += --config-alias SKY_DIR=$(SKY_DIR) --config-alias SKY_BUILD_DIR=$(SKY_BUILD_DIR)
-run-sky-demo: $(ETHER_BUILD_DIR)/echo_server.mojo sky_demo/packages $(ETHER_BUILD_DIR)/syncbase_server.mojo dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart | env-check
+run-sky-demo: $(ETHER_BUILD_DIR)/echo_server.mojo sky_demo/packages $(ETHER_BUILD_DIR)/syncbase_server.mojo dart/lib/gen/dart-pkg/mojom/lib/mojo/echo.mojom.dart dart/lib/gen/dart-pkg/mojom/lib/mojo/syncbase.mojom.dart | synbase-env-check
 ifndef SKY_DIR
 	$(error SKY_DIR is not set)
 endif
 	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/sky_demo/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) 'mojo:window_manager https://mojo.v.io/sky_demo/lib/main.dart'
 
 .PHONY: test
-test: dart/packages $(ETHER_BUILD_DIR)/echo_server.mojo $(ETHER_BUILD_DIR)/syncbase_server.mojo gen-mojom | env-check
+test: dart/packages $(ETHER_BUILD_DIR)/echo_server.mojo $(ETHER_BUILD_DIR)/syncbase_server.mojo gen-mojom | synbase-env-check
 	$(MOJO_DIR)/src/mojo/devtools/common/mojo_test --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) --shell-path $(MOJO_SHELL_PATH) tests
 
-.PHONY: env-check
-env-check:
-ifndef MOJO_DIR
-	$(error MOJO_DIR is not set)
-endif
-ifndef V23_ROOT
-	$(error V23_ROOT is not set)
-endif
-ifeq ($(wildcard $(MOJO_BUILD_DIR)),)
-	$(error ERROR: $(MOJO_BUILD_DIR) does not exist.  Please see README.md for instructions on compiling Mojo resources.)
-endif
+.PHONY: synbase-env-check
+syncbase-env-check: | mojo-env-check
 ifeq ($(wildcard $(THIRD_PARTY_LIBS)),)
 ifdef ANDROID
 	$(error ERROR: $(THIRD_PARTY_LIBS) does not exist or is empty.  Please run "GOOS=android GOARCH=arm v23 profile install syncbase")
@@ -216,11 +153,6 @@
 	$(error ERROR: $(THIRD_PARTY_LIBS) does not exist or is empty.  Please run "v23 profile install syncbase")
 endif
 endif
-ifdef ANDROID
-ifeq ($(wildcard $(ANDROID_NDK)),)
-	$(error ERROR: $(ANDROID_NDK) does not exist.  Please install android profile with "v23 profile install android")
-endif
-endif
 
 .PHONY: clean
 clean: