chiark / gitweb /
Merge pull request #601 from CapnBry/reloadscene
[cura.git] / package.sh
1 #!/bin/bash
2
3 # This script is to package the Cura package for Windows/Linux and Mac OS X
4 # This script should run under Linux and Mac OS X, as well as Windows with Cygwin.
5
6 #############################
7 # CONFIGURATION
8 #############################
9
10 ##Select the build target
11 BUILD_TARGET=${1:-none}
12 #BUILD_TARGET=win32
13 #BUILD_TARGET=darwin
14 #BUILD_TARGET=debian_i386
15 #BUILD_TARGET=debian_amd64
16
17 ##Do we need to create the final archive
18 ARCHIVE_FOR_DISTRIBUTION=1
19 ##Which version name are we appending to the final archive
20 export BUILD_NAME=14.02-RC5
21 TARGET_DIR=Cura-${BUILD_NAME}-${BUILD_TARGET}
22
23 ##Which versions of external programs to use
24 WIN_PORTABLE_PY_VERSION=2.7.2.1
25
26 ##Which CuraEngine to use
27 if [ -z ${CURA_ENGINE_REPO} ] ; then
28         CURA_ENGINE_REPO="https://github.com/Ultimaker/CuraEngine"
29 fi
30
31 #############################
32 # Support functions
33 #############################
34 function checkTool
35 {
36         if [ -z `which $1` ]; then
37                 echo "The $1 command must be somewhere in your \$PATH."
38                 echo "Fix your \$PATH or install $2"
39                 exit 1
40         fi
41 }
42
43 function downloadURL
44 {
45         filename=`basename "$1"`
46         echo "Checking for $filename"
47         if [ ! -f "$filename" ]; then
48                 echo "Downloading $1"
49                 curl -L -O "$1"
50                 if [ $? != 0 ]; then
51                         echo "Failed to download $1"
52                         exit 1
53                 fi
54         fi
55 }
56
57 function extract
58 {
59         echo "Extracting $*"
60         echo "7z x -y $*" >> log.txt
61         7z x -y $* >> log.txt
62         if [ $? != 0 ]; then
63         echo "Failed to extract $*"
64         exit 1
65         fi
66 }
67
68 #############################
69 # Actual build script
70 #############################
71 if [ "$BUILD_TARGET" = "none" ]; then
72         echo "You need to specify a build target with:"
73         echo "$0 win32"
74         echo "$0 linux_i368"
75         echo "$0 linux_amd64"
76         echo "$0 darwin"
77         exit 0
78 fi
79
80 # Change working directory to the directory the script is in
81 # http://stackoverflow.com/a/246128
82 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
83 cd $SCRIPT_DIR
84
85 checkTool git "git: http://git-scm.com/"
86 checkTool curl "curl: http://curl.haxx.se/"
87 if [ $BUILD_TARGET = "win32" ]; then
88         #Check if we have 7zip, needed to extract and packup a bunch of packages for windows.
89         checkTool 7z "7zip: http://www.7-zip.org/"
90         checkTool mingw32-make "mingw: http://www.mingw.org/"
91 fi
92 #For building under MacOS we need gnutar instead of tar
93 if [ -z `which gnutar` ]; then
94         TAR=tar
95 else
96         TAR=gnutar
97 fi
98
99
100 #############################
101 # Darwin
102 #############################
103
104 if [ "$BUILD_TARGET" = "darwin" ]; then
105     TARGET_DIR=Cura-${BUILD_NAME}-MacOS
106
107         rm -rf scripts/darwin/build
108         rm -rf scripts/darwin/dist
109
110         python build_app.py py2app
111         rc=$?
112         if [[ $rc != 0 ]]; then
113                 echo "Cannot build app."
114                 exit 1
115         fi
116
117     #Add cura version file (should read the version from the bundle with pyobjc, but will figure that out later)
118     echo $BUILD_NAME > scripts/darwin/dist/Cura.app/Contents/Resources/version
119         rm -rf CuraEngine
120         git clone ${CURA_ENGINE_REPO}
121     if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi
122         make -C CuraEngine
123     if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi
124         cp CuraEngine/CuraEngine scripts/darwin/dist/Cura.app/Contents/Resources/CuraEngine
125
126         cd scripts/darwin
127
128         # Install QuickLook plugin
129         mkdir -p dist/Cura.app/Contents/Library/QuickLook
130         cp -a STLQuickLook.qlgenerator dist/Cura.app/Contents/Library/QuickLook/
131
132         # Archive app
133         cd dist
134         $TAR cfp - Cura.app | gzip --best -c > ../../../${TARGET_DIR}.tar.gz
135         cd ..
136
137         # Create sparse image for distribution
138         hdiutil detach /Volumes/Cura\ -\ Ultimaker/
139         rm -rf Cura.dmg.sparseimage
140         hdiutil convert DmgTemplateCompressed.dmg -format UDSP -o Cura.dmg
141         hdiutil resize -size 500m Cura.dmg.sparseimage
142         hdiutil attach Cura.dmg.sparseimage
143         cp -a dist/Cura.app /Volumes/Cura\ -\ Ultimaker/Cura/
144         hdiutil detach /Volumes/Cura\ -\ Ultimaker
145         hdiutil convert Cura.dmg.sparseimage -format UDZO -imagekey zlib-level=9 -ov -o ../../${TARGET_DIR}.dmg
146         exit
147 fi
148
149 #############################
150 # Debian 32bit .deb
151 #############################
152
153 if [ "$BUILD_TARGET" = "debian_i386" ]; then
154     export CXX="g++ -m32"
155         if [ ! -d "Power" ]; then
156                 git clone https://github.com/GreatFruitOmsk/Power
157         else
158                 cd Power
159                 git pull
160                 cd ..
161         fi
162         rm -rf CuraEngine
163         git clone ${CURA_ENGINE_REPO}
164     if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi
165         make -C CuraEngine
166     if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi
167         rm -rf scripts/linux/${BUILD_TARGET}/usr/share/cura
168         mkdir -p scripts/linux/${BUILD_TARGET}/usr/share/cura
169         cp -a Cura scripts/linux/${BUILD_TARGET}/usr/share/cura/
170         cp -a resources scripts/linux/${BUILD_TARGET}/usr/share/cura/
171         cp -a plugins scripts/linux/${BUILD_TARGET}/usr/share/cura/
172         cp -a CuraEngine/CuraEngine scripts/linux/${BUILD_TARGET}/usr/share/cura/
173         cp scripts/linux/cura.py scripts/linux/${BUILD_TARGET}/usr/share/cura/
174         cp -a Power/power scripts/linux/${BUILD_TARGET}/usr/share/cura/
175         echo $BUILD_NAME > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version
176         sudo chown root:root scripts/linux/${BUILD_TARGET} -R
177         sudo chmod 755 scripts/linux/${BUILD_TARGET}/usr -R
178         sudo chmod 755 scripts/linux/${BUILD_TARGET}/DEBIAN -R
179         cd scripts/linux
180         dpkg-deb --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_NAME}-${BUILD_TARGET}.deb
181         sudo chown `id -un`:`id -gn` ${BUILD_TARGET} -R
182         exit
183 fi
184
185 #############################
186 # Debian 64bit .deb
187 #############################
188
189 if [ "$BUILD_TARGET" = "debian_amd64" ]; then
190     export CXX="g++ -m64"
191         if [ ! -d "Power" ]; then
192                 git clone https://github.com/GreatFruitOmsk/Power
193         else
194                 cd Power
195                 git pull
196                 cd ..
197         fi
198         rm -rf CuraEngine
199         git clone ${CURA_ENGINE_REPO}
200     if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi
201         make -C CuraEngine
202     if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi
203         rm -rf scripts/linux/${BUILD_TARGET}/usr/share/cura
204         mkdir -p scripts/linux/${BUILD_TARGET}/usr/share/cura
205         cp -a Cura scripts/linux/${BUILD_TARGET}/usr/share/cura/
206         cp -a resources scripts/linux/${BUILD_TARGET}/usr/share/cura/
207         cp -a plugins scripts/linux/${BUILD_TARGET}/usr/share/cura/
208         cp -a CuraEngine/CuraEngine scripts/linux/${BUILD_TARGET}/usr/share/cura/
209         cp scripts/linux/cura.py scripts/linux/${BUILD_TARGET}/usr/share/cura/
210         cp -a Power/power scripts/linux/${BUILD_TARGET}/usr/share/cura/
211         echo $BUILD_NAME > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version
212         sudo chown root:root scripts/linux/${BUILD_TARGET} -R
213         sudo chmod 755 scripts/linux/${BUILD_TARGET}/usr -R
214         sudo chmod 755 scripts/linux/${BUILD_TARGET}/DEBIAN -R
215         cd scripts/linux
216         dpkg-deb --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_NAME}-${BUILD_TARGET}.deb
217         sudo chown `id -un`:`id -gn` ${BUILD_TARGET} -R
218         exit
219 fi
220
221
222 #############################
223 # Rest
224 #############################
225
226 #############################
227 # Download all needed files.
228 #############################
229
230 if [ $BUILD_TARGET = "win32" ]; then
231         #Get portable python for windows and extract it. (Linux and Mac need to install python themselfs)
232         downloadURL http://ftp.nluug.nl/languages/python/portablepython/v2.7/PortablePython_${WIN_PORTABLE_PY_VERSION}.exe
233         downloadURL http://sourceforge.net/projects/pyserial/files/pyserial/2.5/pyserial-2.5.win32.exe
234         downloadURL http://sourceforge.net/projects/pyopengl/files/PyOpenGL/3.0.1/PyOpenGL-3.0.1.win32.exe
235         downloadURL http://sourceforge.net/projects/numpy/files/NumPy/1.6.2/numpy-1.6.2-win32-superpack-python2.7.exe
236         downloadURL http://videocapture.sourceforge.net/VideoCapture-0.9-5.zip
237         #downloadURL http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20120927-git-13f0cd6-win32-static.7z
238         downloadURL http://sourceforge.net/projects/comtypes/files/comtypes/0.6.2/comtypes-0.6.2.win32.exe
239         downloadURL http://www.uwe-sieber.de/files/ejectmedia.zip
240         #Get the power module for python
241         rm -rf Power
242         git clone https://github.com/GreatFruitOmsk/Power
243         rm -rf CuraEngine
244         git clone ${CURA_ENGINE_REPO}
245     if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi
246 fi
247
248 #############################
249 # Build the packages
250 #############################
251 rm -rf ${TARGET_DIR}
252 mkdir -p ${TARGET_DIR}
253
254 rm -f log.txt
255 if [ $BUILD_TARGET = "win32" ]; then
256         #For windows extract portable python to include it.
257         extract PortablePython_${WIN_PORTABLE_PY_VERSION}.exe \$_OUTDIR/App
258         extract PortablePython_${WIN_PORTABLE_PY_VERSION}.exe \$_OUTDIR/Lib/site-packages
259         extract pyserial-2.5.win32.exe PURELIB
260         extract PyOpenGL-3.0.1.win32.exe PURELIB
261         extract numpy-1.6.2-win32-superpack-python2.7.exe numpy-1.6.2-sse2.exe
262         extract numpy-1.6.2-sse2.exe PLATLIB
263         extract VideoCapture-0.9-5.zip VideoCapture-0.9-5/Python27/DLLs/vidcap.pyd
264         #extract ffmpeg-20120927-git-13f0cd6-win32-static.7z ffmpeg-20120927-git-13f0cd6-win32-static/bin/ffmpeg.exe
265         #extract ffmpeg-20120927-git-13f0cd6-win32-static.7z ffmpeg-20120927-git-13f0cd6-win32-static/licenses
266         extract comtypes-0.6.2.win32.exe
267         extract ejectmedia.zip Win32
268
269         mkdir -p ${TARGET_DIR}/python
270         mkdir -p ${TARGET_DIR}/Cura/
271         mv \$_OUTDIR/App/* ${TARGET_DIR}/python
272         mv \$_OUTDIR/Lib/site-packages/wx* ${TARGET_DIR}/python/Lib/site-packages/
273         mv PURELIB/serial ${TARGET_DIR}/python/Lib
274         mv PURELIB/OpenGL ${TARGET_DIR}/python/Lib
275         mv PURELIB/comtypes ${TARGET_DIR}/python/Lib
276         mv PLATLIB/numpy ${TARGET_DIR}/python/Lib
277         mv Power/power ${TARGET_DIR}/python/Lib
278         mv VideoCapture-0.9-5/Python27/DLLs/vidcap.pyd ${TARGET_DIR}/python/DLLs
279         #mv ffmpeg-20120927-git-13f0cd6-win32-static/bin/ffmpeg.exe ${TARGET_DIR}/Cura/
280         #mv ffmpeg-20120927-git-13f0cd6-win32-static/licenses ${TARGET_DIR}/Cura/ffmpeg-licenses/
281         mv Win32/EjectMedia.exe ${TARGET_DIR}/Cura/
282         
283         rm -rf Power/
284         rm -rf \$_OUTDIR
285         rm -rf PURELIB
286         rm -rf PLATLIB
287         rm -rf VideoCapture-0.9-5
288         rm -rf numpy-1.6.2-sse2.exe
289         #rm -rf ffmpeg-20120927-git-13f0cd6-win32-static
290
291         #Clean up portable python a bit, to keep the package size down.
292         rm -rf ${TARGET_DIR}/python/PyScripter.*
293         rm -rf ${TARGET_DIR}/python/Doc
294         rm -rf ${TARGET_DIR}/python/locale
295         rm -rf ${TARGET_DIR}/python/tcl
296         rm -rf ${TARGET_DIR}/python/Lib/test
297         rm -rf ${TARGET_DIR}/python/Lib/distutils
298         rm -rf ${TARGET_DIR}/python/Lib/site-packages/wx-2.8-msw-unicode/wx/tools
299         rm -rf ${TARGET_DIR}/python/Lib/site-packages/wx-2.8-msw-unicode/wx/locale
300         #Remove the gle files because they require MSVCR71.dll, which is not included. We also don't need gle, so it's safe to remove it.
301         rm -rf ${TARGET_DIR}/python/Lib/OpenGL/DLLS/gle*
302
303     #Build the C++ engine
304         mingw32-make -C CuraEngine
305     if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi
306 fi
307
308 #add Cura
309 mkdir -p ${TARGET_DIR}/Cura ${TARGET_DIR}/resources ${TARGET_DIR}/plugins
310 cp -a Cura/* ${TARGET_DIR}/Cura
311 cp -a resources/* ${TARGET_DIR}/resources
312 cp -a plugins/* ${TARGET_DIR}/plugins
313 #Add cura version file
314 echo $BUILD_NAME > ${TARGET_DIR}/Cura/version
315
316 #add script files
317 if [ $BUILD_TARGET = "win32" ]; then
318     cp -a scripts/${BUILD_TARGET}/*.bat $TARGET_DIR/
319     cp CuraEngine/CuraEngine.exe $TARGET_DIR
320 else
321     cp -a scripts/${BUILD_TARGET}/*.sh $TARGET_DIR/
322 fi
323
324 #package the result
325 if (( ${ARCHIVE_FOR_DISTRIBUTION} )); then
326         if [ $BUILD_TARGET = "win32" ]; then
327                 #rm ${TARGET_DIR}.zip
328                 #cd ${TARGET_DIR}
329                 #7z a ../${TARGET_DIR}.zip *
330                 #cd ..
331
332                 if [ ! -z `which wine` ]; then
333                         #if we have wine, try to run our nsis script.
334                         rm -rf scripts/win32/dist
335                         ln -sf `pwd`/${TARGET_DIR} scripts/win32/dist
336                         wine ~/.wine/drive_c/Program\ Files/NSIS/makensis.exe /DVERSION=${BUILD_NAME} scripts/win32/installer.nsi
337             if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi
338                         mv scripts/win32/Cura_${BUILD_NAME}.exe ./
339                 fi
340                 if [ -f '/c/Program Files (x86)/NSIS/makensis.exe' ]; then
341                         rm -rf scripts/win32/dist
342                         mv `pwd`/${TARGET_DIR} scripts/win32/dist
343                         '/c/Program Files (x86)/NSIS/makensis.exe' -DVERSION=${BUILD_NAME} 'scripts/win32/installer.nsi' >> log.txt
344             if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi
345                         mv scripts/win32/Cura_${BUILD_NAME}.exe ./
346                 fi
347         else
348                 echo "Archiving to ${TARGET_DIR}.tar.gz"
349                 $TAR cfp - ${TARGET_DIR} | gzip --best -c > ${TARGET_DIR}.tar.gz
350         fi
351 else
352         echo "Installed into ${TARGET_DIR}"
353 fi