blob: c45154b590d5e0b9b78f7391d123e4b361953a0b [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:=$(V23_ROOT)/release/projects/browser/go
export VDLPATH:=$(V23_ROOT)/release/projects/browser/go
export GOBIN:=$(V23_ROOT)/release/projects/browser/go/bin
export V23_CREDENTIALS=$(V23_ROOT)/release/projects/browser/credentials
PATH:=$(V23_ROOT)/third_party/cout/node/bin:$(PATH)
PATH:=node_modules/.bin:$(GOBIN):$(PATH)
VANADIUM_JS:=$(V23_ROOT)/release/javascript/core
SOURCE_FILES = $(shell find src -name "*")
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 $(V23_ROOT)/infrastructure/deploy browser-production
.PHONY: deploy-staging
deploy-staging: build
make -C $(V23_ROOT)/infrastructure/deploy browser-staging
# Creating the bundle JS file.
public/bundle.js: $(SOURCE_FILES) node_modules src/services/sample-world/ifc
:;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
src/services/sample-world/ifc:
VDLPATH=$(V23_ROOT)/release/projects/browser \
vdl generate -lang=javascript -js-out-dir=$(V23_ROOT)/release/projects/browser/src \
services/sample-world/ifc
# Install what we need from NPM.
node_modules: package.json
:;npm prune
:;npm install --quiet
# TODO(aghassemi) Temporarily use local release/javascript/core add github/npm to package.json later
cd "$(V23_ROOT)/release/javascript/core" && npm link
:;npm link vanadium
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: directories
v23 go install v.io/x/ref/services/mounttable/mounttabled
v23 go install v.io/x/browser/runner
# 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=$(V23_ROOT)/release/projects/browser/tmp/log -alsologtostderr=false
# 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=$(V23_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"
@serve ./public --port 9001 > /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
.PHONY: all build start clean watch test watch-test directories