Prepend wine- to package names
[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         APPNAME="${APPNAME/wine-/}"
39         DEBVERSION="$(dpkg-parsechangelog | grep-dctrl -n -s Version '')"
40         WINE_MASTER_DIR=~/".wine-$APPNAME-master"
41 }
42
43 if [ ! "$1" ]
44 then
45         cat <<'__END__'
46 wine-app-packager
47 =================
48
49 Version: @VERSION@
50
51 This script aids you in creation of Debian packages of Windows applications
52 that are meant to run under wine. It offers the following commands:
53
54 wine-app-packager init
55         creates a Debian source package directory. It will ask various pieces
56         of information. All the following commands will need to run within the
57         created directory.
58
59 wine-app-packager prepare
60         Creates a wine config directory in ~/.wine-<application>-master, based on
61         the current content of the package (if any).
62
63 wine-app-packager run <cmd>
64         Runs cmd in a way that WINEPREFIX is set correctly, i.e.
65         wine-app-packager run wine /tmp/install.exe
66         or
67         wine-app-packager run wine C:\\Applications\\DemoApplication\\DemoApplication.exe
68
69 wine-app-packager commit
70         Takes the changes you made in ~/.wine-<application>-master and puts them
71         back into the Debian source package. Ususally, this will be followed by
72         calls to debchange and debuild to build the package.
73         Removes ~/.wine-<application>-master afterwards.
74
75 wine-app-packager abort
76         Just removes ~/.wine-<application>-master, throwing away all changes.
77
78 A more complete description can be found in the manpage for wine-app-packager.
79 __END__
80         exit 1;
81 fi
82
83 if [ "$1" = "init" ]
84 then
85         cat <<__END__
86 Please enter the name of the application (only lower letters, digits, dots and
87 dashes. It will be the name of the wrapper executable, and, with a wine-
88 prepended, the name of the package
89 Example: wsftp
90 __END__
91
92         read APPNAME
93         if [ -z "$APPNAME" -o -n "$(echo -n "$APPNAME" | tr -d a-z0-9.-)" ]
94         then
95                 echo "Invalid application name \"$APPNAME\"."
96                 exit 1
97         fi
98
99         cat <<__END__
100 Please enter the upstream version of the application, with the same conventions.
101 If there is no meaningful version, leave this field empty.
102 If you want to include a local revision number, append it with a dot (.). Do
103 not use dashes (-) unless you want to generate non-native Debian source package
104 format.
105 Example: 1.0.rev1
106 __END__
107
108         read APPVER
109         if [ -n "$(echo -n "$APPVER" | tr -d a-z0-9.-)" ]
110         then
111                 echo "Invalid application version \"$APPVER\"."
112                 exit 1
113         fi
114
115         if [ -z "$APPVER" ]
116         then
117                 DEBVER="1"
118         else
119                 DEBVER="$APPVER"
120         fi
121         DEBDIR="wine-$APPNAME-$DEBVER"
122
123         if [ -e "$DEBDIR" ]
124         then
125                 cat <<__END__
126 The directory \"$DEBDIR\" does already exist. Please remove it if you want to
127 start from scratch.
128 __END__
129
130                 exit 1
131         fi
132         echo "Creating directory \"$DEBDIR\"."
133         mkdir "$DEBDIR"
134         mkdir "$DEBDIR"/debian
135         echo "Writing \"$DEBDIR/debian/control\""
136
137         if [ -n "$DEBFULLNAME" ]
138         then
139                 MAINT="$DEBFULLNAME <$DEBEMAIL>"
140                 echo "Using maintainer address \"$MAINT\""
141         else
142                 cat <<__END__
143 WARNING: DEBFULLNAME and DEBEMAIL not set. Please adjust maintainer field
144 in debian/control and debian/changelog afterwards.
145 __END__
146                 MAINT="Someone <please-update@in.here>"
147         fi
148         cat >"$DEBDIR/debian/control" <<__END__
149 Source: wine-$APPNAME
150 Maintainer: $MAINT
151 Build-Depends: debhelper (>= 6.0.7~)
152
153 Package: wine-$APPNAME
154 Architecture: all
155 Depends: \${wine:Depends}
156 Description: Application $APPNAME
157  This is a windows application packaged for Debian clients.
158 __END__
159         echo "Writing \"$DEBDIR/debian/compat\""
160         echo 5 > "$DEBDIR/debian/compat"
161         echo "Writing \"$DEBDIR/debian/rules\""
162         cat >"$DEBDIR/debian/rules" <<__END__
163 #!/usr/bin/make -f
164
165 WINEBINARY := \$(shell awk 'BEGIN { FS="=" } \$\$1 == "WINE" {print \$\$2}' < $APPNAME)
166 WINEPKG := \$(word 1,\$(subst :, ,\$(shell dpkg-query -S \$\$(readlink -f \${WINEBINARY}))))
167
168 build:
169         
170
171 clean:
172         dh_testdir
173         dh_testroot
174         dh_clean
175
176 install: build
177         dh_testdir
178         dh_testroot
179         dh_clean -k
180         dh_installdirs
181         
182         if grep -q "^EXE='c:.Programme.Please Adjust.start.exe'" $APPNAME ; \
183         then echo "Please update the EXE variable in the script $APPNAME"; \
184              exit 1; \
185         fi
186
187         if [ ! -x \${WINEBINARY} ]; \
188         then echo "File referenced by WINE=\${WINEBINARY} in the script $APPNAME does not exist."; \
189              exit 1;\
190         fi
191
192 binary-arch: install
193         # nothing to do here
194
195 binary-indep: install
196         dh_testdir
197         dh_testroot
198         dh_installchangelogs
199         dh_installdocs
200         dh_installexamples
201         dh_install
202         dh_installman
203         dh_lintian
204         dh_link
205         dh_strip
206         dh_compress
207         dh_fixperms
208         dh_installdeb
209         dh_shlibdeps
210         dh_gencontrol -- -Vwine:Depends=\${WINEPKG}
211         dh_md5sums
212         dh_builddeb
213
214 binary: binary-indep binary-arch
215 .PHONY: clean binary-indep binary-arch binary install
216 __END__
217         chmod +x "$DEBDIR/debian/rules"
218         echo "Writing \"$DEBDIR/debian/lintian-overrides"
219         cat > "$DEBDIR/debian/lintian-overrides" <<__END__
220 dir-or-file-in-opt
221 binary-without-manpage
222 no-copyright-file
223 no-section-field
224 no-priority-field
225 extra-license-file
226 __END__
227         echo "Writing \"$DEBDIR/debian/source.lintian-overrides"
228         cat > "$DEBDIR/debian/source.lintian-overrides" <<__END__
229 no-standards-version-field
230 no-section-field-for-source
231 __END__
232         echo "Generating \"$DEBDIR/debian/install\""
233         cat >"$DEBDIR/debian/install" <<__END__
234 drive_c /opt/wineapps/wine-$APPNAME/
235 wine-config.tar.gz /opt/wineapps/wine-$APPNAME/
236 $APPNAME /usr/bin
237 __END__
238         echo "Generating \"$APPNAME\" (start wrapper. Please adjust variables at the top)"
239         cat >"$DEBDIR/$APPNAME" <<__END__
240 #!/bin/bash
241
242 # This variable need to be set:
243 EXE='c:\\Programme\\Please Adjust\\start.exe'
244 WINE=/usr/bin/wine
245
246 # These are already filled correctly
247 APPNAME="$APPNAME"
248 WINE_HOME="\$HOME/.wine-\$APPNAME"
249
250 set -e
251 if [ ! -d "\$WINE_HOME" ]
252 then
253         echo "\$APPNAME started for the first time, creating \$WINE_HOME"
254         mkdir -p "\$WINE_HOME"
255         tar --extract --gzip --file /opt/wineapps/wine-\$APPNAME/wine-config.tar.gz -C "\$WINE_HOME"
256         cp -r --symbolic-link /opt/wineapps/wine-\$APPNAME/drive_c/ "\$WINE_HOME"/drive_c
257 fi
258
259
260 export WINEPREFIX="\$WINE_HOME"
261 exec "\$WINE" "\$EXE"
262 __END__
263         chmod +x "$DEBDIR/$APPNAME" 
264         echo "Generating \"$DEBDIR/debian/changelog\""
265         pushd "$DEBDIR"
266         debchange --create --package "wine-$APPNAME" --newversion "$DEBVER" --distribution UNRELEASED "First release of $APPNAME"
267         popd
268         cat <<__END__
269 Done preparing the source package. You can review the contents of these files
270 now, or go ahead with wine-app-packager prepare, from within the created source
271 directory in $DEBDIR. Do not forget to set the variable \$EXE and possibly the variable \$WINE 
272 in the wrapper script $DEBDIR/$APPNAME.
273 __END__
274
275 elif [ "$1" = "prepare" ]
276 then
277         common_setup
278
279         if [ -e "$WINE_MASTER_DIR" ]
280         then
281                 cat <<__END__
282 Directory $WINE_MASTER_DIR already exists. If it contains changes
283 that need to be preserved, please use $0 commit, otherwise remove
284 it before running $0 $1.
285 __END__
286                 exit 1
287         fi
288
289         if [ -d drive_c ]
290         then
291                 echo "Creating $WINE_MASTER_DIR"
292                 mkdir "$WINE_MASTER_DIR"
293                 echo "Extracting ./wine-config.tar.gz to $WINE_MASTER_DIR"
294                 tar --extract --gzip --file ./wine-config.tar.gz -C "$WINE_MASTER_DIR"
295                 echo "Copying ./drive_c to $WINE_MASTER_DIR/drive_c"
296                 rsync --recursive ./drive_c/ $WINE_MASTER_DIR/drive_c
297         else
298                 echo "Empty package, creating empty $WINE_MASTER_DIR"
299                 mkdir "$WINE_MASTER_DIR"
300         fi
301 elif [ "$1" = "run" ]
302 then
303         common_setup
304
305         if [ ! -d "$WINE_MASTER_DIR" ]
306         then
307                 cat <<__END__
308 Directory $WINE_MASTER_DIR does not exist. Please run $0 $1 prepare first.
309 __END__
310                 exit 1
311         fi
312
313         if [ -z "$2" ]
314         then
315                 cat <<__END__
316 You need to pass a program to be run, e.g. $0 $1 wine setup.exe
317 __END__
318                 exit 1
319         fi
320
321         export WINEPREFIX=$WINE_MASTER_DIR
322         shift
323         exec "$@"
324 elif [ "$1" = "commit" ]
325 then
326         common_setup
327
328         if [ ! -d "$WINE_MASTER_DIR" ]
329         then
330                 cat <<__END__
331 Directory $WINE_MASTER_DIR does not exist. Please run $0 $1 prepare first.
332 __END__
333                 exit 1
334         fi
335
336         echo "Copying over $WINE_MASTER_DIR in a tarfile, excluding drive_c"
337         tar --create --file ./wine-config.tar.gz --gzip --directory "$WINE_MASTER_DIR" --exclude drive_c .
338         echo "Copying over drive_c, excluding Profiles"
339         rsync --recursive --delete --exclude windows/profiles --exclude windows/temp "$WINE_MASTER_DIR/drive_c/" drive_c
340
341         echo "Removing $WINE_MASTER_DIR"
342         rm -rf "$WINE_MASTER_DIR"
343         cat <<__END__
344 Change are propagated to the Debian source directory. To build the package,
345 increase the version number with "debchange -i" and build it with "dpkg-buildpackage -uc -us".
346 __END__
347
348 elif [ "$1" = "abort" ]
349 then
350         common_setup
351
352         if [ ! -d "$WINE_MASTER_DIR" ]
353         then
354                 cat <<__END__
355 Directory $WINE_MASTER_DIR does not exist, nothing to abort.
356 __END__
357                 exit 1
358         fi
359
360         echo "Removing $WINE_MASTER_DIR"
361         rm -rf "$WINE_MASTER_DIR"
362 else
363         echo "Unknown command $1. Please run $0 without commands for a usage summary."
364         exit 1
365 fi