|
# -*- mode: makefile -*-
|
|
#
|
|
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
|
|
#
|
|
# Makefile.targ: common targets.
|
|
#
|
|
# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
|
|
# into other repos as-is without requiring any modifications. If you find
|
|
# yourself changing this file, you should instead update the original copy in
|
|
# eng.git and then update your repo to use the new version.
|
|
#
|
|
# This Makefile defines several useful targets and rules. You can use it by
|
|
# including it from a Makefile that specifies some of the variables below.
|
|
#
|
|
# Targets defined in this Makefile:
|
|
#
|
|
# check Checks JavaScript files for lint and style
|
|
# Checks bash scripts for syntax
|
|
# Checks SMF manifests for validity against the SMF DTD
|
|
#
|
|
# clean Removes built files
|
|
#
|
|
# docs Builds restdown documentation in docs/
|
|
#
|
|
# prepush Depends on "check" and "test"
|
|
#
|
|
# test Does nothing (you should override this)
|
|
#
|
|
# xref Generates cscope (source cross-reference index)
|
|
#
|
|
# For details on what these targets are supposed to do, see the Joyent
|
|
# Engineering Guide.
|
|
#
|
|
# To make use of these targets, you'll need to set some of these variables. Any
|
|
# variables left unset will simply not be used.
|
|
#
|
|
# BASH_FILES Bash scripts to check for syntax
|
|
# (paths relative to top-level Makefile)
|
|
#
|
|
# CLEAN_FILES Files to remove as part of the "clean" target. Note
|
|
# that files generated by targets in this Makefile are
|
|
# automatically included in CLEAN_FILES. These include
|
|
# restdown-generated HTML and JSON files.
|
|
#
|
|
# DOC_FILES Restdown (documentation source) files. These are
|
|
# assumed to be contained in "docs/", and must NOT
|
|
# contain the "docs/" prefix.
|
|
#
|
|
# JSL_CONF_NODE Specify JavaScriptLint configuration files
|
|
# JSL_CONF_WEB (paths relative to top-level Makefile)
|
|
#
|
|
# Node.js and Web configuration files are separate
|
|
# because you'll usually want different global variable
|
|
# configurations. If no file is specified, none is given
|
|
# to jsl, which causes it to use a default configuration,
|
|
# which probably isn't what you want.
|
|
#
|
|
# JSL_FILES_NODE JavaScript files to check with Node config file.
|
|
# JSL_FILES_WEB JavaScript files to check with Web config file.
|
|
#
|
|
# You can also override these variables:
|
|
#
|
|
# BASH Path to bash (default: bash)
|
|
#
|
|
# CSCOPE_DIRS Directories to search for source files for the cscope
|
|
# index. (default: ".")
|
|
#
|
|
# JSL Path to JavaScriptLint (default: "jsl")
|
|
#
|
|
# JSL_FLAGS_NODE Additional flags to pass through to JSL
|
|
# JSL_FLAGS_WEB
|
|
# JSL_FLAGS
|
|
#
|
|
# JSSTYLE Path to jsstyle (default: jsstyle)
|
|
#
|
|
# JSSTYLE_FLAGS Additional flags to pass through to jsstyle
|
|
#
|
|
|
|
#
|
|
# Defaults for the various tools we use.
|
|
#
|
|
BASH ?= bash
|
|
BASHSTYLE ?= tools/bashstyle
|
|
CP ?= cp
|
|
CSCOPE ?= cscope
|
|
CSCOPE_DIRS ?= .
|
|
JSL ?= jsl
|
|
JSSTYLE ?= jsstyle
|
|
MKDIR ?= mkdir -p
|
|
MV ?= mv
|
|
RESTDOWN_FLAGS ?=
|
|
RMTREE ?= rm -rf
|
|
JSL_FLAGS ?= --nologo --nosummary
|
|
|
|
ifeq ($(shell uname -s),SunOS)
|
|
TAR ?= gtar
|
|
else
|
|
TAR ?= tar
|
|
endif
|
|
|
|
|
|
#
|
|
# Defaults for other fixed values.
|
|
#
|
|
BUILD = build
|
|
DISTCLEAN_FILES += $(BUILD)
|
|
DOC_BUILD = $(BUILD)/docs/public
|
|
|
|
#
|
|
# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}.
|
|
#
|
|
ifneq ($(origin JSL_CONF_NODE), undefined)
|
|
JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE)
|
|
endif
|
|
|
|
ifneq ($(origin JSL_CONF_WEB), undefined)
|
|
JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB)
|
|
endif
|
|
|
|
#
|
|
# Targets. For descriptions on what these are supposed to do, see the
|
|
# Joyent Engineering Guide.
|
|
#
|
|
|
|
#
|
|
# Instruct make to keep around temporary files. We have rules below that
|
|
# automatically update git submodules as needed, but they employ a deps/*/.git
|
|
# temporary file. Without this directive, make tries to remove these .git
|
|
# directories after the build has completed.
|
|
#
|
|
.SECONDARY: $($(wildcard deps/*):%=%/.git)
|
|
|
|
#
|
|
# This rule enables other rules that use files from a git submodule to have
|
|
# those files depend on deps/module/.git and have "make" automatically check
|
|
# out the submodule as needed.
|
|
#
|
|
deps/%/.git:
|
|
git submodule update --init deps/$*
|
|
|
|
#
|
|
# These recipes make heavy use of dynamically-created phony targets. The parent
|
|
# Makefile defines a list of input files like BASH_FILES. We then say that each
|
|
# of these files depends on a fake target called filename.bashchk, and then we
|
|
# define a pattern rule for those targets that runs bash in check-syntax-only
|
|
# mode. This mechanism has the nice properties that if you specify zero files,
|
|
# the rule becomes a noop (unlike a single rule to check all bash files, which
|
|
# would invoke bash with zero files), and you can check individual files from
|
|
# the command line with "make filename.bashchk".
|
|
#
|
|
.PHONY: check-bash
|
|
check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)
|
|
|
|
%.bashchk: %
|
|
$(BASH) -n $^
|
|
|
|
%.bashstyle: %
|
|
$(BASHSTYLE) $^
|
|
|
|
.PHONY: check-jsl check-jsl-node check-jsl-web
|
|
check-jsl: check-jsl-node check-jsl-web
|
|
|
|
check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk)
|
|
|
|
check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk)
|
|
|
|
%.jslnodechk: % $(JSL_EXEC)
|
|
$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $<
|
|
|
|
%.jslwebchk: % $(JSL_EXEC)
|
|
$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $<
|
|
|
|
.PHONY: check-jsstyle
|
|
check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)
|
|
|
|
%.jsstylechk: % $(JSSTYLE_EXEC)
|
|
$(JSSTYLE) $(JSSTYLE_FLAGS) $<
|
|
|
|
.PHONY: check
|
|
check: check-jsl check-jsstyle check-bash
|
|
@echo check ok
|
|
|
|
.PHONY: clean
|
|
clean::
|
|
-$(RMTREE) $(CLEAN_FILES)
|
|
|
|
.PHONY: distclean
|
|
distclean:: clean
|
|
-$(RMTREE) $(DISTCLEAN_FILES)
|
|
|
|
CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out
|
|
CLEAN_FILES += $(CSCOPE_FILES)
|
|
|
|
.PHONY: xref
|
|
xref: cscope.files
|
|
$(CSCOPE) -bqR
|
|
|
|
.PHONY: cscope.files
|
|
cscope.files:
|
|
find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \
|
|
-o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@
|
|
|
|
#
|
|
# The "docs" target is complicated because we do several things here:
|
|
#
|
|
# (1) Use restdown to build HTML and JSON files from each of DOC_FILES.
|
|
#
|
|
# (2) Copy these files into $(DOC_BUILD) (build/docs/public), which
|
|
# functions as a complete copy of the documentation that could be
|
|
# mirrored or served over HTTP.
|
|
#
|
|
# (3) Then copy any directories and media from docs/media into
|
|
# $(DOC_BUILD)/media. This allows projects to include their own media,
|
|
# including files that will override same-named files provided by
|
|
# restdown.
|
|
#
|
|
# Step (3) is the surprisingly complex part: in order to do this, we need to
|
|
# identify the subdirectories in docs/media, recreate them in
|
|
# $(DOC_BUILD)/media, then do the same with the files.
|
|
#
|
|
DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$")
|
|
DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%)
|
|
DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%)
|
|
|
|
DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null)
|
|
DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%)
|
|
DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%)
|
|
|
|
#
|
|
# Like the other targets, "docs" just depends on the final files we want to
|
|
# create in $(DOC_BUILD), leveraging other targets and recipes to define how
|
|
# to get there.
|
|
#
|
|
.PHONY: docs
|
|
docs: \
|
|
$(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html) \
|
|
$(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json) \
|
|
$(DOC_MEDIA_FILES_BUILD)
|
|
|
|
#
|
|
# We keep the intermediate files so that the next build can see whether the
|
|
# files in DOC_BUILD are up to date.
|
|
#
|
|
.PRECIOUS: \
|
|
$(DOC_FILES:%.restdown=docs/%.html) \
|
|
$(DOC_FILES:%.restdown=docs/%json)
|
|
|
|
#
|
|
# We do clean those intermediate files, as well as all of DOC_BUILD.
|
|
#
|
|
CLEAN_FILES += \
|
|
$(DOC_BUILD) \
|
|
$(DOC_FILES:%.restdown=docs/%.html) \
|
|
$(DOC_FILES:%.restdown=docs/%.json)
|
|
|
|
#
|
|
# Before installing the files, we must make sure the directories exist. The |
|
|
# syntax tells make that the dependency need only exist, not be up to date.
|
|
# Otherwise, it might try to rebuild spuriously because the directory itself
|
|
# appears out of date.
|
|
#
|
|
$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD)
|
|
|
|
$(DOC_BUILD)/%: docs/% | $(DOC_BUILD)
|
|
$(CP) $< $@
|
|
|
|
docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC)
|
|
$(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $<
|
|
|
|
$(DOC_BUILD):
|
|
$(MKDIR) $@
|
|
|
|
$(DOC_MEDIA_DIRS_BUILD):
|
|
$(MKDIR) $@
|
|
|
|
#
|
|
# The default "test" target does nothing. This should usually be overridden by
|
|
# the parent Makefile. It's included here so we can define "prepush" without
|
|
# requiring the repo to define "test".
|
|
#
|
|
.PHONY: test
|
|
test:
|
|
|
|
.PHONY: prepush
|
|
prepush: check test
|