You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					286 lines
				
				8.2 KiB
			
		
		
			
		
	
	
					286 lines
				
				8.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# -*- 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
							 |