blob: 8dc3eb412cb87244d724cd53a9fee1db91f35366 [file] [log] [blame]
NODE_DIR := $(shell jiri v23-profile list --info Target.InstallationDir nodejs)
PATH := node_modules/.bin:$(NODE_DIR)/bin:$(PATH)
NODE_BIN := $(JIRI_ROOT)/release/javascript/core/node_modules/.bin
GOPATH := $(JIRI_ROOT)/release/javascript/core/go
VDLPATH := $(JIRI_ROOT)/release/go/src:$(GOPATH)/src
GOBIN := $(JIRI_ROOT)/release/javascript/core/go/bin
VGO := GOPATH="$(GOPATH)" VDLPATH="$(VDLPATH)" jiri go
GO_FILES := $(shell find go/src $(JIRI_ROOT)/release/go/src/v.io -name "*.go")
NODE_MODULE_JS_FILES := $(shell find node_modules -name *.js | sed 's/ /\\ /')
SHELL := /bin/bash -e -o pipefail
UNAME := $(shell uname)
.DEFAULT_GOAL := all
# Default browserify options: create a standalone bundle, and use sourcemaps.
BROWSERIFY_OPTS := --standalone vanadium --debug
# Names that should not be mangled by minification.
RESERVED_NAMES := 'context,ctx,callback,cb,$$stream,serverCall'
# Don't mangle RESERVED_NAMES, and screw ie8.
MANGLE_OPTS := --mangle [--except $(RESERVED_NAMES) --screw_ie8 ]
# Don't remove unused variables from function arguments, which could mess up signatures.
# Also don't evaulate constant expressions, since we rely on them to conditionally require modules only in node.
COMPRESS_OPTS := --compress [ --no-unused --no-evaluate ]
# Browserify and extract sourcemap, but do not minify.
define BROWSERIFY
mkdir -p $(dir $2)
browserify $1 $(BROWSERIFY_OPTS) | exorcist $2.map > $2
endef
# Browserify, minify, and extract sourcemap.
define BROWSERIFY-MIN
mkdir -p $(dir $2)
browserify $1 $(BROWSERIFY_OPTS) --g [ uglifyify $(MANGLE_OPTS) $(COMPRESS_OPTS) ] | exorcist $2.map > $2
endef
# When running browser tests on non-Darwin machines, set the --headless flag.
# This uses Xvfb underneath the hood (inside prova => browser-launcher =>
# headless), which is not supported on OS X.
# See: https://github.com/kesla/node-headless/
ifndef NOHEADLESS
ifneq ($(UNAME),Darwin)
HEADLESS := --headless
endif
endif
ifdef STOPONFAIL
STOPONFAIL := --stopOnFirstFailure
endif
ifndef NOTAP
TAP := --tap
endif
ifndef NOQUIT
QUIT := --quit
endif
ifdef XUNIT
TAP := --tap # TAP must be set for xunit to work
OUTPUT_TRANSFORM := tap-xunit
endif
ifdef NODE_OUTPUT
NODE_OUTPUT_LOCAL = $(NODE_OUTPUT)
ifdef OUTPUT_TRANSFORM
NODE_OUTPUT_LOCAL := >($(OUTPUT_TRANSFORM) --package=javascript.node > $(NODE_OUTPUT_LOCAL))
endif
NODE_OUTPUT_LOCAL := | tee $(NODE_OUTPUT_LOCAL)
endif
ifdef BROWSER_OUTPUT
BROWSER_OUTPUT_LOCAL = $(BROWSER_OUTPUT)
ifdef OUTPUT_TRANSFORM
BROWSER_OUTPUT_LOCAL := >($(OUTPUT_TRANSFORM) --package=javascript.browser > $(BROWSER_OUTPUT_LOCAL))
endif
BROWSER_OUTPUT_LOCAL := | tee $(BROWSER_OUTPUT_LOCAL)
endif
PROVA_OPTS := --includeFilenameAsPackage $(TAP) $(QUIT) $(STOPONFAIL)
BROWSER_OPTS := --browser --transform envify --launch chrome $(HEADLESS)
JS_SRC_FILES = $(shell find src -name "*.js" | sed 's/ /\\ /')
# Common services needed for all integration tests. Must be a comma-seperated
# string with no spaces.
COMMON_SERVICES := "test_serviced"
LOADTEST_SERVICE := "stressd"
all: gen-vdl lint build docs
build: dist docs extension/vanadium.zip
dist/vanadium.js: src/vanadium.js $(JS_SRC_FILES) $(NODE_MODULES_JS_FILES) | node_modules
$(call BROWSERIFY,$<,$@)
dist/vanadium.min.js: src/vanadium.js $(JS_SRC_FILES) $(NODE_MODULES_JS_FILES) | node_modules
$(call BROWSERIFY-MIN,$<,$@)
dist: dist/vanadium.js dist/vanadium.min.js
extension/vanadium.zip: node_modules
$(MAKE) -C extension vanadium.zip
test-precheck: gen-vdl-test node_modules lint dependency-check
test: test-unit test-integration test-vdl test-vom
test-vdl: test-vdl-node test-vdl-browser
# This generates the VDL files and asks git if there are any changed files.
# We don't have to check the extension since it does not check in VDL files.
#
# The alternative is to use the vdl audit command, but that requires checking
# after both vdl commands in gen-vdl-impl as opposed to a single git status.
test-vdl-audit: gen-vdl
@if [ "`git status --porcelain | grep ' src/gen-vdl/' | sed 's/^ //'`" != "" ]; then \
echo "Some VDL files changed but were not committed!"; \
echo "`git status --porcelain | grep ' src/gen-vdl/' | sed 's/^ //'`"; \
echo "Run 'make gen-vdl' in the javascript/core repo, and commit the changed files."; \
exit 1; \
fi
test-vom: test-vom-node test-vom-browser
# This generates the output of the vdl files in src/gen-vdl/v.io/<package-path>
# The command will generate all the dependent files as well.
gen-vdl: JS_VDL_DIR := "$(JIRI_ROOT)/release/javascript/core/src/gen-vdl"
gen-vdl: JS_VDL_PATH_TO_CORE := ".."
gen-vdl: gen-vdl-impl
# This generates the output of the vdl files in test/vdl-out/gen-vdl/v.io/<package-path>
# The command will generate all the dependent files as well.
gen-vdl-test: JS_VDL_DIR := "$(JIRI_ROOT)/release/javascript/core/test/vdl-out"
gen-vdl-test: EXTRA_VDL_PATHS := "javascript-test/..." "v.io/x/js.core/..."
gen-vdl-test: VDLPATH := "$(JIRI_ROOT)/release/go/src:$(JIRI_ROOT)/release/javascript/core/test/vdl-in/src:$(JIRI_ROOT)/release/javascript/core/go/src"
gen-vdl-test: JS_VDL_PATH_TO_CORE := "../../src"
gen-vdl-test: gen-vdl-impl
# This generates the vdl files used by test/vom/test-vdl-arith.js
# They are placed in test/vdl/expected-gen/v.io/<package-path>.
# This command is not normally run by the tests. It should only be run when the
# expected vdl files need to be updated.
gen-vdl-test-expected: JS_VDL_DIR := "$(JIRI_ROOT)/release/javascript/core/test/vdl/expected-gen"
gen-vdl-test-expected: JS_VDL_PATH_TO_CORE := "../../../src"
gen-vdl-test-expected: gen-vdl-test-expected-impl
gen-vdl-test-expected-impl:
rm -rf $(JS_VDL_DIR)
echo $(VDLPATH)
VDLPATH=$(VDLPATH) vdl generate -lang=javascript \
-js-relative-path-to-core=$(JS_VDL_PATH_TO_CORE) \
-js-out-dir=$(JS_VDL_DIR) \
v.io/x/ref/lib/vdl/testdata/...
gen-vdl-impl:
ifndef NOVDLGEN
rm -rf $(JS_VDL_DIR)
VDLPATH=$(VDLPATH) vdl generate -lang=javascript \
-js-relative-path-to-core=$(JS_VDL_PATH_TO_CORE) \
-js-out-dir=$(JS_VDL_DIR) \
v.io/x/ref/lib/vdl/testdata/... \
v.io/x/ref/services/wspr/... \
v.io/v23/rpc/... \
v.io/v23/naming/... \
v.io/v23/verror/... \
v.io/v23/vom/... \
$(EXTRA_VDL_PATHS)
# TODO(bjornick): We build the vdlroot stuff with a different set of command line options because the package
# path does not equal the directory path of the source file. This is not ideal, but bjornick and toddw will
# discuss how to fix this later.
VDLPATH=$(VDLPATH) vdl generate -lang=javascript \
-js-relative-path-to-core=../../../$(JS_VDL_PATH_TO_CORE) \
-js-out-dir=$(JS_VDL_DIR) \
$(JIRI_ROOT)/release/go/src/v.io/v23/vdlroot/...
endif
test-vdl-node: test-precheck
prova test/vdl/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
test-vdl-browser: test-precheck
prova test/vdl/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
test-vom-node: test-precheck
prova test/vom/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
test-vom-browser: test-precheck
prova test/vom/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
test-unit: test-unit-node test-unit-browser
test-unit-node: test-precheck
prova test/unit/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
test-unit-browser: test-precheck
prova test/unit/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
test-integration: lint test-integration-node test-integration-browser
test-integration-node: test-precheck go/bin
node test/integration/runner.js --services=$(COMMON_SERVICES) -- \
prova test/integration/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
test-integration-browser: test-precheck go/bin
node test/integration/runner.js --services=$(COMMON_SERVICES) -- \
make test-integration-browser-runner
test-integration-browser-runner: BROWSER_OPTS := --options="--load-extension=$(PWD)/extension/build-test/,--ignore-certificate-errors,--enable-logging=stderr" $(BROWSER_OPTS)
test-integration-browser-runner:
@$(RM) -fr extension/build-test
$(MAKE) -C extension build-test
prova test/integration/test-*.js --log=./tmp/chrome.log $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL) $(SAVE_CHROME_LOGS)
test-load-node: test-precheck go/bin
node test/integration/runner.js --services=$(LOADTEST_SERVICE) -- \
prova test/load/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
test-load-browser: test-precheck go/bin
node test/integration/runner.js --services=$(LOADTEST_SERVICE) -- \
make test-load-browser-runner
test-load-browser-runner: BROWSER_OPTS := --options="--load-extension=$(PWD)/extension/build-test/,--ignore-certificate-errors,--enable-logging=stderr" $(BROWSER_OPTS)
test-load-browser-runner:
@$(RM) -fr extension/build-test
$(MAKE) -C extension build-test
prova test/load/test-*.js --log=./tmp/chrome.log $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL) $(SAVE_CHROME_LOGS)
go/bin: $(GO_FILES)
@$(VGO) build -o $(GOBIN)/servicerunner -a -tags wspr v.io/x/ref/cmd/servicerunner
@$(VGO) build -o $(GOBIN)/principal v.io/x/ref/cmd/principal
@$(VGO) build -o $(GOBIN)/test_serviced v.io/x/js.core/test_service/test_serviced
@$(VGO) build -o $(GOBIN)/stressd v.io/x/js.core/stress/stressd
lint: node_modules
ifdef NOLINT
@echo "Skipping lint - disabled by NOLINT environment variable"
else
jshint .
$(MAKE) -C extension lint
endif
dependency-check: node_modules
dependency-check package.json --entry src/vanadium.js
clean:
@$(RM) -fr dist
@$(RM) -fr docs
@$(RM) -fr go/bin
@$(RM) -fr go/pkg
@$(RM) -fr node_modules
@$(RM) -fr npm-debug.log
@$(RM) -fr tmp
@$(RM) -fr xunit.xml
$(MAKE) -C extension clean
DOCSTRAP_LOC:= node_modules/ink-docstrap
docs: $(JS_SRC_FILES) jsdocs/docstrap-template/compiled/site.vanadium.css | node_modules
# Copy our compiled style template
cp -f jsdocs/docstrap-template/compiled/site.vanadium.css ${DOCSTRAP_LOC}/template/static/styles
# Build the docs
jsdoc $^ --readme ./jsdocs/index.md --configure ./jsdocs/conf.json --template ${DOCSTRAP_LOC}/template --destination $@
# Copy favicon
cp -f ./jsdocs/favicon.ico $@
# docs-template
#
# Builds the custom Vanadium jsdocs template and rebuilds the docs with it.
# It does so by copying the LESS files we have in jsdocs/styles to docstrap
# and rebuilding the compiled style file by following the "Customization"
# steps: https://github.com/terryweiss/docstrap#customizing-docstrap
# After the build is done, it copies back the compiled style file to our
# folder so it can be checked in and used later.
docs-template: node_modules node_modules/ink-docstrap/node_modules/grunt node_modules/ink-docstrap/bower_components
# Copy our raw LESS style assets to docstrap
cp -f jsdocs/docstrap-template/styles/*.* ${DOCSTRAP_LOC}/styles
# Rebuilt the styles
cd ${DOCSTRAP_LOC}; ${NODE_BIN}/grunt less
# Copy back the compiled style file from docstrap
cp -f ${DOCSTRAP_LOC}/template/static/styles/site.cosmo.css jsdocs/docstrap-template/compiled/site.vanadium.css
# Rebuild docs
make docs
node_modules/ink-docstrap/node_modules/grunt:
cd ${DOCSTRAP_LOC}; npm install
node_modules/ink-docstrap/bower_components:
cd ${DOCSTRAP_LOC}; ${NODE_BIN}/bower install
# serve-docs
#
# Serve the docs at http://localhost:8020.
serve-docs: docs
static docs -p 8020
.PHONY: docs-template serve-docs
.PHONY: deploy-docs-production
deploy-docs-production: docs
make -C $(JIRI_ROOT)/infrastructure/deploy jsdoc-production
.PHONY: deploy-docs-staging
deploy-docs-staging: docs
make -C $(JIRI_ROOT)/infrastructure/deploy jsdoc-staging
node_modules: package.json check-that-npm-is-in-path
ifndef NONPMUPDATE
@npm prune
@npm install --quiet || (rm -fr $(HOME)/.npm && npm install --quiet)
@touch node_modules
endif
check-that-npm-is-in-path:
@which npm > /dev/null || { echo "npm is not in the path. Did you remember to run 'jiri profile install nodejs'?"; exit 1; }
.PHONY: all build clean dependency-check lint test
.PHONY: test-integration test-integration-node test-integration-browser
.PHONY: test-unit test-unit-node test-unit-browser
.PHONY: check-that-npm-is-in-path
.PHONY: gen-vdl gen-vdl-test gen-vdl-test-expected gen-vdl-impl gen-vdl-test-expected-impl
# Prevent the tests from running in parallel, which causes problems because it
# starts multiple instances of the services at once, and also because it
# interleaves the test output.
.NOTPARALLEL: test-integration test-integration-browser test-integration-node
.NOTPARALLEL: test-unit test-unit-node test-unit-browser
.NOTPARALLEL: test-vdl test-vdl-node test-vdl-browser