普通文本  |  224行  |  8.19 KB

default: javadoc runtests findbugs

help:
	@echo "Usage: make [<target> ...]"
	@echo ""
	@echo "Targets include:"
	@echo "  help      - Displays this message."
	@echo "  ----------- QUICK"
	@echo "  clean     - Delete all built files."
	@echo "  default   - Build documentation&classes, and run checks."
	@echo "              The output will be available under out/."
	@echo "  ----------- DIAGNOSTIC"
	@echo "  classes   - Put Java .class files under out/."
	@echo "  tests     - Compile tests."
	@echo "  runtests  - Runs tests.  Some require a network connection."
	@echo "  coverage  - Runs tests and generates a code coverage report."
	@echo "  findbugs  - Runs a code quality tool.  Slow."
	@echo "  benchmark - Times the sanitizer against a tree builder."
	@echo "  profile   - Profiles the benchmark."
	@echo "  ----------- ARTIFACTS"
	@echo "  distrib   - Build everything and package it into JARs."
	@echo "              Requires an svn executable on PATH."
	@echo "  release   - Additionally, cut a new Maven version."
	@echo "              Should be run from client that has sibling"
	@echo "              directories of trunk checked out."
	@echo "  download  - Bundle docs, externally required jars, and"
	@echo "              license files into a zip file suitable for"
	@echo "              the code.google site downloads."
	@echo ""
	@echo "For more verbose test runner output, do"
	@echo "  make VERBOSE=1 runtests"
	@echo ""
	@echo "To run tests with assertions on, do"
	@echo "  make NOASSERTS=1 runtests"

SHELL=/bin/bash
CLASSPATH=lib/guava-libraries/guava.jar:lib/jsr305/jsr305.jar
TEST_CLASSPATH=$(CLASSPATH):lib/htmlparser-1.3/htmlparser-1.3.jar:lib/junit/junit.jar:lib/commons-codec-1.4/commons-codec-1.4.jar:benchmark-data
JAVAC_FLAGS=-source 1.5 -target 1.5 -Xlint -encoding UTF-8
TEST_RUNNER=junit.textui.TestRunner
JASSERTS=-ea
# Run tests in the Turkish locale to trigger any extra-case-folding-rule bugs
# http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html
TURKEYTEST=-Duser.counter=TR -Duser.language-tr

ifdef VERBOSE
override TEST_RUNNER=org.owasp.html.VerboseTestRunner
endif

ifdef NOASSERTS
override JASSERTS=
endif

out:
	mkdir -p out

out/classes: out
	mkdir -p out/classes

out/genfiles: out
	mkdir -p out/genfiles

clean:
	rm -rf out

classes: out/classes.tstamp
out/classes.tstamp: out/classes src/main/org/owasp/html/*.java
	javac -g ${JAVAC_FLAGS} -classpath ${CLASSPATH} -d out/classes \
	  $$(echo $^ | tr ' ' '\n' | egrep '\.java$$')
	touch out/classes.tstamp

examples: out/examples.tstamp
out/examples.tstamp: out/classes.tstamp src/main/org/owasp/html/examples/*.java
	javac -g ${JAVAC_FLAGS} -classpath ${CLASSPATH}:out/classes \
	  -d out/classes \
	  $$(echo $^ | tr ' ' '\n' | egrep '\.java$$')
	touch out/examples.tstamp

# Depends on all java files under tests.
tests: out/tests.tstamp
out/tests.tstamp: out/classes.tstamp out/genfiles.tstamp out/examples.tstamp src/tests/org/owasp/html/*.java
	javac -g ${JAVAC_FLAGS} \
          -classpath out/classes:out/genfiles:${TEST_CLASSPATH} \
	  -d out/classes \
	  $$((echo $^; find out/genfiles -type f) | tr ' ' '\n' | \
	     egrep '\.java$$')
	touch out/tests.tstamp

out/genfiles.tstamp: out/genfiles/org/owasp/html/AllExamples.java out/genfiles/org/owasp/html/AllTests.java
	touch out/genfiles.tstamp
out/genfiles/org/owasp/html/AllTests.java: src/tests/org/owasp/html/*Test.java
	mkdir -p "$$(dirname $@)"
	(echo 'package org.owasp.html;'; \
         echo 'import junit.framework.Test;'; \
         echo 'import junit.framework.TestSuite;'; \
	 echo 'public class AllTests {'; \
	 echo '  public static Test suite() {'; \
	 echo '    TestSuite suite = new TestSuite();'; \
	 echo $^ | tr ' ' '\n' | perl -pe \
	   's#^src/tests/#      suite.addTestSuite(#; s#\.java$$#.class);#g; \
	    s#/#.#g;'; \
	 echo '    return suite;'; \
	 echo '  }'; \
	 echo '}'; \
	) > $@

out/genfiles/org/owasp/html/AllExamples.java: src/main/org/owasp/html/examples/*.java
	mkdir -p "$$(dirname $@)"
	(echo 'package org.owasp.html;'; \
	 echo 'final class AllExamples {'; \
	 echo '  static final Class<?>[] CLASSES = {'; \
	 echo $^ | tr ' ' '\n' | perl -pe \
	   's#^src/main/#      #; s#\.java$$#.class,#g; \
	    s#/#.#g;'; \
	 echo '  };'; \
	 echo '}'; \
	) > $@

runtests: tests
	java ${TURKEYTEST} ${JASSERTS} \
	    -classpath out/classes:src/tests:${TEST_CLASSPATH} \
	    ${TEST_RUNNER} org.owasp.html.AllTests

coverage: tests
	java ${JASSERTS} -cp tools/emma/lib/emma.jar:lib/guava-libraries/guava.jar:lib/jsr305/jsr305.jar:lib/htmlparser-1.3/htmlparser-1.3.jar:lib/commons-codec-1.4/commons-codec-1.4.jar:benchmark-data \
	  -Demma.report.out.file=out/coverage/index.html \
	  -Demma.report.out.encoding=UTF-8 \
	  emmarun \
	  -r html \
	  -cp out/classes:src/tests:lib/junit/junit.jar \
	  -sp src/main:src/tests:out/genfiles \
	  -f \
	  -ix '-junit.*' \
	  -ix '-org.junit.*' \
	  -ix '-org.hamcrest.*' \
	  ${TEST_RUNNER} \
	  org.owasp.html.AllTests

# Runs findbugs to identify problems.
findbugs: out/findbugs.txt
	cat $^
out/findbugs.txt: out/tests.tstamp
	find out/classes/org -type d | \
	  xargs tools/findbugs/bin/findbugs -textui -effort:max \
	  -auxclasspath ${TEST_CLASSPATH} > $@

# Runs a benchmark that compares performance.
benchmark: out/tests.tstamp
	java -cp ${TEST_CLASSPATH}:out/classes \
	  org.owasp.html.Benchmark benchmark-data/Yahoo\!.html

# Profiles the benchmark.
profile: out/java.hprof.txt
out/java.hprof.txt: out/tests.tstamp
	java -cp ${TEST_CLASSPATH}:out/classes -agentlib:hprof=cpu=times,format=a,file=out/java.hprof.txt,lineno=y,doe=y org.owasp.html.Benchmark benchmark-data/Yahoo\!.html s

# Builds the documentation.
javadoc: out/javadoc.tstamp
out/javadoc.tstamp: src/main/org/owasp/html/*.java src/main/org/owasp/html/examples/*.java
	mkdir -p out/javadoc
	javadoc -locale en -d out/javadoc \
	  -notimestamp \
	  -charset UTF-8 \
	  -classpath ${CLASSPATH} \
	  -use -splitIndex \
	  -windowtitle 'OWASP Java HTML Sanitizer' \
	  -doctitle 'OWASP Java HTML Sanitizer' \
	  -header '<a href="http://code.google.com/p/owasp-java-html-sanitizer" target=_top>code.google.com home</a>' \
	  -J-Xmx250m -nohelp -sourcetab 8 -docencoding UTF-8 -protected \
	  -encoding UTF-8 -author -version $^ \
	&& touch out/javadoc.tstamp

# Packages the documentation, and libraries in the distrib directory,
# and creates a script containing svn commands to commit those changes.
distrib: out/run_me_before_committing_release.sh
out/run_me_before_committing_release.sh: clean out/staging.tstamp
	tools/update_tree_in_svn.py out/staging distrib > $@
	chmod +x $@
out/staging.tstamp: out/javadoc.tstamp out/classes.tstamp
	mkdir -p out/staging
	echo Copying Javadoc
	rm -rf out/staging/javadoc
	cp -r out/javadoc out/staging/javadoc
	echo Suppressing spurious Javadoc diffs
	for doc_html in $$(find out/staging/javadoc -name \*.html); do \
	  perl -i -pe 's/<!-- Generated by javadoc .+?-->//; s/<META NAME="date" CONTENT="[^"]*">//' "$$doc_html"; \
	done
	echo Linking required jars
	mkdir -p out/staging/lib
	for jar in $$(echo ${CLASSPATH} | tr : ' '); do \
	  cp "$$jar" out/staging/lib/; \
	  cp "$$(dirname $$jar)"/COPYING out/staging/lib/"$$(basename $$jar .jar)"-COPYING; \
	done
	echo Bundling compiled classes
	jar cf out/staging/lib/owasp-java-html-sanitizer.jar -C out/classes org
	echo Bundling sources and docs
	for f in $$(find src/main -name \*.java); do \
	  mkdir -p out/staging/"$$(dirname $$f)"; \
	  cp "$$f" out/staging/"$$f"; \
	done
	jar cf out/staging/lib/owasp-java-html-sanitizer-sources.jar -C out/staging/src/main org
	jar cf out/staging/lib/owasp-java-html-sanitizer-javadoc.jar -C out javadoc
	rm -rf out/staging/src
	cp COPYING out/staging/lib/owasp-java-html-sanitizer-COPYING
	touch $@

# Packages the distrib jars into the maven directory which is a sibling of
# trunk.
release: out/run_me_before_committing_maven.sh
out/run_me_before_committing_maven.sh: distrib
	tools/cut_release.py > $@
	chmod +x $@

download: out/owasp-java-html-sanitizer.zip
out/zip.tstamp: out/staging.tstamp
	rm -f out/zip/owasp-java-html-sanitizer
	mkdir -p out/zip/owasp-java-html-sanitizer
	cp -r out/staging/lib out/staging/javadoc \
	    out/zip/owasp-java-html-sanitizer/
	touch $@
out/owasp-java-html-sanitizer.zip: out/zip.tstamp
	jar cMf out/owasp-java-html-sanitizer.zip \
	    -C out/zip owasp-java-html-sanitizer