| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 | # -*- 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		?= bashBASHSTYLE	?= tools/bashstyleCP		?= cpCSCOPE		?= cscopeCSCOPE_DIRS	?= .JSL		?= jslJSSTYLE		?= jsstyleMKDIR		?= mkdir -pMV		?= mvRESTDOWN_FLAGS	?=RMTREE		?= rm -rfJSL_FLAGS  	?= --nologo --nosummaryifeq ($(shell uname -s),SunOS)	TAR	?= gtarelse	TAR	?= tarendif## Defaults for other fixed values.#BUILD		= buildDISTCLEAN_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)endififneq ($(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-bashcheck-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)%.bashchk: %	$(BASH) -n $^%.bashstyle: %	$(BASHSTYLE) $^.PHONY: check-jsl check-jsl-node check-jsl-webcheck-jsl: check-jsl-node check-jsl-webcheck-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-jsstylecheck-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)%.jsstylechk: % $(JSSTYLE_EXEC)	$(JSSTYLE) $(JSSTYLE_FLAGS) $<.PHONY: checkcheck: check-jsl check-jsstyle check-bash	@echo check ok.PHONY: cleanclean::	-$(RMTREE) $(CLEAN_FILES).PHONY: distcleandistclean:: clean	-$(RMTREE) $(DISTCLEAN_FILES)CSCOPE_FILES = cscope.in.out cscope.out cscope.po.outCLEAN_FILES += $(CSCOPE_FILES).PHONY: xrefxref: cscope.files	$(CSCOPE) -bqR.PHONY: cscope.filescscope.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: docsdocs:							\    $(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: testtest:.PHONY: prepushprepush: check test
 |