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.
		
		
		
		
		
			
		
			
				
					
					
						
							285 lines
						
					
					
						
							8.2 KiB
						
					
					
				
			
		
		
	
	
							285 lines
						
					
					
						
							8.2 KiB
						
					
					
				# -*- 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
 | 
						|
 |