/[polypkg]/trunk/pp.back.deb
ViewVC logotype

Contents of /trunk/pp.back.deb

Parent Directory Parent Directory | Revision Log Revision Log


Revision 202 - (show annotations)
Fri Oct 31 17:19:23 2008 UTC (12 months, 3 weeks ago) by dleonard
File size: 13359 byte(s)
remove warning about %depends.run not found
1 # Debian backend
2 # http://www.debian.org/doc/debian-policy/
3 # http://www.debian.org/doc/manuals/reference/ch-package.en.html
4
5 pp_platforms="$pp_platforms deb"
6
7 #@ pp_backend_deb_detect(uname_s): return true if matches uname on deb
8 pp_backend_deb_detect () {
9 test -f /etc/debian_version
10 }
11
12 #@ pp_deb_cmp_full_name(component hyphen): translate cpt into a Debian pkg name
13 pp_deb_cmp_full_name () {
14 typeset prefix
15 prefix="${pp_deb_name:-$name}"
16 case "$1" in
17 run) echo "${prefix}" ;;
18 dbg) echo "${prefix}-${pp_deb_dbg_pkgname}";;
19 dev) echo "${prefix}-${pp_deb_dev_pkgname}";;
20 doc) echo "${prefix}-${pp_deb_doc_pkgname}";;
21 *) pp_error "unknown component '$1'";
22 esac
23 }
24
25 #@ pp_backend_deb_init(): initialises platform variables for deb
26 pp_backend_deb_init () {
27 pp_deb_dpkg_version="2.0"
28 pp_deb_name=
29 pp_deb_version=
30 pp_deb_release=
31 pp_deb_arch=
32 pp_deb_arch_std=
33 pp_deb_maintainer=support@quest.com
34 pp_deb_copyright=
35 pp_deb_distro=
36 pp_deb_control_description=
37 pp_deb_summary=
38 pp_deb_description=
39 pp_deb_dbg_pkgname="dbg"
40 pp_deb_dev_pkgname="dev"
41 pp_deb_doc_pkgname="doc"
42 pp_deb_section=contrib # Free software that depends on non-free software
43
44 # Detect the host architecture
45 pp_deb_detect_arch
46
47 # Make sure any programs we require are installed
48 pp_deb_check_required_programs
49
50 # Set generated/interrogated platforms variables
51 pp_deb_munge_description
52 }
53
54 #@ pp_deb_check_required_programs(): looks for required programs
55 pp_deb_check_required_programs () {
56 typeset p needed notfound ok
57 needed= notfound=
58 for prog in dpkg dpkg-deb install md5sum fakeroot
59 do
60 if which $prog 2>/dev/null >/dev/null; then
61 pp_debug "$prog: found"
62 else
63 pp_debug "$prog: not found"
64 case "$prog" in
65 dpkg|dpkg-deb) p=dpkg;;
66 install|md5sum) p=coreutils;;
67 fakeroot) p=fakeroot;;
68 *) pp_die "unexpected dpkg tool $prog";;
69 esac
70 notfound="$notfound $prog"
71 pp_contains "$needed" "$p" || needed="$needed $p"
72 fi
73 done
74 if [ -n "$notfound" ]; then
75 pp_error "cannot find these programs: $notfound"
76 pp_error "please install these packages: $needed"
77 fi
78 }
79
80 #@ pp_deb_munge_description()<file: converts the description to a format that
81 # is control file friendly
82 pp_deb_munge_description () {
83 # Insert a leading space on each line, replace blank lines with a
84 #space followed by a full-stop.
85 pp_deb_control_description=`echo ${pp_deb_description:-$description} | \
86 sed "s,^\(.*\)$, \1, " \
87 | sed "s,^[ \t]*$, .,g"`
88
89 }
90
91 #@ pp_deb_detect_arch: sets pp_deb_arch, pp_deb_arch_std
92 pp_deb_detect_arch () {
93 pp_deb_arch=`dpkg --print-architecture`
94 pp_deb_arch_std=`uname -m`
95 }
96
97 #@ pp_deb_make_control(cmp) > control: creates a debian control file
98 pp_deb_make_control() {
99 package_name=`pp_deb_cmp_full_name "$1"`
100 cat <<-.
101 Package: ${package_name}
102 Version: ${pp_deb_version:-$version}-${pp_deb_release:-1}
103 Section: ${pp_deb_section:-contrib}
104 Priority: optional
105 Architecture: ${pp_deb_arch}
106 Maintainer: ${pp_deb_maintainer:-$maintainer}
107 Description: ${pp_deb_summary:-$summary}
108 ${pp_deb_control_description}
109 .
110 if test -s $pp_wrkdir/%depend."$1"; then
111 sed -ne '/^[ ]*$/!s/^[ ]*/Depends: /p' \
112 < $pp_wrkdir/%depend."$1"
113 fi
114 }
115
116 #@ pp_deb_make_md5sums(data_dir file...) create md5sums for data files.
117 # files are relative to $data_dir
118 pp_deb_make_md5sums() {
119 typeset cmp="$1"; shift
120 typeset pkg_dir
121
122 pkg_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
123 (cd $pkg_dir && md5sum "$@") > $pkg_dir/DEBIAN/md5sums ||
124 pp_error "cannot make md5sums"
125 }
126
127 #@ pp_deb_make_package_maintainer_script(output, source, description):
128 # create package maintainer script
129 pp_deb_make_package_maintainer_script() {
130 typeset output="$1"
131 typeset source="$2"
132 typeset desc="$3"
133
134 # See if we need to create this script at all
135 if [ -s "$source" ]
136 then
137
138 # Create header
139 cat <<-. >$output || pp_error "Cannot create $output"
140 #!/bin/sh
141 # $desc
142 # Generated by PolyPackage $pp_version
143
144 .
145
146 cat $source >> "$output" || pp_error "Cannot append to $output"
147
148 # Set perms
149 chmod 755 "$output" || pp_error "Cannot chmod $output"
150 fi
151 }
152
153 #@ pp_deb_handle_services(): handle services and append appropriate stuff
154 # to postinst/prerm
155 pp_deb_handle_services() {
156 typeset svc
157
158 #-- add service start/stop code
159 if test -n "$pp_services"; then
160 #-- record the uninstall commands in reverse order
161 for svc in $pp_services; do
162 pp_load_service_vars $svc
163
164 # Create init script (unless one exists)
165 pp_deb_service_make_init_script $svc
166
167 #-- append %post code to install the svc
168 test x"yes" = x"$enable" &&
169 cat<<-. >> $pp_wrkdir/%post.run
170 # Install the service links
171 /usr/sbin/update-rc.d $svc defaults
172 .
173
174 #-- prepend %preun code to stop svc
175 cat<<-. | pp_prepend $pp_wrkdir/%preun.run
176 # Stop the $svc service
177 if test -x /usr/sbin/invoke-rc.d; then
178 /usr/sbin/invoke-rc.d $svc stop
179 else
180 /etc/init.d/$svc stop
181 fi
182 # Remove the service links
183 /usr/sbin/update-rc.d -f $svc remove
184 .
185 done
186 #pp_deb_service_remove_common | pp_prepend $pp_wrkdir/%preun.run
187 fi
188
189 }
190 #@ pp_deb_fakeroot(): runs fakeroot with the current savefile
191 pp_deb_fakeroot () {
192 if test -s $pp_wrkdir/fakeroot.save; then
193 fakeroot -i $pp_wrkdir/fakeroot.save -s $pp_wrkdir/fakeroot.save "$@"
194 else
195 fakeroot -s $pp_wrkdir/fakeroot.save "$@"
196 fi
197 }
198
199 #@ pp_deb_make_DEBIAN(): create control files
200 pp_deb_make_DEBIAN() {
201 typeset cmp="${1:-run}"
202 typeset data cmp_full_name
203 typeset old_umask
204
205 old_umask=`umask`
206 umask 0022
207 cmp_full_name=`pp_deb_cmp_full_name $cmp`
208 data=$pp_wrkdir/$cmp_full_name
209
210 # Create DEBIAN dir $data/DEBIAN
211 mkdir -p $data/DEBIAN
212
213 # Create control file
214 pp_deb_make_control $cmp > $data/DEBIAN/control
215
216 # Copy in conffiles
217 if test -f $pp_wrkdir/%conffiles.$cmp; then
218 cp $pp_wrkdir/%conffiles.$cmp $data/DEBIAN/conffiles
219 fi
220
221 # Create postinst
222 pp_deb_make_package_maintainer_script "$data/DEBIAN/postinst" \
223 "$pp_wrkdir/%post.$cmp" "Post install script for $cmp_full_name"\
224 || exit $?
225
226 # Create prerm
227 pp_deb_make_package_maintainer_script "$data/DEBIAN/prerm" \
228 "$pp_wrkdir/%preun.$cmp" "Pre-uninstall script for $cmp_full_name"\
229 || exit $?
230
231 umask $old_umask
232 }
233
234 #@ pp_deb_make_data(name): Package up data files for .deb
235 pp_deb_make_data() {
236 typeset _l t m o g f p st data
237 typeset data share_doc owner group
238 cmp=$1
239 data=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
240 cat $pp_wrkdir/%files.${cmp} | while read t m o g f p st; do
241 test x"$o" = x"-" && o=root
242 test x"$g" = x"-" && g=root
243 case "$t" in
244 f) # Files
245 pp_deb_fakeroot install -D -o $o -g $g -m ${m} $pp_destdir/$p $data/$p;
246 if [ x"$f" = x"v" ]
247 then
248 # File marked as "volatile". Assume this means it's a conffile
249 # TODO: check this as admins like modified conffiles to be left
250 # behind
251 echo "$p" >> $pp_wrkdir/%conffiles.$cmp
252 fi;;
253
254 d) # Directories
255 pp_deb_fakeroot install -m ${m} -o $o -g $g -d $data/$p;;
256
257 s) # Symlinks
258 # Remove leading / from vars
259 rel_p=`echo $p | sed s,^/,,`
260 rel_st=`echo $st | sed s,^/,,`
261 # TODO: we are always doing absolute links here. We should follow
262 # the debian policy of relative links when in the same top-level
263 # directory
264 (cd $data; ln -sf $st $rel_p);;
265 *) pp_error "Unsupported data file type: $t";;
266 esac
267 done
268
269 # If no copyright file is present add one. This is a debian requirement.
270 share_doc="/usr/share/doc/`pp_deb_cmp_full_name $cmp`"
271 if [ ! -f "$data/$share_doc/copyright" ]
272 then
273 echo "${pp_deb_copyright:-$copyright}" > "$pp_wrkdir/copyright"
274 install -D -m 644 "$pp_wrkdir/copyright" "$data/$share_doc/copyright"
275 fi
276
277 }
278
279 #@ pp_deb_makedeb(component): creates directory structure ready for dpkg-deb
280 pp_deb_makedeb () {
281 typeset cmp
282 typeset package_build_dir
283
284 cmp="$1"
285
286 package_build_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
287
288 # Create package dir
289 mkdir -p $package_build_dir
290
291 # Copy in data
292 pp_deb_make_data $cmp ||
293 pp_die "Could not make DEBIAN data files for $cmp"
294
295 # Make control files
296 # must be done after copying data so conffiles are found
297 pp_deb_make_DEBIAN $cmp ||
298 pp_die "Could not make DEBIAN control files for $cmp"
299
300 # Create md5sums
301 pp_deb_make_md5sums $cmp `(cd $package_build_dir;
302 find . -type f -a -not -name DEBIAN | sed "s,^\./,,")` ||
303 pp_die "Could not make DEBIAN md5sums for $cmp"
304 }
305
306 #@ pp_backend_deb(): processes output files to generate a package files
307 pp_backend_deb () {
308 typeset debname
309
310 # Handle services
311 pp_deb_handle_services $cmp
312
313 for cmp in $pp_components
314 do
315 debname=`pp_deb_name $cmp`
316 pp_deb_makedeb $cmp
317 done
318
319 . $pp_wrkdir/%fixup
320
321 for cmp in $pp_components
322 do
323 debname=`pp_deb_name $cmp`
324 # Create debian package
325 pp_debug "Building `pp_deb_cmp_full_name $cmp` -> $output"
326 pp_deb_fakeroot dpkg-deb \
327 --build $pp_wrkdir/`pp_deb_cmp_full_name $cmp` \
328 $pp_wrkdir/$debname ||
329 pp_error "failed to create $cmp package"
330 done
331 }
332
333 #@ pp_backend_deb_cleanup(): removes any files created outside $pp_wrkdir
334 pp_backend_deb_cleanup () {
335 # rm -rf $pp_wrkdir
336 :
337 }
338
339 #@ pp_deb_name(component): prints the names of the package files
340 pp_deb_name () {
341 typeset cmp="${1:-run}"
342 echo `pp_deb_cmp_full_name $cmp`"_${pp_deb_version:-$version}-${pp_deb_release:-1}_${pp_deb_arch}.deb"
343 }
344 #
345 #@ pp_backend_deb_names: prints the names of the package files
346 pp_backend_deb_names () {
347 for cmp in $pp_components
348 do
349 pp_deb_name $cmp
350 done
351 }
352
353 #@ pp_backend_deb_install_script(): generate a helper install script
354 pp_backend_deb_install_script () {
355 typeset cmp _cmp_full_name
356
357 echo "#!/bin/sh"
358 pp_install_script_common
359
360 cat <<.
361
362 cmp_to_pkgname () {
363 test x"\$*" = x"all" &&
364 set -- $pp_components
365 for cmp
366 do
367 case \$cmp in
368 .
369 for cmp in $pp_components; do
370 echo "$cmp) echo '`pp_deb_cmp_full_name $cmp`';;"
371 done
372 cat <<.
373 *) usage;;
374 esac
375 done
376 }
377
378
379 cmp_to_pathname () {
380 test x"\$*" = x"all" &&
381 set -- $pp_components
382 for cmp
383 do
384 case \$cmp in
385 .
386 for cmp in $pp_components; do
387 echo "$cmp) echo \${PP_PKGDESTDIR:-.}/'`pp_deb_name $cmp`';;"
388 done
389 cat <<.
390 *) usage;;
391 esac
392 done
393 }
394
395 test \$# -eq 0 && usage
396 op="\$1"; shift
397 case "\$op" in
398 list-components)
399 test \$# -eq 0 || usage \$op
400 echo $pp_components
401 ;;
402 list-services)
403 test \$# -eq 0 || usage \$op
404 echo $pp_services
405 ;;
406 list-files)
407 test \$# -ge 1 || usage \$op
408 cmp_to_pathname "\$@"
409 ;;
410 install)
411 test \$# -ge 1 || usage \$op
412 dpkg --install \`cmp_to_pathname "\$@"\`
413 ;;
414 uninstall)
415 test \$# -ge 1 || usage \$op
416 dpkg --remove \`cmp_to_pkgname "\$@"\`; :
417 ;;
418 start|stop)
419 test \$# -ge 1 || usage \$op
420 ec=0
421 for svc
422 do
423 /etc/init.d/\$svc \$op || ec=1
424 done
425 exit \$ec
426 ;;
427 print-platform)
428 test \$# -eq 0 || usage \$op
429 echo "linux-${pp_deb_arch}"
430 ;;
431 *)
432 usage
433 ;;
434 esac
435 .
436 }
437
438 #@ pp_backend_deb_probe(): output local platform's short id
439 pp_backend_deb_probe() {
440 typeset arch distro release
441
442 pp_deb_detect_arch
443
444 # /etc/debian_version exists on Debian & Ubuntu, so it's no use
445 # to us. Use lsb_release instead.
446
447 case `(lsb_release -is || echo no-lsb) 2>/dev/null` in
448 Debian)
449 distro=deb
450 ;;
451 Ubuntu)
452 distro=ubu
453 ;;
454 no-lsb)
455 echo unknown-$pp_deb_arch_std
456 return 0
457 ;;
458 *)
459 distro=unknown
460 ;;
461 esac
462
463 release=`lsb_release -rs`
464
465 # If release is not numeric, use the codename
466 case $release in
467 *[!.0-9r]*)
468 release=`lsb_release -cs`
469 ;;
470 *)
471 # Remove trailing revision number and any dots
472 release=`echo $release | cut -dr -f1 | tr -d .`
473 ;;
474 esac
475
476 echo $distro$release-$pp_deb_arch_std
477 }
478
479 #@ pp_backend_deb_vas_platforms(): print the VAS platform identifiers
480 pp_backend_deb_vas_platforms () {
481 case "$pp_deb_arch_std" in
482 x86_64) echo "linux-x86_64.deb";; # DO NOT add linux-x86.deb here!!
483 *86) echo "linux-x86.deb";;
484 *) pp_die "unknown architecture ${pp_deb_arch_std}";;
485 esac
486 }

Ted.Percival@quest.com
ViewVC Help
Powered by ViewVC 1.1.2