summaryrefslogtreecommitdiff
path: root/solenv/bin/install-gdb-printers
blob: e55e305226e8a3b56fdab55708c61975f3740486 (plain)
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
#!/usr/bin/env bash
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#

GDBDIR="${SOLARENV}/gdb"
SOLVERLIBDIR="${SOLARVER}/${INPATH}/lib"
INSTALLDIR="${DEVINSTALLDIR}/opt"
DYLIB=so
if [ "$(uname)" = Darwin ]; then
    INSTALLDIR=$INSTALLDIR/LibreOffice.app/Contents
    DYLIB=dylib
fi

die() {
    echo "$1" >&2
    exit 1
}

usage() {
    cat <<EOT
Install gdb pretty printers and autoloaders for them.

Usage:
install-gdb-printers [ -a dir ] [ -i dir ] [ -p dir ] [ -c ] [ -L ]
install-gdb-printers -h

Options:
-a dir  The dir where autoloaders will be placed. Defaults to whatever -i
        is.
-c      Create the autoloader's dir if it does not exist. This option only
        makes sense if both -a and -i are used.
-f      Do not create subdirs in the autoloader's dir. This option is only
        used during build.
-h      Show this help text.
-i dir  The dir where libreoffice is installed. Defaults to whatever -a is.
-L      Create symlinks to autoloaders already present in the build tree.
        Only makes sense for dev. installation.
-p dir  The dir where pretty printers are placed.

Env. variables:
DESTDIR     If set, it is prepended to all dir arguments.

Examples:
1) Make pretty printers usable in your dev. installation (this is
   already done as part of make dev-install, but it would not have been
   run if smoketest failed):

install-gdb-printers -L

2) Install pretty printers into /usr/share/libreoffice/gdb, with
   autoloaders in /usr/share/gdb/auto-load (run
   "info gdb 'Extending GDB' Python Auto-loading" to learn more) and
   installation in /usr/lib64/libreoffice (this is what Fedora does):

install-gdb-printers -a /usr/share/gdb/auto-load/usr/lib64/libreoffice -c \\
    -i /usr/lib64/libreoffice -p /usr/share/libreoffice/gdb
EOT
}

make_autoload() {
    local dir="${DESTDIR}${autoloaddir}"
    ${flat} || dir="${dir}/$2"
    local lib="${dir}/$3"
    local merged="$4"

    if ! ${flat}; then
        local resolved="$(readlink "${DESTDIR}${installdir}/$2/$3")"
        [ -n "$resolved" ] && lib=$resolved
        dir="${lib%/*}"
    fi

    if ${create}; then
        mkdir -p "${dir}" || die "cannot create dir '${dir}'"
    fi

    if ${link}; then
        if [[ ${dir} != ${SOLVERLIBDIR} ]]; then
            local gdbname="${lib##*/}-gdb.py"
            [[ -f ${dir}/${gdbname} ]] && rm -f "${dir}/${gdbname}"
            ln -s "${SOLVERLIBDIR}/${gdbname}" "${dir}/${gdbname}"
        fi
    else
        [[ -f ${lib}-gdb.py ]] && rm -f "${lib}-gdb.py"
        if [[ -n "${merged}" ]]; then
            sed -e "s!%PYTHONDIR%!${pythondir}!" -e "s!%MODULES%!${*:5}!" \
                "${GDBDIR}/autoload.template" > "${lib}-gdb.py"
        else
            sed -e "s!%PYTHONDIR%!${pythondir}!" -e "s!%MODULES%!$1!" \
                "${GDBDIR}/autoload.template" > "${lib}-gdb.py"
        fi
    fi
}

# dir where the autoloaders will be placed
autoloaddir=
# The installation dir. If only one of these is set, the other is set to
# the same value.
installdir=
# dir where the pretty printers will be placed
pythondir="${GDBDIR}"
# Create autoload dir if it does not exist. This only makes sense when
# installing into system gdb dir, so $autoloaddir must be absolute path.
create=false
# Create symlinks to existing autoloaders in solver. This only makes
# sense for dev-install.
link=false
# This option is only here to enable using the script during build of
# solenv/gdb . We must (or, better, want to :) avoid using the
# installation subpaths (like ure-link), because all libs in solver
# are in the same dir.
flat=false

#  b de g  jklmno qrstuvwxyzABCDEFGHIJK MNOPQRSTUVWXYZ0123456789
while getopts :a:cfhi:p:L opt; do
    case ${opt} in
        a) autoloaddir="${OPTARG}" ;;
        c) create=true ;;
        f) flat=true ;;
        h) usage; exit ;;
        i) installdir="${OPTARG}" ;;
        p) pythondir="${OPTARG}" ;;
        L) link=true ;;
        *) die "unknown option ${OPTARG}" ;;
    esac
done

if [[ -z ${autoloaddir} && -z ${installdir} ]]; then
    autoloaddir="${INSTALLDIR}"
    installdir="${INSTALLDIR}"
elif [[ -n ${autoloaddir} && -z ${installdir} ]]; then
    installdir="${autoloaddir}"
elif [[ -z ${autoloaddir} && -n ${installdir} ]]; then
    autoloaddir="${installdir}"
fi

${create} && ${link} && die "-c and -L cannot be used together"
if [[ -n ${DESTDIR} ]]; then
    [[ ${autoloaddir:0:1} = / ]] || die 'the arg to -a must be an absolute path'
    [[ ${pythondir:0:1} = / ]] || die 'the arg to -p must be an absolute path'
fi
if ${create}; then
    [[ ${autoloaddir:0:1} = / ]] || die 'the arg to -a must be an absolute path'
else
    [[ ! -d ${DESTDIR}${autoloaddir} ]] && die "directory '${DESTDIR}${autoloaddir}' does not exist"
fi
[[ ! -d ${DESTDIR}${installdir} ]] && die "directory '${DESTDIR}${installdir}' does not exist"
[[ ! -d ${GDBDIR} ]] && die "directory '${GDBDIR}' does not exist"

if [[ ${DESTDIR}${pythondir} != ${GDBDIR} ]]; then
    mkdir -p "${DESTDIR}${pythondir}" || die "cannot create dir '${DESTDIR}${pythondir}'"
    cp -pr "${GDBDIR}/libreoffice" "${DESTDIR}${pythondir}"
fi

if [[ -n "${MERGELIBS}" ]]; then
    make_autoload merged program libmergedlo."$DYLIB" merge svl tl `[[ ${MERGELIBS} == "ALL" ]] && echo sw`
    if [[ ${MERGELIBS} == "ALL" ]]; then
        make_autoload urelibs ure-link/lib liburelibs."$DYLIB" merge cppu sal
    else
        make_autoload cppu ure-link/lib libuno_cppu."$DYLIB".3
        make_autoload sal ure-link/lib libuno_sal."$DYLIB".3
        make_autoload sw program libswlo."$DYLIB"
    fi
else
    make_autoload cppu ure-link/lib libuno_cppu."$DYLIB".3
    make_autoload sal ure-link/lib libuno_sal."$DYLIB".3
    make_autoload svl program libsvllo."$DYLIB"
    make_autoload tl program libtllo."$DYLIB"
    make_autoload sw program libswlo."$DYLIB"
fi

# vim:set shiftwidth=4 softtabstop=4 expandtab: