blob: 5ac46afefe216cbb8a95625b1e411364a222d162 [file] [log] [blame]
##
# Provides targets to build, test and run the Namespace Browser application.
#
# make # Builds the project.
# make test # Runs unit and integration tests.
# make start # Starts the services and http server needed to run the application at http://localhost:9001
# make clean # Deleted all build, testing and other artifacts.
#
# Note: :; at the beginning of commands is a work-around for an issue in MacOS version of GNU `make` where
# `make` may not invoke shell to run a command if command is deemed simple enough causing environment variables
# like PATH that are modified here not to be used.
# :; tricks make to assume command is not simple and needs to invoke shell.
# see http://stackoverflow.com/questions/21708839/problems-setting-path-in-makefile for details.
##
export GOPATH:=$(JIRI_ROOT)/release/projects/browser/go
export GOBIN:=$(JIRI_ROOT)/release/projects/browser/go/bin
export V23_CREDENTIALS=$(JIRI_ROOT)/release/projects/browser/credentials
NODE_DIR := $(shell jiri profile list --info Target.InstallationDir v23:nodejs)
export PATH := node_modules/.bin:$(NODE_DIR)/bin:$(GOBIN):$(PATH)
# NOTE: we run npm using 'node npm' to avoid relying on the shebang line in the
# npm script, which can exceed the Linux shebang length limit on Jenkins.
NPM := $(NODE_DIR)/bin/npm
VANADIUM_JS:=$(JIRI_ROOT)/release/javascript/core
SOURCE_FILES = $(shell find src -name "*")
GO_FILES = $(shell find src -name "*.go")
ifndef TMPDIR
export TMPDIR:=/tmp
endif
ORIG_TMPDIR:=$(TMPDIR)
TMPDIR:=$(TMPDIR)/nsb
# 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_OPTIONS = --transform ./main-transform --debug
# Work-around for Browserify opening too many files by increasing the limit on file descriptors.
# https://github.com/substack/node-browserify/issues/431
INCREASE_FILE_DESC = ulimit -S -n 2560
# Browserify and extract sourcemap, but do not minify.
define BROWSERIFY
$(INCREASE_FILE_DESC); \
browserify $1 $(BROWSERIFY_OPTIONS) | exorcist $2.map > $2
endef
# Browserify, minify, and extract sourcemap.
define BROWSERIFY-MIN
$(INCREASE_FILE_DESC); \
browserify $1 $(BROWSERIFY_OPTIONS) --g [ uglifyify $(MANGLE_OPTS) $(COMPRESS_OPTS) ] | exorcist $2.map > $2
endef
# All Go and VDL files.
GO_FILES = $(shell find go -name "*.go")
VDL_FILES = $(shell find go -name "*.vdl")
.DEFAULT_GOAL := default
default: build
.PHONY: deploy-production
deploy-production: build
make -C $(JIRI_ROOT)/infrastructure/deploy browser-production
.PHONY: deploy-staging
deploy-staging: build
make -C $(JIRI_ROOT)/infrastructure/deploy browser-staging
# Creating the bundle JS file.
public/bundle.js: $(SOURCE_FILES) node_modules
:;jshint src # lint all src JavaScript files.
ifdef NOMINIFY
$(call BROWSERIFY,src/app.js,$@)
else
$(call BROWSERIFY-MIN,src/app.js,$@)
endif
# Creating the bundle HTML file.
public/bundle.html: $(SOURCE_FILES) node_modules bower_components
:;vulcanize --output public/bundle.html web-component-dependencies.html --inline
# Generate VDL for JavaScript
# TODO(alexfandrianto): The JS Sample World is unused, so we can remove this.
src/services/sample-world/ifc/index.js:
VDLPATH=$(JIRI_ROOT)/release/projects/browser/src \
vdl generate -lang=javascript \
-js-out-dir=$(JIRI_ROOT)/release/projects/browser/src \
services/sample-world/ifc
# Install what we need from NPM.
node_modules: package.json
:;node $(NPM) prune
:;node $(NPM) install --quiet
touch node_modules
# Install non-JS dependencies from bower.
bower_components: bower.json node_modules
:;bower prune --config.interactive=false
:;bower install --config.interactive=false --quiet
touch bower_components
go/bin: $(GO_FILES)
jiri go install v.io/x/ref/cmd/principal
jiri go install v.io/x/browser/runner
jiri go install v.io/x/browser/namespace-browserd
credentials: go/bin
./go/bin/principal seekblessings
.PHONY: start-browserd
# Runs namespace browser with the credentials from V23_CREDENTIALS
start-browserd: directories credentials go/bin/namespace-browserd
./go/bin/namespace-browserd
# PHONY targets:
# Builds the bundle and go binaries.
all: go/bin build
# Builds the bundle.
build: directories public/bundle.js public/bundle.html
# Run unit and integration tests.
test: all
:;jshint test # lint all test JavaScript files.
:;./go/bin/runner -v=3 -log_dir=$(JIRI_ROOT)/release/projects/browser/tmp/log -alsologtostderr=true
# Run UI tests for the namespace browser.
# These tests do not normally need to be run locally, but they can be if you
# want to verify that the a specific, running version of the namespace browser
# is compatible with the live version of the Vanadium extension.
#
# This test takes additional environment variables (typically temporary)
# - GOOGLE_BOT_USERNAME and GOOGLE_BOT_PASSWORD (To sign into Google/Chrome)
# - CHROME_WEBDRIVER (The path to the chrome web driver)
# - WORKSPACE (optional, defaults to $JIRI_ROOT/release/projects/browser)
# - TEST_URL (optional, defaults to http://localhost:9001)
# - NO_XVFB (optional, defaults to using Xvfb. Set to true to watch the test.)
# - BUILD_EXTENSION (optional, defaults to using the live one. Set to true to
# use a local build of the Vanadium extension.)
#
# In addition, this test requires that maven, Xvfb, and xvfb-run be installed.
# The HTML report will be in $JIRI_ROOT/release/projects/browser/htmlReports
WORKSPACE ?= $(JIRI_ROOT)/release/projects/browser
TEST_URL ?= http://localhost:9001
ifndef NO_XVFB
XVFB := TMPDIR=/tmp xvfb-run -s '-ac -screen 0 1024x768x24'
endif
ifdef BUILD_EXTENSION
BUILD_EXTENSION_PROPERTY := "-DvanadiumExtensionPath=$(VANADIUM_JS)/extension/build"
endif
test-ui:
ifdef BUILD_EXTENSION
make -B -C $(VANADIUM_JS)/extension build-dev
endif
WORKSPACE=$(WORKSPACE) $(XVFB) \
mvn test \
-f=$(JIRI_ROOT)/release/projects/browser/test/ui/pom.xml \
-Dtest=NamespaceBrowserUITest \
-DchromeDriverBin=$(CHROME_WEBDRIVER) \
-DhtmlReportsRelativePath=htmlReports \
-DgoogleBotUsername=$(GOOGLE_BOT_USERNAME) \
-DgoogleBotPassword=$(GOOGLE_BOT_PASSWORD) \
$(BUILD_EXTENSION_PROPERTY) \
-DtestUrl=$(TEST_URL)
# Continuously watch for changes to .js, .html or .css files.
# Rebundles the appropriate bundles when local files change.
watch:
NOMINIFY=true watch -n 1 make build
# Continuously reruns the tests as they change.
watch-test: go/bin
NOMINIFY=true ./go/bin/runner -v=3 -log_dir=$(JIRI_ROOT)/release/projects/browser/tmp/log -runTestsWatch=true -alsologtostderr=false
# Serves the needed daemons and starts a server at http://localhost:9000
# CTRL-C to stop
start: build
echo "Serving at http://localhost:9001"
@static "./public" -p 9001 -H '{"Cache-Control": "max-age=0, no-cache, no-store"}' > /dev/null
# Create needed directories like TMPDIR.
directories:
mkdir -p $(TMPDIR)
# Clean all build artifacts.
clean:
rm -f public/bundle.*
rm -rf node_modules
rm -rf go/bin
rm -rf bower_components
rm -rf $(TMPDIR)
rm -rf public/version
rm -rf htmlReports
rm -rf test/ui/target
rm -rf credentials
.PHONY: all build start clean watch test watch-test directories