1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
|
#! /bin/sh
# Copyright (C) 2010-2011 Peter de Ridder <peter@xfce.org>
# Copyright (C) 2012 Paweł Forysiuk <tuxator@o2.pl>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file COPYING for the full license text.
# script: makedist.midori [version tag]
#
# This script creates an archive containing all required files for
# midori on windows. The midori version is inserted in the name of
# the archive and appended to the name of the root directory in the
# archive.
# The name of the archive is contructed as follows:
# midori<version tag>-<timestamp>.extension
# The archive contains a root directory named:
# midori<version tag>
# a bit of configuration
root_dir=$MINGW_PREFIX
where_am_i=$PWD
if [ "$GSTREAMER_API_VERSION" == "" ]; then
WEBKIT_VER=$(grep -E '(DEPS_GTK_webkitgtk\-)(.*)(_VERSION)' CMakeCache.txt|cut -d \= -f 2 |cut -c 1)
if [ "$WEBKIT_VER" == "2" ]; then
GSTREAMER_API_VERSION=1.0
else
GSTREAMER_API_VERSION=0.10
fi
fi
if [ "$MINGW_PREFIX" == "" ]; then
echo "Error: MINGW_PREFIX variable is empty!"
exit
fi
# create temporary working directory
temp_dir=`mktemp -d`
# check if we can use 7zip
have_7zip=`which 7za`
GTK3_BUILD=1
# Default to gtk3 but check just in case
GTK3=$(grep GTK3 CMakeCache.txt | awk -F \= '{print $2}')
if [ "$GTK3" != "ON" ] && [ "$GTK3" != "1" ];then
GTK3_BUILD=0
fi
version=$(grep PACKAGE_VERSION ./midori/CMakeFiles/midori.dir/DependInfo.cmake|sed -e 's/^.*PACKAGE_VERSION=\\"\([^"]*\)\\".*$/\1/')
#strip sha from version if release
if [ "$RELEASE" != "" ];then
version=$(echo $version| awk -F \~ '{print $1}')
fi
if [ "$1" != "" ]; then
version_tag="$1"
fi
if [ "$version_tag" != "" ]; then
version_tag=$version-$version_tag
else
version_tag=$version
fi
if [ "$RELEASE" == "" ]; then
ARCHIVE_FILENAME=midori-$version_tag-`date +%Y%m%d%H%M`
else
ARCHIVE_FILENAME=midori-$version_tag
fi
# generate archive filename
if [ "$have_7zip" != "" ]; then
ARCHIVE=$ARCHIVE_FILENAME.7z
else
ARCHIVE=$ARCHIVE_FILENAME.zip
fi
if [ "NSIS" != "" ];then
cp -a $where_am_i/../win32/makedist/midori.nsi $temp_dir
cp -a $where_am_i/../win32/makedist/midori.ico $temp_dir
fi
# function: dll-recursive <list of exe and dll files ...>
#
# recursively search all dll dependencies of the input files.
# The resulting list of dll files including the input files is
# printed to stdout.
dll_recursive ()
{
temp_file_new=`mktemp`
temp_file_old=`mktemp`
while [ "$1" ]
do
echo $1 >> $temp_file_new
shift
done
while [ "x`sha1sum - < $temp_file_new`" != "x`sha1sum - < $temp_file_old`" ]
do
files=`cat $temp_file_new $temp_file_old | sort | uniq -u`
cp -L $temp_file_new $temp_file_old
strings $files 2> /dev/null | grep \\.dll | cat - $temp_file_old | sort | uniq > $temp_file_new
done
cat $temp_file_new
rm $temp_file_new $temp_file_old
}
grab_files ()
{
local dir="$1"
pushd $root_dir > /dev/null
shift
while [ "$1" ]; do
find $dir "(" -name "$1" ")" -prune -exec mkdir -p $workdir/{} ";" -exec rmdir --ignore-fail-on-non-empty $workdir/{} ";" -exec cp -Lr {} $workdir/{} ";"
if [ "$?" -ne "0" ]; then
exit
fi
shift
done
popd > /dev/null
}
grab_icons()
{
local theme="$1"
local list="$2"
sizes=$(grep CreateDirectory $list |awk -F '"' '{print $2}' |awk -F '\' '{print $6}')
categories=$(grep InstallIconTheme $list | awk -F '"' '{print $2}'|sort|uniq)
for category in $categories
do
category_icons=$(grep InstallIconTheme $list |grep $category|awk -F '"' '{print $4}')
for size in $sizes
do
mkdir -p $workdir/share/icons/$theme/$category/$size
for icon in $category_icons
do
cp -L /usr/share/icons/$theme/$category/$size/$icon.* $workdir/share/icons/$theme/$category/$size/
done
done
done
cp -L /usr/share/icons/$theme/index.theme $workdir/share/icons/$theme
}
echo "Creating $ARCHIVE"
# create destination folder
workdir=$temp_dir/midori-$version
mkdir $workdir
echo "<*> Generating dll list..."
# auto generate dll list, only of existing files
pushd $root_dir/bin > /dev/null
dll_recursive midori*.exe gspawn-*-helper*.exe libhunspell*.dll > $temp_dir/midori.exe.lst
dll_recursive ../lib/gio/modules/*.dll >> $temp_dir/midori.exe.lst
dll_recursive iconv.dll >> $temp_dir/midori.exe.lst
# we ship gdb now for -g and diagnostic button
dll_recursive gdb.exe >> $temp_dir/midori.exe.lst
for i in $(cat $temp_dir/midori.exe.lst | grep -v midori | sort | uniq)
do
if [ -f $root_dir/bin/$i ]; then
rpm -qf $root_dir/bin/$i >> $temp_dir/packages_used.lst
fi
done
dll_recursive ../lib/gstreamer-$GSTREAMER_API_VERSION/*.dll >> $temp_dir/midori.exe.lst
rpm -qf $root_dir/lib/gstreamer-$GSTREAMER_API_VERSION/*.dll >> $temp_dir/packages_used.lst
if [ "$DEBUG_BUILD" != "" ]; then
dll_recursive GtkLauncher.exe >> $temp_dir/midori.exe.lst
fi
files=`ls | cat - $temp_dir/midori.exe.lst | sort | uniq -d`
rm $temp_dir/midori.exe.lst
popd > /dev/null
echo "<*> Copying dlls..."
# copy auto generate dll list
pushd $root_dir/bin > /dev/null
mkdir $workdir/bin
cp -L $files $workdir/bin 2>/dev/null
popd > /dev/null
mkdir -p $workdir/bin/Plugins
cat > $workdir/bin/portable.bat << _EOF
@ECHO OFF
echo Starting Midori in portable mode!
start midori.exe --portable
pause
_EOF
echo "<*> Copying configuration files..."
# copy etc
grab_files etc midori
grab_files etc gtkrc
# If modules are not compiled we need a list of them
grab_files etc pango
# Freetype is preferred font backend
# copy configuration, otherwise webkit will crash
grab_files etc fonts
echo "<*> Copying modules and libraries..."
# copy lib
if [ "$GTK3_BUILD" == "1" ]; then
grab_files lib gtk-3.0
else
grab_files lib gtk-2.0
fi
grab_files lib midori
grab_files lib gdk-pixbuf-2.0
grab_files lib enchant
grab_files lib gio
# Fedora ships on-demand pango modules, check just in case
grab_files lib pango
grab_files lib gstreamer-$GSTREAMER_API_VERSION
echo "<*> Copying resources and translations..."
# copy share
grab_files share midori
grab_files share mime
grab_files share midori.mo
grab_icons Faenza $where_am_i/../win32/makedist/midori.nsi
# We need to ship our CA bundle for now
cp -Lr /etc/pki/tls/certs/ca-bundle.crt $workdir/share/midori/res/
GREYBIRD_VER="1.5.3"
if [ "$GTK3_BUILD" == "1" ]; then
grab_files share webkitgtk-3.0
grab_files share schemas
wget --no-verbose "https://github.com/shimmerproject/Greybird/archive/v$GREYBIRD_VER.tar.gz" -P $temp_dir
tar xf "$temp_dir/v$GREYBIRD_VER.tar.gz" -C $temp_dir
mkdir -p $workdir/share/themes/Greybird
cp -Lr $temp_dir/Greybird-$GREYBIRD_VER/gtk-3.0 $workdir/share/themes/Greybird
MO_VER=30
else
grab_files share MS-Windows
grab_files share webkitgtk-1.0
MO_VER=20
fi
if [ "$DEBUG_BUILD" == "" ];then
pushd $workdir > /dev/null
find -iname *.debug -exec rm {} \;
popd > /dev/null
fi
rpm -qf /etc/pki/tls/certs/ca-bundle.crt >> $temp_dir/packages_used.lst
rpm -qf /usr/share/icons/Faenza/ >> $temp_dir/packages_used.lst
echo "https://github.com/shimmerproject/Greybird/archive/v$GREYBIRD_VER.tar.gz" >> $temp_dir/packages_used.lst
pushd $temp_dir > /dev/null
wget --no-verbose "https://github.com/jrfonseca/drmingw/releases/download/0.7.3/drmingw-0.7.3-win32.zip" -P $temp_dir
unzip "$temp_dir/drmingw-0.7.3-win32.zip"
cp -Lr $temp_dir/drmingw-0.7.3-win32/bin/{mgwhelp.dll,exchndl.dll} $workdir/bin
popd > /dev/null
# copy locales for gtk
# so we have translated stock items, file dialogs
pushd $root_dir > /dev/null
find share "(" -name "midori.mo" ")" > $temp_dir/locale.list
mkdir -p $workdir/share/locale/
for LOCALE in $(cat $temp_dir/locale.list); do
LOCALE=$(echo $LOCALE|awk -F/ '{print $3}')
cp /usr/share/locale/$LOCALE/LC_MESSAGES/gtk$MO_VER.mo $workdir/share/locale/$LOCALE/LC_MESSAGES/
done
rm $temp_dir/locale.list
echo "<*> Setting up default gtk settings..."
# we want to override default gtk settings
if [ "$GTK3_BUILD" == "1" ]; then
gtk_etc_dir="$workdir/etc/gtk-3.0/"
gtk_rc_file="$gtk_etc_dir/settings.ini"
else
gtk_etc_dir="$workdir/etc/gtk-2.0/"
gtk_rc_file="$gtk_etc_dir/gtkrc"
fi
mkdir -p $gtk_etc_dir
# Use small icons by default and Faenza icon theme
if [ "$GTK3_BUILD" == "1" ]; then
cat > $gtk_rc_file << _EOF
[Settings]
gtk-icon-theme-name = Faenza
gtk-menu-images = true
_EOF
else
cat > $gtk_rc_file << _EOF
gtk-theme-name = "MS-Windows"
gtk-icon-theme-name = "Faenza"
_EOF
fi
cat >> $gtk_rc_file << _EOF
gtk-toolbar-style = GTK_TOOLBAR_ICONS
gtk-toolbar-icon-size = GTK_ICON_SIZE_MENU
_EOF
mkdir -p $workdir/etc/xdg/midori
cat >> $workdir/etc/xdg/midori/config << _EOF
[settings]
default-font-family=Times New Roman
monospace-font-family=Courier New
default-font-size=14
default-monospace-font-size=14
_EOF
# Don't hardcode mingw path, otherwise fontconfig uses fallback settings
# which tend to look very bad on Windows
sed -r 's@>.+(conf\.d)<@>\1@g' -i $workdir/etc/fonts/fonts.conf
popd > /dev/null
echo "<*> Copying docs..."
# copy doc files to root
cp -L $workdir/share/doc/midori/{COPYING,AUTHORS} $workdir
cat $temp_dir/packages_used.lst | sort | uniq > $workdir/share/doc/midori/README.packages
rm $temp_dir/packages_used.lst
#drop a/la files, we don't do static builds anyway
find $workdir -iname *.*a -exec rm {} \;
echo "<*> Compressing archive (slow)..."
ARCHIVE=`pwd`/$ARCHIVE
# store as zip/7z file
pushd $temp_dir > /dev/null
if [ "$have_7zip" != "" ]; then
7za a -m0=lzma $ARCHIVE midori-$version_tag > /dev/null
else
zip -rq $ARCHIVE midori-$version_tag
fi
if [ "$NSIS" != "" ];then
nsis_file=Midori-${version}_setup.exe
echo "Creating $nsis_file"
makensis -NOCD -V4 ./midori.nsi
mv $nsis_file $where_am_i
fi
popd > /dev/null
echo "<*> Cleaning up..."
# remove working directory
rm -r $temp_dir
echo "<*> Computing checksums..."
sum_file=midori-$version.sha1
sha1sum $ARCHIVE >> $sum_file
if [ "$NSIS" != "" ]; then
sha1sum $nsis_file >> $sum_file
fi
cat $sum_file
|