# Copyright 2002-2004 Nick Mathewson. See LICENSE for licensing information.
# $Id: Makefile,v 1.71 2005/12/02 18:22:48 nickm Exp $
# Okay, we'll start with a little make magic. The goal is to define the
# make variable '$(FINDPYTHON)' as a chunk of shell script that sets
# the shell variable '$PYTHON' to a working python2 interpreter.
#
# (This is nontrivial because not all python2 installers install a command
# called 'python2'.)
#
# (If anybody can think of a better way to do this, please let me know.)
# XXXX This fails when PYTHON is set to a version of Python earlier than 1.3
PYTHON_CANDIDATES = python \
python2p4 python2.4 python2.4x \
python2p3 python2.3 python2.3x \
python2p2 python2.2 python2.2x \
python2p1 python2.1 python2.1x \
python2.0 python2.0x \
python2
FINDPYTHON = \
if [ "x`which which`" = "x" ]; then \
echo "Ouch! I couldn't run 'which' on your system."; \
echo "Please make sure it is there, and try again."; \
exit; \
fi; \
if [ 'x' = "x$$PYTHON" ]; then \
for n in $(PYTHON_CANDIDATES) ; do \
if [ 'x' = "x$$PYTHON" ]; then \
if [ -x "`which $$n 2>&1`" ]; then \
if [ 'x' != "`$$n -V 2>&1 | grep 'Python [23456789]'`x" ]; then\
if [ '1' != "`$$n -c 'import thread; print 1'`" ]; then \
echo "Skipping $$n; no thread support."; \
else \
PYTHON=$$n; \
fi \
else \
echo "Skipping `which $$n`; Not recent enough."; \
fi; \
fi; \
fi; \
done; \
if [ 'x' = "x$$PYTHON" ]; then \
echo "ERROR: couldn't find Python 2 or later (with threads) on PATH as any of ";\
echo " $(PYTHON_CANDIDATES) in PATH"; \
echo " Please install python in your path, or set the PYTHON"; \
echo ' environment variable'; \
exit; \
fi; \
if [ 'x' = "`$$PYTHON -V 2>&1 | grep 'Python [23456789]'`x" ]; then \
echo "WARNING: $$PYTHON doesn't seem to be version 2 or later."; \
echo ' If this fails, please set the PYTHON environment variable.';\
fi \
fi
#
# Here are the real make targets.
#
all: do_build
do_build:
@$(FINDPYTHON); \
echo $$PYTHON setup.py build; \
$$PYTHON -tt setup.py build
clean:
@$(FINDPYTHON); \
echo $$PYTHON -tt setup.py clean; \
$$PYTHON -tt setup.py clean
rm -rf build dist
rm -f MANIFEST
rm -f lib/mixminion/_unittest.py
rm -f lib/mixminion/_textwrap.py
rm -f lib/mixminion/_zlibutil.py
rm -f lib/mixminion/*.pyc
rm -f lib/mixminion/*.pyo
rm -f lib/mixminion/*/*.pyc
rm -f lib/mixminion/*/*.pyo
find . -name '*~' -print0 |xargs -0 rm -f
find . -name '.#*' -print0 |xargs -0 rm -f
find . -name '*.bak' -print0 |xargs -0 rm -f
test:
@$(FINDPYTHON); \
echo $$PYTHON -tt setup.py run --subcommand=unittests; \
$$PYTHON -tt setup.py run --subcommand=unittests
time:
@$(FINDPYTHON); \
echo $$PYTHON setup.py run --subcommand=benchmarks; \
$$PYTHON -tt setup.py run --subcommand=benchmarks
testvectors:
@$(FINDPYTHON); \
echo $$PYTHON setup.py run --subcommand=testvectors; \
$$PYTHON -tt setup.py run --subcommand=testvectors
#======================================================================
# Install target (minimal.)
install: do_build
@$(FINDPYTHON); \
ARGS="install --compile --optimize=1 --force"; \
PREFIXARG=""; \
ROOTARG=""; \
if [ 'x' != "x$(PREFIX)" ] ; then \
PREFIX="$(PREFIX)"; export PREFIX; \
PREFIXARG=--prefix="$(PREFIX)"; \
fi; \
if [ 'x' != "x$(DESTDIR)" ] ; then \
ROOTARG=--root="$(DESTDIR)"; \
fi; \
echo $$PYTHON -tt setup.py $$ARGS $$PREFIXARG $$ROOTARG; \
$$PYTHON -tt setup.py $$ARGS $$PREFIXARG $$ROOTARG
update:
@$(FINDPYTHON); \
PYVER=`$$PYTHON -c 'import sys; print sys.version[:3]'`; \
if [ 'x' = "x$(PREFIX)" ] ; then \
PFX=`$$PYTHON -c 'import sys; print sys.prefix'`; \
LIB=$$PFX/lib/python$$PYVER/site-packages/mixminion; \
else \
LIB=$(PREFIX)/lib/python$$PYVER/site-packages/mixminion; \
fi; \
if [ ! -d $$LIB ] ; then \
echo "Didn't find an existing installation in $$LIB; bailing."; \
elif [ ! -w $$LIB ] ; then \
echo "You don't seem to have write access to $$LIB; bailing."; \
else \
rm -rf $$LIB; \
$(MAKE) install; \
fi
upgrade: update
#======================================================================
# Uninstall target (phony.)
uninstall:
@echo "Sorry, I don't do that yet... but if you run"; \
echo "'make uninstall-help', I might be able to offer some advice."
uninstall-help:
@$(FINDPYTHON); \
PYVER=`$$PYTHON -c 'import sys; print sys.version[:3]'`; \
if [ 'x' = "x$(PREFIX)" ] ; then \
EPFX=`$$PYTHON -c 'import sys; print sys.exec_prefix'`; \
PFX=`$$PYTHON -c 'import sys; print sys.prefix'`; \
BIN=$$EPFX/bin/mixminon; \
LIB=$$PFX/lib/python$$PYVER/site-packages/mixminion; \
else \
BIN=$(PREFIX)/bin/mixminion; \
LIB=$(PREFIX)/lib/python$$PYVER/site-packages/mixminion; \
fi; \
echo "Sorry, but I'm too cowardly to remove files for you."; \
echo "To remove your installation of mixminion, I think you should"; \
echo "delete:"; \
echo " * The file $$BIN"; \
echo " * All the files under $$LIB"; \
echo; \
if [ 'x' = "x$(PREFIX)" ] ; then \
echo "(But if you installed with 'make install PREFIX=XX', you"; \
echo "should run 'make uninstall-help PREFIX=XX' to get the real"; \
echo "story.)"; \
else \
echo "(But if you installed without PREFIX, you should run"; \
echo "'make uninstall-help' without PREFIX to get the real story)";\
fi
#======================================================================
# Source dist target
sdist: clean
@$(FINDPYTHON); \
echo $$PYTHON -tt setup.py sdist; \
$$PYTHON -tt setup.py sdist; \
VERSION=`ls dist/*.tar.gz | sed -e s/.*-// | sed -e s/.tar.gz//`; \
cp README dist/README-$$VERSION
signdist: sdist
gpg -ba dist/Mixminion*.tar.gz
#======================================================================
# Packaging related targets
# create a Debian package
# requires you installed at least build-essential, devscripts,
# fakeroot, and whatever is listed as Build-Depends: in debian/control.
bdist_debian:
if [ -e debian/changelog.shipped ]; then mv debian/changelog.shipped debian/changelog; fi
cp debian/changelog debian/changelog.shipped
VERSION=`grep '^VERSION = ' setup.py | sed -e "s/.*'\(.*\)'.*/\1/"`; \
debchange \
--newversion $$VERSION'-0.custom'\
--distribution unofficial \
--preserve \
'Build unofficial debian package.'
#dpkg-buildpackage -rfakeroot -uc -us
bdist_wininst:
@$(FINDPYTHON); \
echo $$PYTHON -tt setup.py bdist_wininst; \
$$PYTHON -tt setup.py bdist_wininst
bdist_py2exe:
@$(FINDPYTHON); \
VERSION=`grep '^VERSION = ' setup.py | sed -e "s/.*'\(.*\)'.*/\1/"`; \
rm -rf dist Mixminion-$$VERSION; \
echo $$PYTHON -tt setup.py py2exe; \
$$PYTHON -tt setup.py py2exe; \
mv dist Mixminion-$$VERSION; \
zip -9 Mixminion-$$VERSION.win32.zip Mixminion-$$VERSION/* \
Mixminion-$$VERSION/lib/*
#======================================================================
# OpenSSL-related targets
OPENSSL_URL = http://www.openssl.org/source/openssl-0.9.8a.tar.gz
OPENSSL_FILE = openssl-0.9.8a.tar.gz
OPENSSL_SRC = ./contrib/openssl
OPENSSL_SHA = 2aaba0f728179370fb3e86b43209205bc6c06a3a
# I have verified that the above digest matches the tarball signed by the
# openssl maintainer. If you are paranoid, you should doublecheck. -Nick.
download-openssl:
@if [ -x "`which wget 2>&1`" ] ; then \
cd contrib; wget $(OPENSSL_URL); \
elif [ -x "`which curl 2>&1`" ] ; then \
cd contrib; curl -o $(OPENSSL_FILE) $(OPENSSL_URL); \
else \
echo "I can't find wget or curl. Please download $(OPENSSL_URL)";\
echo "and put the file in ./contrib"; \
fi
destroy-openssl:
cd ./contrib; \
rm -rf `ls -d openssl* | grep -v .tar.gz`
build-openssl: $(OPENSSL_SRC)/libcrypto.a
$(OPENSSL_SRC)/libcrypto.a: $(OPENSSL_SRC)/config
cd $(OPENSSL_SRC); \
./config; \
make
./contrib/openssl/config:
$(MAKE) unpack-openssl
# This target assumes you have openssl-foo.tar.gz in contrib, and you
# want to unpack it into ./contrib/openssl-foo, and symlink ./openssl to
# ./openssl-foo.
#
# It checks 1) whether there is a single, unique openssl-foo.tar.gz
# 2) whether contrib/openssl is a real file or directory
unpack-openssl:
@$(FINDPYTHON); \
cd ./contrib; \
if [ -d ./openssl -a ! -h ./openssl ]; then \
echo "Ouch. contrib/openssl seems not to be a symlink: " \
"I'm afraid to delete it." ; \
exit; \
fi; \
if [ -f $(OPENSSL_FILE) ]; then \
SHA=`$$PYTHON -c "import sha;print sha.sha(open(\"$(OPENSSL_FILE)\").read()).hexdigest()"`; \
if [ "$$SHA" != "$(OPENSSL_SHA)" ]; then \
echo "Unexpected digest on $(OPENSSL_FILE)!"; \
exit; \
fi; \
echo "Digest on $(OPENSSL_FILE) is correct."; \
else \
echo "Found unexpected version of $(OPENSSL_FILE); not checking digest."; \
fi; \
TGZ=`ls openssl-*.tar.gz` ; \
if [ "x$$TGZ" = "x" ]; then \
echo "I didn't find any openssl-*.tar.gz in ./contrib/"; \
echo "Try 'make download-openssl'."; \
exit; \
fi; \
for n in $$TGZ; do \
if [ $$n != "$$TGZ" ]; then \
echo "Found more than one openssl-*.tar.gz in ./contrib/"; \
echo "(Remove all but the most recent.)"; \
exit; \
fi; \
done; \
UNPACKED=`echo $$TGZ | sed -e s/.tar.gz$$//`; \
echo "Unpacking $$TGZ..."; \
gunzip -c $$TGZ | tar xf -; \
if [ ! -d $$UNPACKED ]; then \
echo "Oops. I unpacked $$TGZ, but didn't find $$UNPACKED."; \
fi; \
rm -f ./openssl; \
ln -sf $$UNPACKED openssl
#======================================================================
# Coding style targets
pychecker: do_build
( export PYTHONPATH=.; cd build/lib*; pychecker -F ../../pycheckrc \
./mixminion/*.py ./mixminion/*/*.py )
lines:
@$(FINDPYTHON); \
$$PYTHON -tt etc/countlines.py src/*.[ch] lib/mixminion/[A-Z_]*.py \
lib/mixminion/*/*.py --noncode lib/mixminion/[a-z]*.py
xxxx:
find lib src \( -name '*.py' -or -name '*.[ch]' \) -print0 \
| xargs -0 grep 'XXXX\|FFFF\|DOCDOC\|????'
xxxx007:
find lib src \( -name '*.py' -or -name '*.[ch]' \) -print0 \
| xargs -0 grep 'XXXX00[1-7]\|FFFF00[1-7]\|DOCDOC\|????00[1-7]'
eolspace:
perl -i.bak -pe 's/\s+\n$$/\1\n/;' ACKS HACKING LICENSE HISTORY \
MANIFEST.in \
Makefile README HISTORY TODO pycheckrc setup.py src/*.[ch] \
lib/mixminion/*.py lib/mixminion/*/*.py
update-copyright:
touch -t 200401010000 jan1
find . -type f -newer jan1 | xargs perl -i.bak -pe \
's/Copyrigh[t] 2002-2003 Nick Mathewson/Copyright 2002-2004 Nick Mathewson/;'
find . -type f -newer jan1 | xargs perl -i.bak -pe \
's/Copyrigh[t] 2003 Nick Mathewson/Copyright 2003-2004 Nick Mathewson/;'
longlines:
find lib src \( -name '*.py' -or -name '*.[ch]' \) -print0 \
| xargs -0 grep '^................................................................................'
syntax highlighted by Code2HTML, v. 0.9.1