# Makefile for PythonNET
# usage:
# make PYTHON=/path/to/python
# make PYTHON=C:/Python25/python.exe
# make PYTHON=/path/to/python DEFINE=additional,defines CSCARGS=additional_args
# make clean
RELEASE = pythonnet-2.0-alpha2
KEYFILE = pythonnet.key
PYTHON ?= python
PYTHONVER ?= $(shell $(PYTHON) -c "import sys; \
print 'PYTHON%i%i' % sys.version_info[:2]")
UCS ?= $(shell $(PYTHON) -c "import sys; \
print 'UCS%i' % ((sys.maxunicode > 65536) and 4 or 2)")
SITEPACKAGES = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; \
print get_python_lib(plat_specific=1, standard_lib=0)")
INSTALL=/usr/bin/install -m644
# Contributed by VIKAS DHIMAN - - Thanks, Vikas!
ARCH_FULL = $(shell uname -m)
ifneq (, $(findstring 86, $(ARCH_FULL)))
ARCH = x86
else
ARCH = x64
endif
ifeq ($(origin WINDIR), undefined)
RUNNER = mono
ILDASM = monodis
ILASM = ilasm
CSC = gmcs
RUNTIME_REF =
ALL = clr.so monoclr
GACUTIL = gacutil
SN = sn
else
RUNNER =
ILDASM = $${PROGRAMFILES}/Microsoft.NET/SDK/v2.0/Bin/ildasm.exe
ILASM = $${WINDIR}/Microsoft.NET/Framework/v2.0.50727/ilasm.exe
CSC = $${WINDIR}/Microsoft.NET/Framework/v2.0.50727/csc.exe
RUNTIME_REF =
ALL =
GACUTIL = $${PROGRAMFILES}/Microsoft.NET/SDK/v2.0/Bin/gacutil.exe /nologo
SN = $${PROGRAMFILES}/Microsoft.NET/SDK/v2.0/Bin/sn.exe /q
endif
ifeq ($(origin DEFINE), undefined)
_DEFINE =
else
_DEFINE = /define:$(DEFINE)
endif
ifeq ($(UCS), UCS4)
RUNTIME_REF = /reference:Mono.Posix.dll
endif
CSC += /define:$(PYTHONVER) /define:$(UCS) $(_DEFINE) /nologo $(CSCARGS)
BASEDIR = $(shell pwd)
PYTHON_CS = $(wildcard $(BASEDIR)/src/console/*.cs)
RUNTIME_CS = $(wildcard $(BASEDIR)/src/runtime/*.cs)
TESTING_CS = $(wildcard $(BASEDIR)/src/testing/*.cs)
EMBED_CS = $(wildcard $(BASEDIR)/src/embed_tests/*.cs)
all: Python.Runtime.dll python.exe Python.Test.dll clr.pyd $(ALL)
cleanall: realclean all
python.exe: Python.Runtime.dll $(PYTHON_CS)
cd "$(BASEDIR)/src/console"; \
$(CSC) /target:exe /out:../../python.exe \
/reference:../../Python.Runtime.dll /recurse:*.cs
Python.Runtime.dll: $(RUNTIME_CS)
cd "$(BASEDIR)/src/runtime"; \
$(CSC) /unsafe /target:library \
$(RUNTIME_REF) /out:../../Python.Runtime.dll /recurse:*.cs
# Contributed by VIKAS DHIMAN - - Thanks, Vikas!
src/runtime/clrmodule.il: src/runtime/clrmodule.pp.il
ifeq ($(origin WINDIR), undefined)
cd "$(BASEDIR)/src/runtime";\
$(CPP) -C -P -x c++ -I $(ARCH) clrmodule.pp.il -o clrmodule.il
else
cd "$(BASEDIR)/src/runtime";\
cp oldmodule.il clrmodule.il
endif
clr.pyd: Python.Runtime.dll src/runtime/clrmodule.il
$(ILASM) /nologo /dll /quiet /output=clr.pyd \
src/runtime/clrmodule.il
clr.so: Python.Runtime.dll src/monoclr/clrmod.c src/monoclr/pynetclr.h \
src/monoclr/pynetinit.c
$(PYTHON) setup.py build_ext -i
Python.Test.dll: Python.Runtime.dll
cd "$(BASEDIR)/src/testing"; \
$(CSC) /target:library /out:../../Python.Test.dll \
/reference:../../Python.Runtime.dll,System.Windows.Forms.dll \
/recurse:*.cs
Python.EmbeddingTest.dll: Python.Runtime.dll $(EMBED_CS)
cd $(BASEDIR)/src/embed_tests; \
$(CSC) /target:library /out:../../Python.EmbeddingTest.dll \
/reference:../../Python.Runtime.dll,System.Windows.Forms.dll,nunit.framework \
/recurse:*.cs
.PHONY=clean
clean:
rm -f *.exe *.dll *.so *.pyd
make -C src/monoclr clean
.PHONY=realclean
realclean: clean
find . \( -name \*.o -o -name \*.so -o -name \*.py[co] -o -name \
\*.dll -o -name \*.exe -o -name \*.pdb -o -name \*.mdb \
-o -name \*.pyd -o -name \*~ \) -exec rm -f {} \;
rm -f Python*.il Python*.il2 Python*.res
rm -rf build/
cd src/console; rm -rf bin; rm -rf obj; cd ../..;
cd src/runtime; rm -rf bin; rm -rf obj; rm clrmodule.il; cd ../..;
cd src/testing; rm -rf bin; rm -rf obj; cd ../..;
cd src/embed_tests; rm -rf bin; rm -rf obj; rm -f TestResult.xml; cd ../..;
cd src/monoclr; make clean; cd ../..
.PHONY=test
test: all
rm -f ./src/tests/*.pyc
$(RUNNER) ./python.exe ./src/tests/runtests.py
.PHONY=dist
dist: realclean
if ! [ -f $(KEYFILE) ]; then \
echo "Could not find $(KEYFILE) to sign assemblies"; \
exit 1; \
fi
rm -rf ./$(RELEASE)
mkdir -p ./release/
mkdir ./$(RELEASE)
cp ./Makefile ./$(RELEASE)/
cp ./*.sln ./$(RELEASE)/
cp ./*.mds ./$(RELEASE)/
cp ./*.txt ./$(RELEASE)/
cp ./*.py ./$(RELEASE)/
svn export ./demo ./$(RELEASE)/demo/
svn export ./doc ./$(RELEASE)/doc/
svn export ./src ./$(RELEASE)/src/
for PY in python2.4 python2.5; do \
for PYUCS in UCS2 UCS4; do \
make clean; \
make PYTHON=$$PY UCS=$$PYUCS CSCARGS="/keyfile:$(BASEDIR)/$(KEYFILE) /optimize"; \
mkdir ./$(RELEASE)/$$PY-$$PYUCS; \
cp *.dll *.exe *.pyd *.so ./$(RELEASE)/$$PY-$$PYUCS/; \
done; \
done;
tar czf $(RELEASE).tar.gz ./$(RELEASE)/
zip -r -6 $(RELEASE).zip ./$(RELEASE)
mv $(RELEASE).* ./release/
rm -rf ./$(RELEASE)/
sign:
rm -f release/$(RELEASE)*.sig
cd release; md5sum $(RELEASE).tar.gz $(RELEASE).zip > \
$(RELEASE).md5
cd release; sha256sum $(RELEASE).tar.gz $(RELEASE).zip > \
$(RELEASE).sha
cd release; gpg -sab $(RELEASE).zip
cd release; gpg -sab $(RELEASE).tar.gz
dis:
$(ILDASM) Python.Runtime.dll /out=Python.Runtime.il
asm:
$(ILASM) /dll /quiet \
/resource=Python.Runtime.res /output=Python.Runtime.dll \
Python.Runtime.il
monoclr:
make -C $(BASEDIR)/src/monoclr PYTHON=$(PYTHON)
run: python.exe
$(RUNNER) python.exe
install: all
$(PYTHON) setup.py install
mkkey:
$(SN) -k $(KEYFILE)