7f5a96a55319c7bc74ba6485bbbc78fcb95b057f
[wine-app-packager.git] / wine-app-packager
1 #!/bin/bash
2
3 # TODO:
4 # * LHM-Wine-Pakete beachten
5
6 set -e
7
8 #
9 # © 2009 Joachim Breitner <joachim.breitner@itomig.de>
10 #
11 # Version: @VERSION@
12 #
13 # Licensed under the EUPL, Version 1.0 or – as soon they
14 # will be approved by the European Commission - subsequent
15 # versions of the EUPL (the "Licence");
16 # you may not use this work except in compliance with the
17 # Licence.
18 # You may obtain a copy of the Licence at:
19
20 # http://ec.europa.eu/idabc/7330l5
21
22 # Unless required by applicable law or agreed to in
23 # writing, software distributed under the Licence is
24 # distributed on an "AS IS" BASIS,
25 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
26 # express or implied.
27 # See the Licence for the specific language governing
28 # permissions and limitations under the Licence.
29
30 function common_setup () {
31         if ! [ -d debian ]
32         then
33                 print "Please run command $0 $1 from within the source directory"
34                 exit 1;
35         fi
36
37         APPNAME="$(grep-dctrl -n -F Source -s Source '' < debian/control)"
38         DEBVERSION="$(dpkg-parsechangelog | grep-dctrl -n -s Version '')"
39         WINE_MASTER_DIR=~/".wine-$APPNAME-master"
40 }
41
42 if [ ! "$1" ]
43 then
44         cat <<'__END__'
45 wine-app-packager
46 =================
47
48 Version: @VERSION@
49
50 This script aids you in creation of Debian packages of Windows applications
51 that are meant to run under wine. It offers the following commands:
52
53 wine-app-packager init
54         creates a Debian source package directory. It will ask various pieces
55         of information. All the following commands will need to run within the
56         created directory.
57
58 wine-app-packager prepare
59         Creates a wine config directory in ~/.wine-<application>-master, based on
60         the current content of the package (if any).
61
62 wine-app-packager run <cmd>
63         Runs cmd in a way that WINEPREFIX is set correctly, i.e.
64         wine-app-packager run wine /tmp/install.exe
65         or
66         wine-app-packager run wine C:\\Applications\\DemoApplication\\DemoApplication.exe
67
68 wine-app-packager commit
69         Takes the changes you made in ~/.wine-<application>-master and puts them
70         back into the Debian source package. Ususally, this will be followed by
71         calls to debchange and debuilt to build the package
72         Removes ~/.wine-<application>-master afterwards.
73
74 wine-app-packager abort
75         Just removes ~/.wine-<application>-master, throwing away all changes.
76 __END__
77         exit 1;
78 fi
79
80 if [ "$1" = "init" ]
81 then
82         cat <<__END__
83 Please enter the name of the application (only lower letters, digits, dots and
84 dashes. It will be both the package name and the name of the wrapper executable.
85 Example: wsftp
86 __END__
87
88         read APPNAME
89         if [ -z "$APPNAME" -o -n "$(echo -n "$APPNAME" | tr -d a-z0-9.-)" ]
90         then
91                 echo "Invalid application name \"$APPNAME\"."
92                 exit 1
93         fi
94
95         cat <<__END__
96 Please enter the upstream version of the application, with the same conventions.
97 If there is no meaningful version, leave this field empty.
98 Example: 1.0
99 __END__
100
101         read APPVER
102         if [ -n "$(echo -n "$APPVER" | tr -d a-z0-9.-)" ]
103         then
104                 echo "Invalid application version \"$APPVER\"."
105                 exit 1
106         fi
107
108         if [ -z "$APPVER" ]
109         then
110                 DEBVER="1"
111         else
112                 DEBVER="$APPVER"
113         fi
114         DEBDIR="$APPNAME-$DEBVER"
115
116         if [ -e "$DEBDIR" ]
117         then
118                 cat <<__END__
119 The directory \"$DEBDIR\" does already exist. Please remove it if you want to
120 start from scratch.
121 __END__
122
123                 exit 1
124         fi
125         echo "Creating directory \"$DEBDIR\"."
126         mkdir "$DEBDIR"
127         mkdir "$DEBDIR"/debian
128         echo "Writing \"$DEBDIR/debian/control\""
129
130         if [ -n "$DEBFULLNAME" ]
131         then
132                 MAINT="$DEBFULLNAME <$DEBEMAIL>"
133         else
134                 cat <<__END__
135 WARNING: DEBFULLNAME and DEBEMAIL not set. Please adjust maintainer field
136 in debian/control and debian/changelog afterwards.
137 __END__
138                 MAINT="Someone <please-update@in.here>"
139         fi
140         cat >"$DEBDIR/debian/control" <<__END__
141 Source: $APPNAME
142 Maintainer: $MAINT
143
144 Package: $APPNAME
145 Architecture: all
146 Depends: wine
147 Description: Application $APPNAME
148  This is a windows application packaged for Debian clients.
149 __END__
150         echo "Writing \"$DEBDIR/debian/compat\""
151         echo 5 > "$DEBDIR/debian/compat"
152         echo "Writing \"$DEBDIR/debian/rules\""
153         cat >"$DEBDIR/debian/rules" <<__END__
154 #!/usr/bin/make -f
155 build:
156         
157
158 clean:
159         dh_testdir
160         dh_testroot
161         dh_clean
162
163 install: build
164         dh_testdir
165         dh_testroot
166         dh_clean -k
167         dh_installdirs
168         
169         if grep -q "^EXE='c:.Programme.Please Adjust.start.exe'" $APPNAME ; \
170         then echo "Please update the EXE variable in the script $APPNAME"; \
171              exit 1; \
172         fi;
173         
174         # Add here commands to install the package into debian/<packagename>
175         #\$(MAKE) prefix=\`pwd\`/debian/\`dh_listpackages\`/usr install
176
177 binary-indep: install
178
179 # Build architecture-dependent files here.
180 binary-arch: install
181         dh_testdir
182         dh_testroot
183         dh_installchangelogs
184         dh_installdocs
185         dh_installexamples
186         dh_install
187         dh_installman
188         dh_link
189         dh_strip
190         dh_compress
191         dh_fixperms
192         dh_installdeb
193         dh_shlibdeps
194         dh_gencontrol
195         dh_md5sums
196         dh_builddeb
197
198 binary: binary-indep binary-arch
199 .PHONY: clean binary-indep binary-arch binary install
200 __END__
201         chmod +x "$DEBDIR/debian/rules"
202         echo "Generating \"$DEBDIR/debian/install\""
203         cat >"$DEBDIR/debian/install" <<__END__
204 drive_c /opt/wineapps/wine-$APPNAME/
205 wine-config.tar.gz /opt/wineapps/wine-$APPNAME/
206 $APPNAME /usr/bin
207 __END__
208         echo "Generating \"$APPNAME\" (start wrapper. Please adjust variables at the top)"
209         cat >"$DEBDIR/$APPNAME" <<__END__
210 #!/bin/bash
211
212 # This variable need to be set:
213 EXE='c:\\Programme\\Please Adjust\\start.exe'
214
215 # These are already filled correctly
216 APPNAME="$APPNAME"
217 WINE_HOME="\$HOME/.wine-\$APPNAME"
218
219 set -e
220 if [ ! -d "\$WINE_HOME" ]
221 then
222         echo "\$APPNAME started for the first time, creating \$WINE_HOME"
223         mkdir -p "\$WINE_HOME"
224         tar --extract --gzip --file /opt/wineapps/wine-\$APPNAME/wine-config.tar.gz -C "\$WINE_HOME"
225         cp -r --symbolic-link /opt/wineapps/wine-\$APPNAME/drive_c/ "\$WINE_HOME"/drive_c
226 fi
227
228
229 export WINEPREFIX="\$WINE_HOME"
230 exec wine "\$EXE"
231 __END__
232         chmod +x "$DEBDIR/$APPNAME" 
233         echo "Generating \"$DEBDIR/debian/changelog\""
234         pushd "$DEBDIR"
235         debchange --create --package "$APPNAME" --newversion "$DEBVER" --distribution UNRELEASED "First release of $APPNAME"
236         popd
237         cat <<__END__
238 Done preparing the source package. You can review the contents of these files
239 now, or go ahead with wine-app-packager prepare, from within the created source
240 directory in $DEBDIR.
241 __END__
242
243 elif [ "$1" = "prepare" ]
244 then
245         common_setup
246
247         if [ -e "$WINE_MASTER_DIR" ]
248         then
249                 cat <<__END__
250 Directory $WINE_MASTER_DIR already exists. If it contains changes
251 that need to be preserved, please use $0 commit, otherwise remove
252 it before running $0 $1.
253 __END__
254                 exit 1
255         fi
256
257         if [ -d drive_c ]
258         then
259                 echo "Creating $WINE_MASTER_DIR"
260                 mkdir "$WINE_MASTER_DIR"
261                 echo "Extracting ./wine-config.tar.gz to $WINE_MASTER_DIR"
262                 tar --extract --gzip --file ./wine-config.tar.gz -C "$WINE_MASTER_DIR"
263                 echo "Copying ./drive_c to $WINE_MASTER_DIR/drive_c"
264                 rsync --recursive ./drive_c/ $WINE_MASTER_DIR/drive_c
265         else
266                 echo "Empty package, creating empty $WINE_MASTER_DIR"
267                 mkdir "$WINE_MASTER_DIR"
268         fi
269 elif [ "$1" = "run" ]
270 then
271         common_setup
272
273         if [ ! -d "$WINE_MASTER_DIR" ]
274         then
275                 cat <<__END__
276 Directory $WINE_MASTER_DIR does not exist. Please run $0 $1 prepare first.
277 __END__
278                 exit 1
279         fi
280
281         if [ -z "$2" ]
282         then
283                 cat <<__END__
284 You need to pass a program to be run, e.g. $0 $1 wine setup.exe
285 __END__
286                 exit 1
287         fi
288
289         export WINEPREFIX=$WINE_MASTER_DIR
290         shift
291         exec "$@"
292 elif [ "$1" = "commit" ]
293 then
294         common_setup
295
296         if [ ! -d "$WINE_MASTER_DIR" ]
297         then
298                 cat <<__END__
299 Directory $WINE_MASTER_DIR does not exist. Please run $0 $1 prepare first.
300 __END__
301                 exit 1
302         fi
303
304         echo "Copying over $WINE_MASTER_DIR in a tarfile, excluding drive_c"
305         tar --create --file ./wine-config.tar.gz --gzip --directory "$WINE_MASTER_DIR" --exclude drive_c .
306         echo "Copying over drive_c, excluding Profiles"
307         rsync --recursive --delete --exclude windows/profiles --exclude windows/temp "$WINE_MASTER_DIR/drive_c/" drive_c
308
309         echo "Removing $WINE_MASTER_DIR"
310         rm -rf "$WINE_MASTER_DIR"
311         cat <<__END__
312 Change are propagated to the Debian source directory. To build the package,
313 increase the version number with "debchange -i" and build it with "dpkg-buildpackage -uc -us".
314 __END__
315
316 elif [ "$1" = "abort" ]
317 then
318         common_setup
319
320         if [ ! -d "$WINE_MASTER_DIR" ]
321         then
322                 cat <<__END__
323 Directory $WINE_MASTER_DIR does not exist, nothing to abort.
324 __END__
325                 exit 1
326         fi
327
328         echo "Removing $WINE_MASTER_DIR"
329         rm -rf "$WINE_MASTER_DIR"
330 else
331         echo "Unknown command $1. Please run $0 without commands for a usage summary."
332         exit 1
333 fi