Edouard@0: #! gmake Edouard@0: Edouard@0: # This is Makefile for Beremiz installer Edouard@2: # andrej@14: # Invoke with "make -f path/to/Makefile" on a linux box Edouard@6: # in directory where build should happen. Edouard@6: # Edouard@6: # All those dependencies have to be installed : Edouard@6: # Edouard@6: # Windows installer : Edouard@6: # - wine (tested with 1.2 and 1.6. Fail with 1.4) Edouard@0: # - mingw32 Edouard@6: # - flex Edouard@6: # - bison Edouard@0: # - tar Edouard@0: # - unrar Edouard@0: # - wget Edouard@0: # - nsis Edouard@6: # - libtool Edouard@6: # - xmlstarlet Edouard@6: # - xsltproc Edouard@6: # - python-lxml Edouard@6: # Edouard@2: # WARNING : DISPLAY variable have to be defined to a valid X server Edouard@2: # in case it would be a problem, run : Edouard@2: # xvfb-run make -f /path/to/this/Makefile Edouard@0: andrej@16: version = 1.2-rc1 Edouard@0: Edouard@29: src := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) edouard@22: HGREMOTE ?= https://hg.beremiz.org/ edouard@28: HGROOT ?= $(abspath $(src)/..) Edouard@6: GITROOT := $(HGROOT) Edouard@6: DIST = Edouard@29: CPUS := `cat /proc/cpuinfo | grep -e 'processor\W*:\W*[[:digit:]]*' | nl -n ln | tail -n1 | cut -f1` Edouard@6: BLKDEV=/dev/null Edouard@0: andrej@12: andrej@12: CROSS_COMPILE=i686-w64-mingw32 edouard@19: CROSS_COMPILE_LIBS_DIR=$(shell dirname $(shell $(CROSS_COMPILE)-gcc -print-libgcc-file-name)) andrej@12: CC=$(CROSS_COMPILE)-gcc andrej@12: CXX=$(CROSS_COMPILE)-g++ andrej@12: andrej@12: define get_runtime_libs andrej@12: cp $(CROSS_COMPILE_LIBS_DIR)/libgcc_s_sjlj-1.dll $(1) andrej@12: cp $(CROSS_COMPILE_LIBS_DIR)/libstdc++-6.dll $(1) andrej@12: endef andrej@12: Edouard@0: distfiles = $(src)/distfiles Edouard@6: sfmirror = downloads Edouard@0: tmp := $(shell mktemp -d) Edouard@0: Edouard@6: define hg_get_archive edouard@22: test -d $(HGROOT)/`basename $(1)` || hg --cwd $(HGROOT) clone $(HGREMOTE)`basename $(1)` Edouard@6: hg -R $(HGROOT)/`basename $(1)` archive $(2) $(1) edouard@22: hg -R $(HGROOT)/`basename $(1)` id -i | sed 's/\+//' > $(1)/revision andrej@15: endef andrej@15: Edouard@0: define get_src_hg Edouard@6: rm -rf $(1) Edouard@6: $(call hg_get_archive, $(1), $(2)) Edouard@6: endef Edouard@6: Edouard@6: define get_src_git Edouard@6: rm -rf $(1) Edouard@0: mkdir $(1) Edouard@6: (cd $(GITROOT)/`basename $(1)`; git archive --format=tar $(2)) | tar -C $(1) -x Edouard@0: endef Edouard@0: Edouard@0: define get_src_http Edouard@5: dld=$(distfiles)/`echo $(2) | tr ' ()' '___'`;( ( [ -f $$dld ] || wget $(1)/$(2) -O $$dld ) && ( [ ! -f $$dld.md5 ] && (cd $(distfiles);md5sum `basename $$dld`) > $$dld.md5 || (cd $(distfiles);md5sum -c `basename $$dld.md5`) ) ) && Edouard@0: endef Edouard@0: Edouard@0: define get_src_pypi beltyukov@23: $(call get_src_http,https://pypi.python.org/packages/$(1),$(2)) Edouard@0: endef Edouard@0: Edouard@0: define get_src_sf edouard@22: $(call get_src_http,https://$(sfmirror).sourceforge.net/project/$(1),$(2)) Edouard@6: endef Edouard@6: Edouard@6: all: Beremiz-$(version).exe $(targets_add) Edouard@6: Edouard@6: Edouard@6: ifneq ("$(DIST)","") Edouard@6: include $(src)/$(DIST).mk Edouard@6: endif Edouard@6: Edouard@6: build: Edouard@6: rm -rf build Edouard@6: mkdir -p build Edouard@6: Edouard@6: # native toolchain, pre-built Edouard@0: mingwdir=build/mingw Edouard@8: Edouard@8: define get_mingw edouard@22: $(call get_src_sf,mingw/MinGW/Base/$(1),$(2)) tar -C $(mingwdir) -xf $$dld Edouard@8: endef Edouard@8: define get_msys edouard@22: $(call get_src_sf,mingw/MSYS/Base/$(1),$(2)) tar -C $(mingwdir) -xf $$dld Edouard@8: endef Edouard@6: mingw: |build Edouard@5: rm -rf $(mingwdir) Edouard@0: mkdir -p $(mingwdir) Edouard@0: # windows.h edouard@22: $(call get_mingw,w32api/w32api-5.0.1,w32api-5.0.1-mingw32-dev.tar.xz) Edouard@0: # mingw runtime edouard@22: $(call get_mingw,mingwrt/mingwrt-5.0.1,mingwrt-5.0.1-mingw32-dll.tar.xz) Edouard@0: # mingw headers and lib edouard@22: $(call get_mingw,mingwrt/mingwrt-5.0.1,mingwrt-5.0.1-mingw32-dev.tar.xz) Edouard@0: # binutils beltyukov@26: $(call get_mingw,binutils/binutils-2.28,binutils-2.28-1-mingw32-bin.tar.xz) Edouard@0: # C compiler edouard@22: $(call get_mingw,gcc/Version6/gcc-6.3.0,gcc-core-6.3.0-1-mingw32-bin.tar.xz) Edouard@0: # dependencies edouard@22: $(call get_mingw,gmp/gmp-6.1.2,libgmp-6.1.2-2-mingw32-dll-10.tar.xz) edouard@22: $(call get_mingw,mpc/mpc-1.0.3,libmpc-1.0.3-1-mingw32-dll-3.tar.xz) edouard@22: $(call get_mingw,mpfr/mpfr-3.1.5,libmpfr-3.1.5-1-mingw32-dll-4.tar.xz) edouard@22: $(call get_mingw,gettext/gettext-0.18.3.2-2,libintl-0.18.3.2-2-mingw32-dll-8.tar.xz) edouard@22: $(call get_mingw,gettext/gettext-0.18.3.2-2,libgettextpo-0.18.3.2-2-mingw32-dll-0.tar.xz) edouard@22: $(call get_mingw,libiconv/libiconv-1.14-3,libiconv-1.14-3-mingw32-dll.tar.lzma) edouard@22: Edouard@8: # make, bash, and dependencies edouard@22: $(call get_msys,bash/bash-3.1.23-1,bash-3.1.23-1-msys-1.0.18-bin.tar.xz) Edouard@8: $(call get_msys,coreutils/coreutils-5.97-3,coreutils-5.97-3-msys-1.0.13-bin.tar.lzma) edouard@22: $(call get_msys,libiconv/libiconv-1.14-1,libiconv-1.14-1-msys-1.0.17-bin.tar.lzma) edouard@22: $(call get_msys,libiconv/libiconv-1.14-1,libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma) edouard@22: $(call get_msys,gettext/gettext-0.18.1.1-1,libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma) Edouard@8: $(call get_msys,regex/regex-1.20090805-2,libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma) Edouard@8: $(call get_msys,termcap/termcap-0.20050421_1-2,libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma) Edouard@8: $(call get_msys,make/make-3.81-3,make-3.81-3-msys-1.0.13-bin.tar.lzma) edouard@22: $(call get_msys,msys-core/msys-1.0.19-1,msysCORE-1.0.19-1-msys-1.0.19-bin.tar.xz) Edouard@8: $(call get_msys,termcap/termcap-0.20050421_1-2,libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma) Edouard@8: touch $@ Edouard@0: Edouard@0: msiexec = WINEPREFIX=$(tmp) msiexec Edouard@0: wine = WINEPREFIX=$(tmp) wine Edouard@0: pydir = build/python Edouard@0: pysite = $(pydir)/Lib/site-packages Edouard@0: Edouard@29: OSSLVER=openssl-1.0.1p Edouard@29: M2CRVER=M2Crypto-0.22.6rc2 Edouard@29: MINGPFX=i686-w64-mingw32- Edouard@29: Edouard@6: python: |build Edouard@5: rm -rf $(pydir) Edouard@2: mkdir -p $(pydir) Edouard@29: Edouard@0: # Python Edouard@29: $(call get_src_http,http://www.python.org/ftp/python/2.7.3,python-2.7.3.msi)\ Edouard@0: $(msiexec) /qn /a $$dld TARGETDIR=.\\$(pydir) Edouard@29: Edouard@29: # WxPython 2.8 (needs running inno unpacker in wine) Edouard@0: $(call get_src_sf,innounp/innounp/innounp%200.36,innounp036.rar)\ Edouard@0: unrar e $$dld innounp.exe $(tmp) Edouard@0: $(call get_src_sf,wxpython/wxPython/2.8.12.1,wxPython2.8-win32-unicode-2.8.12.1-py27.exe)\ Edouard@0: $(wine) $(tmp)/innounp.exe -d$(tmp) -x $$dld Edouard@0: cp -R $(tmp)/\{code_GetPythonDir\}/* $(pydir) Edouard@0: cp -R $(tmp)/\{app\}/* $(pysite) Edouard@29: Edouard@29: # WxPython 3.0 (needs running inno unpacker in wine) Edouard@29: $(call get_src_sf,wxpython/wxPython/3.0.2.0,wxPython3.0-win32-3.0.2.0-py27.exe)\ Edouard@29: $(wine) $(tmp)/innounp.exe -d$(tmp) -x $$dld Edouard@29: cp -R $(tmp)/\{code_GetPythonDir\}/* $(pydir) Edouard@29: cp -R $(tmp)/\{app\}/* $(pysite) Edouard@29: Edouard@2: # wxPython fails if VC9.0 bullshit is not fully here. Edouard@2: $(call get_src_http,http://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140,vcredist_x86.exe)\ Edouard@2: cp $$dld $(tmp) Edouard@2: $(wine) $(tmp)/vcredist_x86.exe /qn /a Edouard@2: cp $(tmp)/drive_c/windows/winsxs/x86_Microsoft.VC90.CRT*/* $(pydir) Edouard@29: Edouard@6: # MathPlotLib Edouard@6: $(call get_src_http,https://github.com/downloads/matplotlib/matplotlib,matplotlib-1.2.0.win32-py2.7.exe)\ Edouard@6: unzip -d $(tmp)/mathplotlib $$dld ; [ $$? -eq 1 ] #silence error unziping .exe Edouard@6: cp -R $(tmp)/mathplotlib/PLATLIB/* $(pysite) Edouard@29: Edouard@0: # pywin32 Edouard@0: $(call get_src_sf,pywin32/pywin32/Build216,pywin32-216.win32-py2.7.exe)\ Edouard@0: unzip -d $(tmp)/pw32 $$dld ; [ $$? -eq 1 ] #silence error unziping .exe Edouard@0: cp -R $(tmp)/pw32/PLATLIB/* $(pysite) Edouard@29: Edouard@29: # zope.interface (twisted prereq) Edouard@29: $(call get_src_pypi,2.7/z/zope.interface,zope.interface-4.3.2-py2.7-win32.egg)\ andrej@14: unzip -d $(tmp) $$dld Edouard@3: cp -R $(tmp)/zope $(pysite) Edouard@29: Edouard@29: # six (pyopenssl prereq) Edouard@29: $(call get_src_pypi,py2.py3/s/six,six-1.11.0-py2.py3-none-any.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/six.py $(pysite) Edouard@29: Edouard@29: # enum34 (cryptography prereq) Edouard@29: $(call get_src_pypi,source/e/enum34,enum34-1.1.6.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/enum34-1.1.6/enum $(pysite) Edouard@29: Edouard@29: # cryptography (pyopenssl prereq) Edouard@29: $(call get_src_pypi,cp27/c/cryptography,cryptography-1.0.2-cp27-none-win32.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/cryptography $(pysite) Edouard@29: Edouard@29: # pyopenssl (twisted/ssl prereq) Edouard@29: $(call get_src_pypi,py2.py3/p/pyOpenSSL,pyOpenSSL-0.15.1-py2.py3-none-any.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/OpenSSL $(pysite) Edouard@29: Edouard@29: # pyasn1 (service identity prereq) Edouard@29: $(call get_src_pypi,source/p/pyasn1,pyasn1-0.1.9.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/pyasn1-0.1.9/pyasn1 $(pysite) Edouard@29: Edouard@29: # pyasn1-modules (service identity prereq) Edouard@29: $(call get_src_pypi,source/p/pyasn1-modules,pyasn1-modules-0.0.8.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/pyasn1-modules-0.0.8/pyasn1_modules $(pysite) Edouard@29: Edouard@29: # characteristic (service identity prereq) Edouard@29: $(call get_src_pypi,source/c/characteristic,characteristic-14.3.0.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/characteristic-14.3.0/characteristic.py $(pysite) Edouard@29: Edouard@29: # service identity (twisted prereq) Edouard@29: $(call get_src_pypi,source/s/service_identity,service_identity-14.0.0.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/service_identity-14.0.0/service_identity $(pysite) Edouard@29: Edouard@29: # txaio (autobahn prereq) Edouard@29: $(call get_src_pypi,source/t/txaio,txaio-2.6.0.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/txaio-2.6.0/txaio $(pysite) Edouard@29: Edouard@29: # python-msgpack (autobahn prereq) Edouard@29: $(call get_src_pypi,cp27/m/msgpack-python,msgpack_python-0.4.8-cp27-cp27m-win32.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/msgpack $(pysite) Edouard@29: Edouard@29: # u-msgpack-python (autobahn prereq) Edouard@29: $(call get_src_pypi,source/u/u-msgpack-python,u-msgpack-python-2.3.0.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cp -R $(tmp)/u-msgpack-python-2.3.0/umsgpack.py $(pysite) Edouard@29: Edouard@29: # cffi (cryptography prereq) Edouard@29: $(call get_src_pypi,cp27/c/cffi,cffi-1.2.1-cp27-none-win32.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/cffi $(tmp)/_cffi_backend.pyd $(pysite) Edouard@29: Edouard@0: # Twisted Edouard@29: $(call get_src_pypi,cp27/T/Twisted,Twisted-15.4.0-cp27-none-win32.whl)\ Edouard@29: unzip -d $(tmp) $$dld Edouard@29: cp -R $(tmp)/twisted $(pysite) Edouard@29: Edouard@29: # Autobahn Edouard@29: $(call get_src_pypi,source/a/autobahn,autobahn-17.6.1.tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: for i in autobahn twisted; do cp -R $(tmp)/autobahn-17.6.1/$$i $(pysite); done Edouard@29: Edouard@0: # Nevow Edouard@0: $(call get_src_pypi,source/N/Nevow,Nevow-0.10.0.tar.gz)\ Edouard@6: tar -C $(tmp) -xzf $$dld Edouard@0: for i in nevow formless twisted; do cp -R $(tmp)/Nevow-0.10.0/$$i $(pysite); done Edouard@29: Edouard@0: # Numpy Edouard@0: $(call get_src_pypi,2.7/n/numpy,numpy-1.6.1.win32-py2.7.exe)\ Edouard@0: unzip -d $(tmp)/np $$dld ; [ $$? -eq 1 ] #silence error unziping .exe Edouard@0: cp -R $(tmp)/np/PLATLIB/* $(pysite) Edouard@29: Edouard@0: # SimpleJson Edouard@0: $(call get_src_pypi,source/s/simplejson,simplejson-2.2.1.tar.gz)\ Edouard@6: tar -C $(tmp) -xzf $$dld Edouard@0: cp -R $(tmp)/simplejson-2.2.1/simplejson/ $(pysite) Edouard@29: andrej@21: # Zeroconf andrej@21: $(call get_src_pypi,6b/88/48dbe88b10098f98acef33218763c5630b0081c7fd0849ab4793b1e9b6d3,zeroconf-0.19.1-py2.py3-none-any.whl)\ andrej@21: unzip -d $(tmp)/zeroconf $$dld andrej@21: cp -R $(tmp)/zeroconf/* $(pysite) Edouard@29: andrej@21: # netifaces andrej@21: $(call get_src_pypi,05/00/c719457bcb8f14f9a7b9244c3c5e203c40d041a364cf784cf554aaef8129,netifaces-0.10.6-py2.7-win32.egg)\ andrej@21: unzip -d $(tmp)/netifaces $$dld andrej@21: cp -R $(tmp)/netifaces/* $(pysite) Edouard@29: Edouard@0: # WxGlade andrej@10: $(call get_src_http,https://bitbucket.org/wxglade/wxglade/get,034d891cc947.zip)\ andrej@14: unzip -d $(tmp) $$dld andrej@10: mv $(tmp)/wxglade-wxglade-034d891cc947 $(pysite)/wxglade Edouard@29: Edouard@0: # Pyro Edouard@6: $(call get_src_pypi,source/P/Pyro,Pyro-3.9.1.tar.gz)\ Edouard@6: tar -C $(tmp) -xzf $$dld Edouard@6: mv $(tmp)/Pyro-3.9.1/Pyro $(pysite) Edouard@29: Edouard@29: # Build Openssl Edouard@29: $(call get_src_http,https://openssl.org/source,$(OSSLVER).tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cd $(tmp)/$(OSSLVER); \ Edouard@29: CC=$(MINGPFX)gcc ./Configure mingw && \ Edouard@29: make all build-shared CROSS_COMPILE=$(MINGPFX) SHARED_LDFLAGS=-static-libgcc Edouard@29: Edouard@29: # Build M2crypto Edouard@29: $(call get_src_pypi,source/M/M2Crypto,$(M2CRVER).tar.gz)\ Edouard@29: tar -C $(tmp) -xzf $$dld Edouard@29: cd $(tmp)/$(M2CRVER); \ Edouard@29: patch -p1 < $(src)/M2Crypto-mingw-cross-compile-fix.patch && \ Edouard@29: PYTHONLIB=$(abspath $(pydir))/libs \ Edouard@29: PYTHONINC=$(abspath $(pydir))/include/ \ Edouard@29: MINGCCPREFIX=$(MINGPFX) \ Edouard@29: python setup.py build build_ext \ Edouard@29: --openssl=$(tmp)/$(OSSLVER) -cmingw32 Edouard@29: Edouard@29: # Copy openssl dlls directly in M2Crypto package directory Edouard@29: cp -a $(tmp)/$(OSSLVER)/*.dll $(tmp)/$(M2CRVER)/build/lib.win32-2.7/M2Crypto Edouard@29: Edouard@29: # Move result into python site packages Edouard@29: mv $(tmp)/$(M2CRVER)/build/lib.win32-2.7/M2Crypto $(pysite) Edouard@29: Edouard@6: # Lxml Edouard@6: $(call get_src_pypi,2.7/l/lxml,lxml-3.2.3.win32-py2.7.exe)\ Edouard@6: unzip -d $(tmp)/lxml $$dld ; [ $$? -eq 1 ] #silence error unziping .exe Edouard@6: cp -R $(tmp)/lxml/PLATLIB/* $(pysite) Edouard@29: Edouard@6: touch $@ Edouard@0: Edouard@0: matiecdir = build/matiec Edouard@6: matiec: |build Edouard@0: $(call get_src_hg,$(tmp)/matiec) Edouard@0: cd $(tmp)/matiec ;\ Edouard@6: autoreconf;\ andrej@12: automake --add-missing;\ andrej@12: ./configure --host=$(CROSS_COMPILE);\ Edouard@0: make -j$(CPUS); Edouard@6: rm -rf $(matiecdir) Edouard@6: mkdir -p $(matiecdir) Edouard@0: mv $(tmp)/matiec/*.exe $(matiecdir) Edouard@29: andrej@12: # install necessary shared libraries from local cross-compiler andrej@12: $(call get_runtime_libs,$(matiecdir)) Edouard@29: Edouard@0: mv $(tmp)/matiec/lib $(matiecdir) Edouard@6: touch $@ Edouard@6: Edouard@6: examples: |build Edouard@6: rm -rf examples Edouard@6: mkdir -p examples Edouard@6: andrej@14: beremiz: | build examples Edouard@0: $(call get_src_hg,build/beremiz) Edouard@29: $(call tweak_beremiz_source) Edouard@6: rm -rf examples/canopen_tests Edouard@6: mkdir -p examples/canopen_tests Edouard@6: mv build/beremiz/tests/canopen_* examples/canopen_tests Edouard@6: rm -rf examples/base_tests Edouard@6: mkdir -p examples/base_tests Edouard@6: mv build/beremiz/tests/* examples/base_tests Edouard@6: touch $@ Edouard@6: Edouard@6: CFbuild = build/CanFestival-3 Edouard@6: CFconfig = $(CFbuild)/objdictgen/canfestival_config.py Edouard@6: canfestival: mingw Edouard@6: rm -rf $(CFbuild) Edouard@6: $(call get_src_hg,$(CFbuild)) Edouard@6: cd $(CFbuild); \ Edouard@6: ./configure --can=tcp_win32 \ andrej@12: --cc=$(CC) \ andrej@12: --cxx=$(CXX) \ Edouard@6: --target=win32 \ Edouard@6: --wx=0 Edouard@6: $(MAKE) -C $(CFbuild) Edouard@6: cd $(CFbuild); find . -name "*.o" -exec rm {} ';' #remove object files only Edouard@6: touch $@ Edouard@6: Edouard@6: targets=python mingw matiec beremiz Edouard@6: Beremiz-$(version).exe: $(targets) $(src)/license.txt $(src)/install.nsi $(targets_ex) Edouard@0: sed -e 's/\$$BVERSION/$(version)/g' $(src)/license.txt > build/license.txt Edouard@6: sed -e 's/\$$BVERSION/$(version)/g' $(src)/install.nsi |\ andrej@14: sed -e 's/\$$BEXTENSIONS/$(extensions)/g' |\ andrej@14: makensis - andrej@14: Edouard@6: clean_installer: Edouard@6: rm -rf build Beremiz-$(version).exe $(targets) $(targets_ex) Edouard@6: Edouard@6: