common 5.44 KB
Newer Older
1
#!/bin/bash
2
# 2003-2009 Etersoft www.etersoft.ru
3 4 5
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain

6 7
# $1 - needed VERSION of etersoft-build-utils. f.i. 162

Vitaly Lipatov's avatar
Vitaly Lipatov committed
8 9
set_eterbuilddir()
{
10 11
	[ -z "$ETERBUILDDIR" ] || return 0

12
	if dirname $0 | grep "^/usr" >/dev/null ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
13 14 15
		ETERBUILDETC=/etc/eterbuild
		ETERBUILDDIR=/usr/share/eterbuild
	else
16
		# if run from no system installation
17
		# TODO: use real root dir not script dirname
Vitaly Lipatov's avatar
Vitaly Lipatov committed
18 19
		ETERBUILDDIR=$(realpath `dirname $0`/../share/eterbuild)
		ETERBUILDETC=$(realpath `dirname $0`/../etc)
20 21 22 23
		if [ -r "$ETERBUILDETC/../AUTHORS" ] ; then
			if [ -n "$VERBOSE" ] ; then
				echo "Note: run from source tree, datadir=$ETERBUILDDIR, sysconfdir=$ETERBUILDETC"
			fi
24
		else
25
			warning "Cannot find source tree root in source tree mode"
26 27 28
			ETERBUILDETC=/etc/eterbuild
			ETERBUILDDIR=/usr/share/eterbuild
		fi
Vitaly Lipatov's avatar
Vitaly Lipatov committed
29
	fi
30
	ETERBUILDBIN=$(realpath $ETERBUILDDIR/../../bin)
31
	test -n "$ETERBUILDDIR" && PATH=$ETERBUILDDIR/functions/commands:$PATH
32
	# returns test result
Vitaly Lipatov's avatar
Vitaly Lipatov committed
33
}
34

Vitaly Lipatov's avatar
Vitaly Lipatov committed
35
# set if empty and check it
36
if ! set_eterbuilddir ; then
37
	echo "Can't detect package files location" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
38
	exit 1
39 40
fi

41
# Выводит указанное сообщение об ошибке и завершает программу
42 43
fatal()
{
44 45 46 47 48
	if [ -z "$TEXTDOMAIN" ] ; then
		echo "Error: $@" >&2
	else
		echog "Error: $@" >&2
	fi
49 50 51
	exit 1
}

52
# Выводит указанное сообщение
53 54
warning()
{
55 56 57 58 59
	if [ -z "$TEXTDOMAIN" ] ; then
		echo "Warning: $@" >&2
	else
		echog "Warning: $@" >&2
	fi
60 61 62 63 64 65 66 67 68 69
}

print_list()
{
	local i
	for i in $@ ; do
		echo "    $i"
	done
}

70 71 72 73 74 75
get_root_git_dir()
{
        local DIR="$1"
        [ -n "$DIR" ] || DIR=$(pwd)
        [ "$DIR" = "/" ] && return 1
        if [ -d "$DIR/.git" ] ; then
76
                readlink -f "$DIR" 2>/dev/null || realpath "$DIR"
77 78 79 80 81 82
                return
        fi
        get_root_git_dir $(dirname "$DIR") || return 1
}

# Usage: is_gear [path_to_spec|dir_inside_git]
83 84
is_gear()
{
85
	local DIR="$1"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
86
	[ -z "$IGNOREGEAR" ] || return 1
87
	[ -f "$DIR" ] && DIR=$(dirname "$DIR")
88 89 90
	local GITDIR=$(get_root_git_dir "$DIR")
	[ -d "$GITDIR/.gear" ] && return 0
	[ -r "$GITDIR/.gear-rules" ] && return 0
91 92 93
	return 1
}

94
if [ "$UID" = "0" ] && [ -z "$ALLOW_ROOT_USER" ] ; then
95 96 97
	fatal "It is strict recommended do not use these scripts as root"
fi

98 99 100 101 102 103 104 105
load_mod()
{
	local i
	for i in $@ ; do
		. $ETERBUILDDIR/functions/$i
	done
}

106
load_mod config gettext alt spec strings
107

108

Vitaly Lipatov's avatar
Vitaly Lipatov committed
109
# check for needed version
110
if [ -n "$NEEDETERBUILD" ] ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
111
	if [ "$NEEDETERBUILD" -gt "$ETERBUILDVERSION" ] ; then
112
		echo "Obsoleted version of etersoft-build-utils version is used. Please upgrade it to $NEEDETERBUILD version."
Vitaly Lipatov's avatar
Vitaly Lipatov committed
113 114 115 116
		exit 1
	fi
fi

117 118 119 120 121 122 123
# Internal
detect_target_env()
{
local DISTRNAME=`distr_vendor -e`
MENVARG=""
TARGET=`distr_vendor -p`
VENDOR=`distr_vendor -s`
124
RPMVENDOR=`distr_vendor -n`
125 126

if [ "$VENDOR" = "alt" ] && [ -n "$MENV" ] ; then
127
	[ -n "$APTCONF" ] || APTCONF=${APTCONFBASE/.SS}.$MENV
128
	
129
	[ -n "$VERBOSE" ] && echog "Target ALT Linux system: `get_altdistr_version $MENV`, use \$APTCONF"
130 131
	MENVARG="-$MENV"
else
Vitaly Lipatov's avatar
Vitaly Lipatov committed
132
	# FIXME: echog breakes vars
Vitaly Lipatov's avatar
Vitaly Lipatov committed
133
	echog "Distribution: \$DISTRNAME (\$VENDOR) (target package: \$TARGET)"
134 135 136
fi
}

137
# Отделяет файлы в LISTNAMES (с полными путями)
138 139 140 141 142 143
# Отделяет указание среды в MENV
# Устанавливает LISTARGS в оставшиеся аргументы
# использование:
# - отделяем среду (MENV)
# - отделяем файлы
# - оставшееся обрабатываем как параметры программы
144 145 146 147 148 149 150 151
parse_cmd_pre()
{
local i
if [ $# -lt 1 ]; then
    [ -n "$Usage" ] && echog "$Usage"
	fatal "Use -h for help."
fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
152 153
[ "$1" = "--help" ] && mygetopts -h

154
# Build for Sisyphus by default
155
MENV=SS
156 157 158 159
if is_gear ; then
	# Set target according to current branch
	set_target_type $(get_type_by_current_branch)
fi
160

161 162
LISTNAMES=
LISTARGS=
163 164 165
OPTINDEX=1
for i in "$@"
do
166
	# Если файл существует, то добавляем, иначе считаем аргумент параметром.
167
	if [ -f "$i" ]; then
168
		# echo is workaround for missed readlink
169
		LISTNAMES="$LISTNAMES $(readlink -f "$i" 2>/dev/null || realpath "$i" || echo "$i")"
170
	else
171
		# set target type if -M?? in param
172 173 174
		set_target_type ${i/-/} || LISTARGS="$LISTARGS $i"
	fi
done
175 176
LISTNAMES=$(strip_spaces "$LISTNAMES")
LISTARGS=$(strip_spaces "$LISTARGS")
177 178 179 180 181
# parse MENV
detect_target_env
[ -n "$VERBOSE" ] && echo "LISTNAMES=$LISTNAMES LISTARGS=$LISTARGS" || :
}

182 183
parse_cmd_pre_spec()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
184 185
	[ "$1" = "--help" ] && mygetopts -h

186 187
	# hack for check spec or src.rpm presence in command line: skip spec detecting
	if echo $@ | grep -q \.spec || echo $@ | grep -q \.src.rpm ; then
188 189 190 191
		parse_cmd_pre "$@"
        else
		local SPEC=$(get_gear_spec)
		[ -f "$SPEC" ] && echo "Using autodetected spec $SPEC..."
192
		parse_cmd_pre $SPEC "$@"
193 194 195
	fi
}

196 197 198 199 200 201 202
check_key()
{
	echog "Check access to SSH private key..."
	ssh-add -l || ssh-add $SSH_KEYFILE || return 1
	return 0
}

203 204 205 206 207 208 209 210 211
make_temp_file()
{
	# Workaround about broken mktemp
	if mktemp -V >/dev/null 2>/dev/null ; then
		mktemp || exit 1
	else
		mktemp /tmp/$1.XXXXXX || exit 1
	fi
}
212

213
# check if path is server:/path
Vitaly Lipatov's avatar
Vitaly Lipatov committed
214 215 216 217
is_ssh_target()
{
	echo "$1" | grep -q ":"
}
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234

enable_ccache()
{
	which ccache >/dev/null || fatal "Install ccache package before using"

	# handled in gcc-common
	export GCC_USE_CCACHE=1
	# step to gcc-common
	export CC=gcc CXX=g++

	#export CC="ccache gcc"
	#export CPP="ccache gcc -E"
	#export CXX="ccache g++"
	#export CXXCPP="ccache g++ -E"

}

235 236 237 238 239 240

# If DISPLAY is broken
check_display()
{
	xset -b
}