tar_em_up.sh 9.96 KB
Newer Older
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
1
2
3
4
#!/bin/bash
# super-simplistic installer for l2ork things by Ivica Ico Bukvic <ico@vt.edu>
# for info on L2Ork visit http://l2ork.music.vt.edu

5
6
7
8
9
10
11
12
cleanup() {
    # maybe we'd want to do some actual cleanup here
    test $2 -ne 0 && echo "$0: $1: command failed with exit code $2, exiting now." && echo "$0: $1: $BASH_COMMAND"
    exit $2
}

trap 'cleanup $LINENO $?' ERR

Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
13
14
15
16
17
if [ $# -eq 0 ] # should check for no arguments
then
	echo
	echo "   Usage: ./tar_em_up.sh -option1 -option2 ..."
	echo "   Options:"
18
	echo "     -b    build a deb (incremental)"
Ivica Bukvic's avatar
Ivica Bukvic committed
19
	echo "     -B    build a deb (complete recompile)"
20
	echo "     -c    core Pd source tarball"
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
21
22
	echo "     -f    full installer (incremental)"
	echo "     -F    full installer (complete recompile)"
23
	echo "     -k    keep previous build products"
24
	echo "     -n    skip package creation (-bB, -fF)"
Ivica Bukvic's avatar
Ivica Bukvic committed
25
26
	echo "     -R    build a Raspberry Pi deb (complete recompile)"
	echo "     -r    build a Raspberry Pi deb (incremental)"
27
	echo "     -X    build an OSX installer (dmg)"
28
29
	echo "     -z    build a Windows installer (incremental)"
	echo "     -Z    build a Windows installer (complete recompile)"
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
30
	echo
31
32
33
34
35
36
37
	echo "   The incremental options bypass Gem compilation. This saves"
	echo "   (lots of) time if Gem has already been built previously."
	echo
	echo "   The -k (keep) option doesn't clean before compilation,"
	echo "   keeping the build products from a previous run. This also"
	echo "   saves time if the script has been run previously."
	echo
38
39
40
41
42
	echo "   For custom install locations do the following before"
	echo "   running this script:"
	echo
	echo "           export inst_dir=/some/custom/location"
	echo
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
43
44
45
46
47
48
	exit 1
fi

deb=0
core=0
full=0
Ivica Bukvic's avatar
Ivica Bukvic committed
49
rpi=0
50
pkg=1
51
inno=0
52
dmg=0
53
clean=1
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
54

55
while getopts ":bBcfFknRrXzZ" Option
56
57
58
59
60
61
62
63
64
65
66
67
68
do case $Option in
		b)		deb=1
				inst_dir=${inst_dir:-/usr};;

		B)		deb=2
				inst_dir=${inst_dir:-/usr};;

		c)		core=1;;

		f)		full=1;;

		F)		full=2;;

69
70
		k)		clean=0;;

71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
		n)		pkg=0;;

		R)		deb=2
				inst_dir=/usr
				rpi=1;;

		r)		deb=1
				inst_dir=/usr
				rpi=1;;

		X)		dmg=1
				inst_dir=/usr;;

		z)		inno=1
				inst_dir=/usr;;

		Z)		inno=2
				inst_dir=/usr;;

		*)		echo "Error: unknown option";;
	esac
done

inst_dir=${inst_dir:-/usr/local}

export TAR_EM_UP_PREFIX=$inst_dir

98
99
100
101
102
103
104
# Get the OS we're running under, normalized to names that can be used
# to fetch the nwjs binaries below

os=`uname | tr '[:upper:]' '[:lower:]'`
if [[ $os == *"mingw32"* ]]; then
	os=win
fi
105
106
107
if [[ $os == "darwin" ]]; then
	os=osx
fi
108

109
110
111
112
113
114
115
116
117
118
119
120
# Pick a default build target if none has been set.
if [ $core -eq 0 -a $full -eq 0 -a $deb -eq 0 -a $inno -eq 0 -a $dmg -eq 0 ]
then
	if [[ $os == "osx" ]]; then
		dmg=1
	elif [[ $os == "win" ]]; then
		inno=2
	else
		deb=2
	fi
fi

121
122
123
124
# Automagically disable Debian packaging when the Debian packaging tools are
# not available.
test $deb -eq 0 || test -x /usr/bin/dpkg-deb || pkg=0

125
# Fetch the nw.js binary if we haven't already. We want to fetch it even
Jonathan Wilkes's avatar
Jonathan Wilkes committed
126
# for building with no libs, so we do it regardless of the options
127
#echo nwjs-sdk-v0.16.0-`uname | tr '[:upper:]' '[:lower:]'`
128
129
130
131
132
133
if [ ! -d "../pd/nw/nw" ]; then
	if [ `getconf LONG_BIT` -eq 32 ]; then
		arch="ia32"
	else
		arch="x64"
	fi
134

135
	# for rpi
136
	if [ `uname -m` == "armv7l" ]; then
137
138
139
		arch="armv7l"
	fi

140
	if [[ $os == "win" || $os == "osx" ]]; then
141
		ext="zip"
142
143
144
145
	else
		ext="tar.gz"
	fi

146
	if [[ $os == "win" || $osx_version == "10.8" ]]; then
147
148
149
150
		# We need the lts version to be able to run on XP. For
                # simplicity we use that same version for 64 bit Windows, too
		nwjs_version="v0.14.7"
	else
151
		# temporary kluge for rpi-- only 0.15.1 is available atm
152
		if [ `uname -m` == "armv7l" ]; then
Jonathan Wilkes's avatar
Jonathan Wilkes committed
153
			nwjs_version="v0.17.6"
154
		else
155
			nwjs_version="v0.22.1"
156
		fi
157
158
	fi

159
160
161
	nwjs="nwjs-sdk"
	nwjs_dirname=${nwjs}-${nwjs_version}-${os}-${arch}
	nwjs_filename=${nwjs_dirname}.${ext}
162
163
	nwjs_url=https://git.purrdata.net/jwilkes/nwjs-binaries/raw/master
	nwjs_url=${nwjs_url}/$nwjs_filename
164
165
	echo "Fetching the nwjs binary from"
	echo "$nwjs_url"
166
        wget -nv $nwjs_url
167
	if [[ $os == "win" || $os == "osx" ]]; then
168
169
170
171
		unzip $nwjs_filename
	else
		tar -xf $nwjs_filename
	fi
172
173
174
175
176
177
	# Special case for arm binary's inconsistent directory name
	# (It's not the same as the `uname -m` output)
	if [ `uname -m` == "armv7l" ]; then
		nwjs_dirname=`echo $nwjs_dirname | sed 's/armv7l/arm/'`
	fi
        mv $nwjs_dirname ../pd/nw/nw
178
179
	# make sure the nw binary is executable on GNU/Linux
	if [[ $os != "win" && $dmg == 0 ]]; then
180
181
		chmod 755 ../pd/nw/nw/nw
	fi
182
183
184
	rm $nwjs_filename
fi

185
186
187
188
189
190
191
192
193
194
# For Windows, fetch the ASIO SDK if we don't have it already
if [[ $os == "win" ]]; then
	if [ ! -d "../pd/lib" ]; then
		mkdir ../pd/lib
		wget http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip
		unzip asiosdk2.3.zip
		mv ASIOSDK2.3 ../pd/lib
	fi
fi

Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
195
196
197
198
199
200
201
cd ../

if [ $core -eq 1 ]
then
	echo "core Pd..."
	rm -f ../Pd-l2ork-`date +%Y%m%d`.tar.bz2 2> /dev/null
	cd pd/src/
202
	make clean || true # this may fail on 1st attempt
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
203
	cd ../../
204
	tar -jcf ./Pd-l2ork-`date +%Y%m%d`.tar.bz2 pd
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
205
206
fi

207
if [ $full -gt 0 -o $deb -gt 0 -o $inno -gt 0 -o $dmg -gt 0 ]
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
208
then
209
210
	echo "Pd-L2Ork full installer... IMPORTANT! To ensure you have the most up-to-date submodules, this process requires internet connection to pull sources from various repositories..."

211
212
213
	if [ -d .git ]; then
		# check if Gem submodule is empty, and if so do first init
		if [ "$(ls -A Gem)" ]; then
214
215
			git submodule update
			#git submodule foreach git pull origin master
216
		else
217
			# init all submodules (only necessary the first time)
218
			git submodule init
219
220
			git submodule update
			#git submodule foreach git pull origin master
221
		fi
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
222
223
224
	fi


225
	if [ $full -eq 2 -o $deb -eq 2 -o $inno -eq 2 -o $dmg -eq 2 ]
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
226
	then
227
228
229
	        if [ $clean -eq 0 ]; then
		cd externals
		else
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
230
		# clean files that may remain stuck even after doing global make clean (if any)
231
		test $os == "osx" && make -C packages/darwin_app clean || true
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
232
		cd externals/miXed
233
		make clean || true # this may fail on 1st attempt
234
		cd ../
235
		make gem_clean || true # this may fail on 1st attempt
236
		cd ../Gem/src/
237
		make distclean || true # this may fail on 1st attempt
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
238
239
240
		rm -rf ./.libs
		rm -rf ./*/.libs
		cd ../
241
242
243
		make distclean || true # this may fail on 1st attempt
		rm -f gemglutwindow.pd_linux
		rm -f Gem.pd_linux
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
244
245
		aclocal
		./autogen.sh
246
		fi
247
		export INCREMENTAL=""
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
248
249
	else
		cd Gem/
250
		export INCREMENTAL="yes"
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
251
	fi
252
	cd ../pd/src && aclocal && autoconf
253
254
	if [[ $os == "win" ]]; then
		cd ../../packages/win32_inno
Jonathan Wilkes's avatar
Jonathan Wilkes committed
255
	elif [[ $os == "osx" ]]; then
256
		cd ../../packages/darwin_app
257
258
259
	else
		cd ../../packages/linux_make
	fi
260
	if [ $full -gt 1 -o $deb -eq 2 -o $inno -eq 2 -o $dmg -eq 2 ]
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
261
	then
262
263
264
265
266
267
		test $clean -ne 0 && make distclean || true
		# Run `make git_version` *now* so that we already have
		# s_stuff.h when we copy it below. XXXNOTE AG: The build seems
		# to work just fine even when skipping all this, so why again
		# is this needed?
		make -C .. git_version
268
269
270
271
		cp ../../pd/src/g_all_guis.h ../../externals/build/include
		cp ../../pd/src/g_canvas.h ../../externals/build/include
		cp ../../pd/src/m_imp.h ../../externals/build/include
		cp ../../pd/src/m_pd.h ../../externals/build/include
272
273
		cp ../../pd/src/s_stuff.h ../../externals/build/include
		cp ../../pd/src/g_all_guis.h ../../externals/build/include
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
274
	fi
275
	rm -rf build/
Ivica Bukvic's avatar
Ivica Bukvic committed
276
277
278
279
	if [ $rpi -eq 0 ]
	then
		echo "installing desktop version..."
		cp -f debian/control.desktop debian/control
280
		cp -f ../../l2ork_addons/flext/config-lnx-pd-gcc.txt.intel ../../externals/grill/trunk/flext/buildsys/config-lnx-pd-gcc.txt
Ivica Bukvic's avatar
Ivica Bukvic committed
281
282
283
	else
		echo "installing raspbian version..."
		cp -f debian/control.raspbian debian/control
284
		cp -f ../../l2ork_addons/flext/config-lnx-pd-gcc.txt.rpi ../../externals/grill/trunk/flext/buildsys/config-lnx-pd-gcc.txt
Ivica Bukvic's avatar
Ivica Bukvic committed
285
286
		cat ../../externals/OSCx/src/Makefile | sed -e s/-lpd//g > ../../externals/OSCx/src/Makefile
	fi
287
288
289
290
	if [[ $os == "win" ]]; then
		echo "Making Windows package..."
		echo `pwd`
		make install && make package
Jonathan Wilkes's avatar
Jonathan Wilkes committed
291
	elif [[ $os == "osx" ]]; then
292
293
294
		echo "Making OSX package (dmg)..."
		echo `pwd`
		make install && make package
295
	else
296
297
		# create images folder
		mkdir -p ../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra/images
298
299
		make install prefix=$inst_dir
	fi
300
	echo "copying pd-l2ork-specific externals..."
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
301
302
	# patch_name
	# spectdelay
303
304
	if [[ $os == "win" ]]; then
		cd ../../l2ork_addons
Jonathan Wilkes's avatar
Jonathan Wilkes committed
305
	elif [[ $os == "osx" ]]; then
306
		cd ../../l2ork_addons
307
308
309
310
311
312
313
314
315
	else
		cd ../../l2ork_addons/spectdelay/spectdelay~
		./linux-install.sh
		cp -f spectdelay~.pd_linux ../../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cp -f spectdelay~-help.pd ../../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cp -f array* ../../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		# return to l2ork_addons folder
		cd ../../
	fi
Ivica Bukvic's avatar
Ivica Bukvic committed
316
	# install raspberry pi externals (if applicable)
317
	if [ $inno -eq 0 -a $dmg -eq 0 ]; then
318
319
320
321
322
323
324
325
		cd raspberry_pi
		./makeall.sh
		cp -f disis_gpio/disis_gpio.pd_linux ../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cp -f disis_gpio/disis_gpio-help.pd ../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cp -f disis_spi/disis_spi.pd_linux ../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cp -f disis_spi/disis_spi-help.pd ../../packages/linux_make/build$inst_dir/lib/pd-l2ork/extra
		cd ../
	fi
326

327
	echo "done with l2ork addons."
328
	cd ../
329
	# finish install for deb
330
	if [ $inno -eq 0 -a $dmg -eq 0 ]; then
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
		cd packages/linux_make
		rm -f build/usr/local/lib/pd
		if [ $pkg -gt 0 ]; then
		echo "tar full installer..."
		if [ $deb -gt 0 ]
		then
			cd build/
			rm -rf DEBIAN/ etc/
			cd ../
			make deb prefix=$inst_dir
		else
			make tarbz2 prefix=$inst_dir
		fi
		echo "move full installer..."
		if [ $deb -gt 0 ]
		then
347
			mv *.deb ../../
348
349
350
		else
			#rm -f ../../../Pd-l2ork-full-`uname -m`-`date +%Y%m%d`.tar.bz2 2> /dev/null
			#mv build/Pd*bz2 ../../../Pd-l2ork-full-`uname -m`-`date +%Y%m%d`.tar.bz2
351
			mv -f build/pd*bz2 ../..
352
353
354
355
356
		fi
		elif [ $deb -gt 0 ]; then
			make debstage prefix=$inst_dir
		fi
		cd ../../
357
358
359
	# move OSX dmg installer
	elif [ $dmg -gt 0 ]; then
		mv packages/darwin_app/Pd*.dmg .
360
	elif [ $inno -gt 0 ]; then
Jonathan Wilkes's avatar
Jonathan Wilkes committed
361
		mv packages/win32_inno/Output/Purr*.exe .
362
	fi
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
363
364
365
366
367
368
369
fi

cd l2ork_addons/

echo "done."

exit 0