common.sh 7.62 KB
Newer Older
1 2
#!/bin/sh

3 4 5 6 7 8
fatal()
{
    echo "FATAL: $*" >&2
    exit 1
}

9
# compatibility layer
10 11 12 13

# check if <arg> is a real command
is_command()
{
14
    epm tool which "$1" >/dev/null
15 16
}

17
# add realpath if missed
18
if ! is_command realpath ; then
19 20 21 22 23 24 25 26
realpath()
{
    [ -n "$*" ] || return
    readlink -f "$@"
}
fi

# add subst if missed
27
if ! is_command subst ; then
28 29 30 31 32 33
subst()
{
    sed -i -e "$@"
}
fi

34

35
# Remove file from the file system and from spec
36 37 38 39
# Usage: remove_file <path_to_file>
remove_file()
{
    local file="$1"
40
    [ -n "$file" ] || return
41
    [ -e "$BUILDROOT$file" ] || [ -L "$BUILDROOT$file" ] || return
42

43
    rm -v "$BUILDROOT$file"
44 45
    subst "s|^$file$||" $SPEC
    subst "s|^\"$file\"$||" $SPEC
46 47
    subst "s|^\(%config.*\) $file$||" $SPEC
    subst "s|^\(%config.*\) \"$file\"$||" $SPEC
48 49
}

50 51 52 53 54
is_dir_empty()
{
    [ -z "$(ls -A "$1")" ]
}

55 56 57 58 59 60 61
is_url()
{
    echo "$1" | grep -q "^[filehtps]*:/"
}



62 63 64 65 66 67 68 69 70 71 72 73 74 75
# Move file to a new place
move_file()
{
    local from="$1"
    local to="$2"
    [ -e "$BUILDROOT$from" ] || return
    mkdir -p "$(dirname "$BUILDROOT$to")" || return
    cp -av "$BUILDROOT$from" "$BUILDROOT$to" || return
    remove_file "$from"
    pack_file "$to"
    # try remove dir if empty
    is_dir_empty "$(dirname "$BUILDROOT$from")" && remove_dir "$(dirname" $from")"
}

76
# Remove dir (recursively) from the file system and from spec
77 78 79
remove_dir()
{
    local file="$1"
80
    [ -n "$file" ] || return
81
    [ -d "$BUILDROOT$file/" ] || return
82

83 84 85 86
    # canonicalize
    file="$(echo "$file" | sed -e 's|/*$||')"

    echo "Removing $file dir ..."
87
    rm -r "$BUILDROOT$file/"
88 89 90
    subst "s|.*$file/.*||" $SPEC
    subst "s|.*$file\"$||" $SPEC
    subst "s|.*$file$||" $SPEC
91 92
}

93 94 95 96 97 98 99 100 101
has_space()
{
    [ "${1/ /}" != "$1" ]
}

has_wildcard()
{
    [ "${1/\*/}" != "$1" ]
}
102

103
# Add file to spec (if missed)
104 105 106
# Usage: pack_file <path_to_file>
pack_file()
{
107 108 109 110
    local file="$1"
    [ -n "$file" ] || return
    grep -q "^$file$" $SPEC && return
    grep -q "\"$file\"" $SPEC && return
111
    has_space "$file" && file="\"$file\""
112
    subst "s|%files|%files\n$file|" $SPEC
113 114
}

115
# Add dir (only dir) to spec (if missed)
116 117 118 119 120
# Usage: pack_dir <path_to_dir>
pack_dir()
{
    local file="$1"
    [ -n "$file" ] || return
121 122
    grep -q "^%dir[[:space:]]$file/*$" $SPEC && return
    grep -q "^%dir[[:space:]]\"$file/*\"$" $SPEC && return
123
    has_space "$file" && file="\"$file\""
124 125 126
    subst "s|%files|%files\n%dir $file|" $SPEC
}

127 128 129 130
install_file()
{
    local src="$1"
    local dest="$2"
131

132
    mkdir -p "$BUILDROOT/$(dirname "$dest")" || return
133 134 135

    if is_url "$src" ; then
        epm tool eget -O "$BUILDROOT$dest" "$src" || fatal "Can't download $src to install to $dest"
136
    elif echo "$src" | grep -q "^/" ; then
137
        cp "$BUILDROOT/$src" "$BUILDROOT/$dest" || return
138 139
    else
        cp "$src" "$BUILDROOT/$dest" || return
140 141
    fi

142 143
    pack_file "$dest"
}
144 145 146 147 148 149 150

add_bin_link_command()
{
    local name="$1"
    local target="$2"
    [ -n "$name" ] || name="$PRODUCT"
    [ -n "$target" ] || target="$PRODUCTDIR/$name"
151
    [ -e "$BUILDROOT/usr/bin/$name" ] && return
152
    [ "$name" = "$target" ] && return
153 154

    mkdir -p $BUILDROOT/usr/bin/
155 156
    ln -s "$target" "$BUILDROOT/usr/bin/$name" || return
    pack_file "/usr/bin/$name"
157 158 159 160 161 162 163 164 165
}


add_bin_exec_command()
{
    local name="$1"
    local target="$2"
    [ -n "$name" ] || name="$PRODUCT"
    [ -n "$target" ] || target="$PRODUCTDIR/$name"
166
    [ -e "$BUILDROOT/usr/bin/$name" ] && return
167
    [ "$name" = "$target" ] && return
168 169

    mkdir -p $BUILDROOT/usr/bin/
170
    cat <<EOF > "$BUILDROOT/usr/bin/$name"
171
#!/bin/sh
172
exec "$target" "\$@"
173
EOF
174 175
    chmod 0755 "$BUILDROOT/usr/bin/$name"
    pack_file "/usr/bin/$name"
176 177
}

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
add_bin_cdexec_command()
{
    local name="$1"
    local target="$2"
    [ -n "$name" ] || name="$PRODUCT"
    [ -n "$target" ] || target="$PRODUCTDIR/$name"
    [ -e "$BUILDROOT/usr/bin/$name" ] && return
    [ "$name" = "$target" ] && return

    mkdir -p $BUILDROOT/usr/bin/
    cat <<EOF > "$BUILDROOT/usr/bin/$name"
#!/bin/sh
cd "$(dirname "$target")" || exit
exec ./"$(basename "$target")" "\$@"
EOF
    chmod 0755 "$BUILDROOT/usr/bin/$name"
    pack_file "/usr/bin/$name"
}

197 198 199
# move files to $PRODUCTDIR
move_to_opt()
{
200 201 202 203
    local sdir rdir i

    if [ -z "$1" ] ; then
        local from
204 205
        from="/usr/share/$PRODUCTCUR"
        [ -d "$BUILDROOT$from" ] || from="/usr/share/$PRODUCT"
206
        [ -d "$BUILDROOT$from" ] || from="/usr/lib/$PRODUCT"
207 208 209 210 211
        sdir="$BUILDROOT$from"
    elif has_space "$1" ; then
        sdir="$BUILDROOT$1"
    else
        sdir=''
212
        for i in "$@" ; do
213 214 215 216
            # workaround for wildcards in from
            sdir="$(echo $BUILDROOT$i)"
            [ -d "$sdir" ] && break
        done
217
    fi
218 219 220

    [ -d "$sdir" ] || return 1 #fatal "Can't find any dir from $from list"

221 222 223 224
    rdir="$(echo "$sdir" | sed -e "s|^$BUILDROOT||")"
    [ -n "$rdir" ] || return 1 #fatal "Can't resolve $from in $BUILDROOT"
    [ -d "$BUILDROOT$rdir" ] || return 1 #fatal "Can't resolve $from in $BUILDROOT"

225 226 227
    [ -d "$BUILDROOT$PRODUCTDIR/" ] && return 1
    mkdir -p "$BUILDROOT$(dirname "$PRODUCTDIR")/"
    mv "$BUILDROOT$rdir" "$BUILDROOT$PRODUCTDIR/"
228 229 230 231 232 233
    subst "s|%dir $rdir|%dir $PRODUCTDIR|" $SPEC
    subst "s|%dir \"$rdir|%dir \"$PRODUCTDIR|" $SPEC
    subst "s|\(%config.*\) $rdir|\1 $PRODUCTDIR|" $SPEC
    subst "s|\(%config.*\) \"$rdir|\1 \"$PRODUCTDIR|" $SPEC
    subst "s|^$rdir|$PRODUCTDIR|" $SPEC
    subst "s|^\"$rdir|\"$PRODUCTDIR|" $SPEC
234 235

    pack_dir "$PRODUCTDIR"
236 237
}

238 239 240 241 242 243 244 245 246 247
# remove absolute path from desktop file
fix_desktop_file()
{
    local from="$1"
    local to="$2"
    [ -n "$from" ] || from="$PRODUCTDIR/$PRODUCT"
    [ -n "$to" ] || to="$(basename "$from")"
    subst "s|$from|$to|" $BUILDROOT/usr/share/applications/*.desktop
}

248 249 250 251 252 253 254 255
fix_chrome_sandbox()
{
    local sandbox="$1"
    # Set SUID for chrome-sandbox if userns_clone is not supported
    # CHECKME: Also userns can be enabled via sysctl-conf-userns package install
    userns_path='/proc/sys/kernel/unprivileged_userns_clone'
    userns_val="$(cat $userns_path 2>/dev/null)"
    [ "$userns_val" = '1' ] && return
256
    [ -n "$sandbox" ] || sandbox="$PRODUCTDIR/chrome-sandbox"
257
    [ -e "$BUILDROOT$sandbox" ] || return 0
258
    chmod -v 4711 "$BUILDROOT$sandbox"
259
}
260

261 262 263 264 265
add_requires()
{
    subst "1iRequires: $*" $SPEC
}

266 267 268 269 270 271 272
install_requires()
{
    if [ "$(epm print info -s)" = "alt" ] ; then
        epm install --skip-installed "$@"
    fi
}

273 274 275 276
filter_from_requires()
{
    local i
    for i in "$@" ; do
277 278
        local ti="$(echo "$i" | sed -e 's|^/|\\\\/|' -e 's|\([^\]\)/|\1\\\\/|g')"
        subst "1i%filter_from_requires /^$ti.*/d" $SPEC
279 280 281
    done
}

282 283 284 285 286 287 288 289
add_findreq_skiplist()
{
    local i
    for i in "$@" ; do
        subst "1i%add_findreq_skiplist $i" $SPEC
    done
}

290 291 292
# ignore embedded libs
drop_embedded_reqs()
{
293
    filter_from_requires "libGLESv2.so()" "libEGL.so()" "libffmpeg.so()"
294
}
295

296 297 298 299 300 301 302 303 304 305 306 307 308 309
# by default check in $PRODUCTDIR
use_system_xdg()
{
    local prod="$1"
    [ -n "$prod" ] || prod="$PRODUCTDIR"
    # replace embedded xdg tools
    for i in $prod/{xdg-mime,xdg-settings} ; do
        [ -s $BUILDROOT$i ] || continue
        rm -v $BUILDROOT$i
        ln -s /usr/bin/$(basename $i) $BUILDROOT$i
    done
}


310
#[ -d "$BUILDROOT" ] || fatal "Run me only via epm repack <package>"
311

312 313 314 315 316 317
[ -n "$PRODUCT" ] || PRODUCT="$(basename $0 .sh)"

[ -n "$PRODUCTCUR" ] || PRODUCTCUR="$PRODUCT"
[ -n "$PRODUCTDIR" ] || PRODUCTDIR="/opt/$PRODUCTCUR"

[ -d "$BUILDROOT$PRODUCTDIR" ] && pack_dir "$PRODUCTDIR"
318

319 320 321 322 323 324 325

# like /opt/yandex/browser
if [ -n "$PRODUCTDIR" ] && [ "$(dirname "$PRODUCTDIR" )" != "/" ] && [ "$(dirname "$(dirname "$PRODUCTDIR" )" )" != "/" ] ; then
   [ -n "$PRODUCTBASEDIR" ] || PRODUCTBASEDIR="$(dirname "$PRODUCTDIR")"
fi

[ -d "$BUILDROOT$PRODUCTBASEDIR" ] && pack_dir "$PRODUCTBASEDIR"
326 327

[ -n "$PREINSTALL_PACKAGES" ] && install_requires $PREINSTALL_PACKAGES