| # Gerrit |
| # |
| # Copyright 2008 Google Inc. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| # |
| # Define DATASTORE to the location where 'make serve' should store its |
| # runtime data files; by default this is /tmp/dev_appserver.datastore. |
| # |
| # Define REMOTE=1 to enable remote hosts to connect to the development |
| # web server started by 'make serve'. This may be a security risk. |
| # |
| # Define EMAIL=1 to enable sending email messages during 'make serve'. |
| # This may spam invalid addresses, so it is off by default. |
| # |
| # Define APPID to the unique Google App Engine application instance |
| # 'make update' will upload the application files to. |
| # |
| # Define SDK to the location of the Google App Engine SDK download. |
| # |
| # Define PYSDK to the location of a 'python2.5' interpreter. |
| # |
| # Define ADMIN_ONLY to lock the release application build to only |
| # its Google App Engine administrative accounts. |
| # |
| # Define ADMIN to the email address of an admin account that can |
| # run appcfg.py to update the code. This parameter is only used |
| # by the administrative targets. |
| # |
| |
| ifeq ($(shell uname),Darwin) |
| SDK = /usr/local/bin |
| else |
| SDK = $(HOME)/google_appengine |
| endif |
| |
| APPID = gerrit-code-review-tool-demo |
| APPNAME_HTML = <i>Gerrit</i> Code Review Tool |
| |
| ADMIN = set.ADMIN@read.the.docs |
| PYSDK = python2.5 |
| JAVAC = javac -target 1.5 |
| CPIO = cpio -pd |
| DEV_APPSERVER = $(PYSDK) $(SDK)/dev_appserver.py |
| APPCFG = $(PYSDK) $(SDK)/appcfg.py $(APPCFG_OPTS) -e '$(ADMIN)' |
| |
| -include config.mak |
| |
| ifeq ($(APPID),android-codereview) |
| APPNAME_HTML = Android Code Review |
| endif |
| |
| protobuf := ../protobuf |
| PROTOC := $(abspath $(protobuf)/src/protoc) |
| jgit := ../jgit |
| MGR_APP := mgrapp |
| WEB_APP := webapp |
| WEB_ARG := |
| |
| ifdef DATASTORE |
| WEB_ARG += --datastore_path=$(DATASTORE) |
| endif |
| ifeq (1,$(REMOTE)) |
| WEB_ARG += --address 0.0.0.0 |
| endif |
| ifeq (1,$(EMAIL)) |
| WEB_ARG += --enable_sendmail |
| endif |
| |
| R_WEB := release/web |
| R_MGR := release/mgr |
| R_PYCLIENT := release/pyclient |
| |
| PYZIP_IGNORE := $(strip \ |
| .gitignore \ |
| .gitattributes \ |
| \*.pyc \ |
| \*.pyo \ |
| ) |
| django_IGNORE := $(strip \ |
| .svn \ |
| gis \ |
| admin \ |
| localflavor \ |
| mysql \ |
| mysql_old \ |
| oracle \ |
| postgresql \ |
| postgresql_psycopg2 \ |
| sqlite3 \ |
| test \ |
| \*.po \ |
| \*.mo \ |
| ) |
| |
| WEB_INCLUDE := $(strip \ |
| __init__.py \ |
| app.yaml \ |
| index.yaml \ |
| main.py \ |
| settings.py \ |
| static \ |
| templates \ |
| ) |
| WEB_HASH := $(strip $(patsubst $(WEB_APP)/%,%,\ |
| $(wildcard $(WEB_APP)/static/*.js) \ |
| $(wildcard $(WEB_APP)/static/*.css) \ |
| )) |
| WEB_PYZIP := $(strip \ |
| codereview \ |
| django \ |
| froofle \ |
| ) |
| PYCLIENT_INCLUDE := $(strip \ |
| froofle \ |
| codereview/__init__.py \ |
| codereview/proto_client.py \ |
| codereview/*_pb2.py \ |
| ) |
| |
| PROTO_SRC := proto |
| PUBLIC_PROTO := $(wildcard $(PROTO_SRC)/*.proto) |
| INTERNAL_PROTO := $(wildcard $(PROTO_SRC)/internal/*.proto) |
| |
| jgit_jar := $(MGR_APP)/lib/jgit.jar |
| jsch_jar := $(MGR_APP)/lib/jsch.jar |
| protobuf_jar := $(MGR_APP)/lib/protobuf.jar |
| protobuf_jar_src := $(protobuf)/java/src/main/java |
| codereview_proto_jar := $(MGR_APP)/lib/codereview_proto.jar |
| codereview_manager_jar := $(MGR_APP)/lib/codereview_manager.jar |
| |
| ALL_PROTO := $(strip \ |
| $(PUBLIC_PROTO) \ |
| $(INTERNAL_PROTO) \ |
| ) |
| |
| MGR_LIB := $(strip \ |
| $(jsch_jar) \ |
| $(jgit_jar) \ |
| $(wildcard $(MGR_APP)/lib/*.jar) \ |
| $(protobuf_jar) \ |
| $(codereview_proto_jar) \ |
| ) |
| MGR_LIB := $(sort $(MGR_LIB)) |
| MGR_LIB := $(filter-out $(codereview_manager_jar),$(MGR_LIB)) |
| |
| GEN_JAR := $(strip \ |
| $(jsch_jar) \ |
| $(jgit_jar) \ |
| $(protobuf_jar) \ |
| $(codereview_proto_jar) \ |
| $(codereview_manager_jar) \ |
| \ |
| $(basename $(jsch_jar))_src.zip \ |
| $(basename $(jgit_jar))_src.zip \ |
| ) |
| |
| PROTO_PY := $(patsubst $(PROTO_SRC)/%,$(WEB_APP)/codereview/%,\ |
| $(patsubst %.proto,%_pb2.py,$(ALL_PROTO))) \ |
| $(WEB_APP)/froofle/__init__.py |
| |
| |
| ## Top level targets |
| ## |
| |
| all: web mgr |
| release: release-web release-mgr release-pyclient |
| |
| clean: |
| @rm -rf release .java_src .java_bin .proto_out |
| @rm -f .jgit_version |
| @rm -f $(protobuf_jar_src)/com/google/protobuf/DescriptorProtos.java |
| @rm -f $(GEN_JAR) |
| @rm -rf $(WEB_APP)/froofle $(WEB_APP)/froofle+ |
| @find $(WEB_APP)/codereview -name '*.pyc' | xargs rm -f |
| @find $(WEB_APP)/codereview -name '*_pb2.py' | xargs rm -f |
| |
| |
| ## Web application |
| ## |
| |
| web: $(PROTO_PY) |
| |
| serve: web |
| $(DEV_APPSERVER) $(WEB_ARG) $(WEB_APP) |
| |
| release-web: web |
| @echo Building Gerrit `./GIT-VERSION-GEN` for $(APPID): |
| @rm -rf $(R_WEB) |
| @mkdir -p $(R_WEB) |
| @cd $(WEB_APP) && \ |
| $(foreach a,$(WEB_PYZIP),\ |
| echo " Packing $a.zip" && \ |
| find $a \ |
| $(foreach i,$(PYZIP_IGNORE), -name $i -prune -o) \ |
| $(foreach i,$(value $(a)_IGNORE), -name $i -prune -o) \ |
| -type f -print | \ |
| zip -q9 $(abspath $(R_WEB)/$a.zip) -@ &&) \ |
| echo " Copying loose files" && \ |
| find $(WEB_INCLUDE) \ |
| $(foreach i,$(WEB_HASH), -path $i -prune -o) \ |
| -type f -print | $(CPIO) $(abspath $(R_WEB)) && \ |
| echo " Hashing loose files" && \ |
| $(foreach i,$(WEB_HASH),\ |
| h=$$(openssl sha1 <$i) && \ |
| d=$(basename $i)-$$h$(suffix $i) && \ |
| echo " $$d" && \ |
| cp $i $(abspath $(R_WEB))/$$d && \ |
| find $(abspath $(R_WEB)/templates) -type f \ |
| | xargs perl -pi -e "s,$i,$$d,g" && ) \ |
| true |
| @./GIT-VERSION-GEN >$(R_WEB)/static/application_version |
| @echo "This is Gerrit `./GIT-VERSION-GEN`" >$(R_WEB)/templates/live_revision.html |
| @perl -pi -e 's{PUBLIC APPLICATION NAME}{$(APPNAME_HTML)}' $(R_WEB)/templates/base.html |
| @perl -pi -e 's/(application:).*/$$1 $(APPID)/' $(R_WEB)/app.yaml |
| ifdef ADMIN_ONLY |
| @echo '*** SETTING ADMIN_ONLY ***' |
| @perl -pi -e 's/^(.*)(script:.*main.py)/$$1login: admin\n$$1$$2/' $(R_WEB)/app.yaml |
| endif |
| @echo $(R_WEB) built for $(APPID). |
| |
| update: release-web |
| $(APPCFG) update $(R_WEB) |
| |
| version: |
| @printf '%s = ' '$(APPID)' |
| @curl http://$(APPID).appspot.com/application_version |
| |
| ## Python RPC client |
| ## |
| |
| release-pyclient: $(PROTO_PY) |
| @echo Building Python RPC client $(R_PYCLIENT) |
| @rm -rf $(R_PYCLIENT) |
| @mkdir -p $(R_PYCLIENT) |
| @cd $(WEB_APP) && \ |
| find $(PYCLIENT_INCLUDE) \ |
| $(foreach i,$(PYZIP_IGNORE), -name $i -prune -o) \ |
| -type f -print \ |
| | $(CPIO) $(abspath $(R_PYCLIENT)) |
| @echo "__version__ = '`./GIT-VERSION-GEN`'" >>$(R_PYCLIENT)/codereview/__init__.py |
| |
| release-cli: release-pyclient |
| cp $(WEB_APP)/git_upload.py $(R_PYCLIENT) |
| |
| ## Manager backend |
| ## |
| |
| mgr: $(codereview_manager_jar) |
| |
| release-mgr: mgr |
| @rm -rf $(R_MGR) |
| @mkdir -p $(R_MGR) |
| @cd $(MGR_APP) && \ |
| find bin \ |
| $(foreach i,.gitignore .gitattributes, -name $i -prune -o) \ |
| -type f -print \ |
| | $(CPIO) $(abspath $(R_MGR)) && \ |
| find lib -name \*.jar -type f -print \ |
| | $(CPIO) $(abspath $(R_MGR)) |
| @echo $(R_MGR) built for `./GIT-VERSION-GEN` |
| |
| |
| ## Basic productions |
| ## |
| |
| $(PROTOC): .protobuf_version $(protobuf)/Makefile |
| $(MAKE) -C $(protobuf) |
| @touch $(PROTOC) |
| $(protobuf)/configure: $(protobuf)/configure.ac .protobuf_version |
| cd $(protobuf) && ./autogen.sh |
| $(protobuf)/Makefile: $(protobuf)/configure .protobuf_version |
| cd $(protobuf) && ./configure |
| |
| $(WEB_APP)/froofle/__init__.py: .protobuf_version $(PROTOC) |
| @echo Updating $(WEB_APP)/froofle ... |
| @rm -rf $(WEB_APP)/froofle $(WEB_APP)/froofle+ |
| @mkdir $(WEB_APP)/froofle+ |
| @cd $(protobuf)/python/google && \ |
| find . \ |
| $(foreach i,test_util.py \*_test.py, -name $i -prune -o) \ |
| -type f -name \*.py -print \ |
| | $(CPIO) $(abspath $(WEB_APP)/froofle+) |
| @cd $(protobuf)/python && \ |
| t=$(abspath .proto_out) && \ |
| rm -rf $$t && \ |
| mkdir -p $$t/google/protobuf && \ |
| $(PROTOC) -I../src -I. \ |
| --python_out=$$t \ |
| ../src/google/protobuf/descriptor.proto |
| @cp .proto_out/google/protobuf/descriptor_pb2.py \ |
| $(WEB_APP)/froofle+/protobuf |
| @rm -rf .proto_out |
| @find $(WEB_APP)/froofle+ -name __init__.py | xargs perl -ni -e '' |
| @find $(WEB_APP)/froofle+ -name '*.py' | xargs chmod a-x |
| @find $(WEB_APP)/froofle+ -name '*.py' \ |
| | xargs perl -pi -e 's/google(?!\.com)/froofle/g' |
| @mv $(WEB_APP)/froofle+ $(WEB_APP)/froofle |
| |
| $(WEB_APP)/codereview/%_pb2.py: $(PROTO_SRC)/%.proto $(PROTOC) |
| @echo protoc $< && \ |
| $(PROTOC) --python_out=$(dir $@) --proto_path=$(dir $<) $< && \ |
| perl -pi -e 's/google(?!\.com)/froofle/g' $@ |
| |
| $(codereview_manager_jar): \ |
| $(MGR_LIB) \ |
| $(shell find $(MGR_APP)/src -type f) |
| @echo build $@ |
| @rm -rf .java_bin && \ |
| b=$(abspath .java_bin) && \ |
| cd $(MGR_APP)/src && \ |
| mkdir $$b && \ |
| mkdir $$b/META-INF && \ |
| find META-INF/MANIFEST.MF | $(CPIO) $$b && \ |
| CLASSPATH=$$b && \ |
| $(foreach c,$(MGR_LIB),CLASSPATH=$$CLASSPATH:$(abspath $c) &&) \ |
| export CLASSPATH && \ |
| find . -name \*.java | xargs $(JAVAC) \ |
| -encoding UTF-8 \ |
| -g \ |
| -d $$b |
| @cd .java_bin && jar cf $(abspath $@) . |
| @rm -rf .java_bin |
| |
| $(codereview_proto_jar): $(ALL_PROTO) $(protobuf_jar) $(PROTOC) |
| @echo build $@ |
| @rm -rf .java_src .java_bin && \ |
| mkdir .java_src .java_bin && \ |
| $(foreach p,$(ALL_PROTO),\ |
| $(PROTOC) --java_out=.java_src --proto_path=$(dir $p) $p &&) \ |
| unset CLASSPATH && \ |
| cd .java_src && \ |
| find . -name '*.java' | xargs $(JAVAC) \ |
| -encoding UTF-8 \ |
| -g:none \ |
| -nowarn \ |
| -classpath $(abspath $(protobuf_jar)) \ |
| -d ../.java_bin && \ |
| cd ../.java_bin && jar cf $(abspath $@) . |
| @rm -rf .java_src .java_bin |
| |
| $(protobuf_jar): \ |
| $(protobuf)/src/google/protobuf/descriptor.proto \ |
| $(shell find $(protobuf_jar_src) -type f) |
| @echo build $@ |
| @rm -rf .java_bin && \ |
| b=$(abspath .java_bin) && \ |
| cd $(protobuf_jar_src) && \ |
| mkdir $$b && \ |
| CLASSPATH=$$b && \ |
| export CLASSPATH && \ |
| $(PROTOC) \ |
| --java_out=. \ |
| -I$(abspath $(protobuf)/src) \ |
| $(abspath $(protobuf)/src/google/protobuf/descriptor.proto) && \ |
| find . -name \*.java | xargs $(JAVAC) \ |
| -encoding UTF-8 \ |
| -g \ |
| -d $$b |
| @cd .java_bin && jar cf $(abspath $@) . |
| @rm -f $(protobuf_jar_src)/com/google/protobuf/DescriptorProtos.java |
| @rm -rf .java_bin |
| |
| $(jsch_jar): $(jgit)/org.spearce.jgit/lib/jsch-0.1.37.jar |
| rm -f $@ $(basename $@)_src.zip |
| cp $< $@ |
| cp $(basename $<).zip $(basename $@)_src.zip |
| |
| $(jgit_jar): .jgit_version |
| rm -f $@ $(basename $@)_src.zip |
| cd $(jgit) && $(SHELL) ./make_jgit.sh |
| cp $(jgit)/jgit.jar $@ |
| chmod 644 $@ |
| cp $(jgit)/jgit_src.zip $(basename $@)_src.zip |
| |
| .jgit_version: jgit_phony |
| @a=`git --git-dir=$(jgit)/.git rev-parse HEAD 2>/dev/null`; \ |
| b=`cat .jgit_version 2>/dev/null`; \ |
| if test z$$a = z$$b; then : up to date; \ |
| else echo $$a >$@; fi |
| |
| .protobuf_version: protobuf_phony |
| @a=`git --git-dir=$(protobuf)/.git rev-parse HEAD 2>/dev/null`; \ |
| b=`cat .protobuf_version 2>/dev/null`; \ |
| if test z$$a = z$$b; then : up to date; \ |
| else echo $$a >$@; fi |
| |
| .PHONY: all clean release |
| .PHONY: web release-web |
| .PHONY: mgr release-mgr |
| .PHONY: protobuf_phony |
| .PHONY: jgit_phony |