summaryrefslogtreecommitdiff
path: root/src/chroot-tools/libremakepkg
blob: 69e89985ff6a7d8103b680b5e07f84a251c29b71 (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
#!/bin/bash
# libremakepkg
# analogous to devtools' archbuild

# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
# Copyright 2012 Luke Shumaker

# ---------- GNU General Public License 3 ----------

# This file is part of Parabola.

# Parabola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# Parabola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with Parabola. If not, see <http://www.gnu.org/licenses/>.

. /etc/libretools.conf

##
# copy logs if they exist
##
copy_log() {
	find "${chroot_path}/build/" -maxdepth 1 -name "*\.log" -exec cp {} ./ \;
}

##
# End inmediately but print a useful message
##
trap_exit() {
	copy_log
	error "$@"
	exit 1
}

usage() {
    echo 'cd to a dir containing a PKGBUILD and run:'
    echo '$0 [options] [-- makechrootpkg args [-- makepkg args]]'
    echo 'This script will build your package in a chroot.'
    echo ''
    echo 'OPTIONS:'
    echo ' -h              Show this message'
    echo ''
    echo ' -c              Clean the chroot before building'
    echo ' -u              Update the chroot before building'
    echo ' -N              Do not check freedom issues (for fullpkg)'
    echo ''
    echo " -d <chrootdir>  Use this dir instead of \`$CHROOTDIR'"
    echo " -n <chroot>     Use this chroot instead of \`$CHROOT'"
    echo ' -l <copy>       Use this chroot copy instead of basing it'
    echo '                 on the username'
}

main() {
	# The logic for setting CHROOTCOPY is mirred from makechrootpkg
	CHROOTCOPY=$USER
	[[ -n $SUDO_USER ]] && CHROOTCOPY=$SUDO_USER
	[[ -z $CHROOTCOPY || $CHROOTCOPY = root ]] && CHROOTCOPY=copy

	CLEANFIRST=false
	UPDATEFIRST=false
	CHECKNONFREE=true

	makechrootpkg_args=()

	while getopts 'hcuNd:n:l:' arg ; do
		case "${arg}" in
			c) CLEANFIRST=true;;
			u) UPDATEFIRST=true;;
			N) CHECKNONFREE=false;;

			d) CHROOTDIR=$OPTARG;;
			n) CHROOT=$OPTARG;;
			l) CHROOTCOPY=$OPTARG;;

			h) usage; exit 0;;
			*) usage; exit 1;;
		esac
	done
	shift $(($OPTIND - 1))
	# Pass all arguments after -- right to makechrootpkg
	makechrootpkg_args+=("$@")

	if (( EUID )); then
		error "This script must be run as root"
		exit 1
	fi

	if [[ ! -e PKGBUILD ]]; then
		error "This isn't a build directory"
		exit 1
	fi

	# OK, we're starting now ###############################################

	# Trap signals from makepkg
	set -E
	trap 'trap_exit "(libremakepkg): TERM signal caught. Exiting..."' TERM HUP QUIT
	trap 'trap_exit "(libremakepkg): Aborted by user! Exiting..."' INT
	trap 'trap_exit "(libremakepkg): An unknown error has occurred. Exiting..."' ERR

	if $CHECKNONFREE; then
		msg "Checking PKGBUILD for non-free issues"
		if ! pkgbuild-check-nonfree; then
			if [[ $? -eq 15 ]]; then
				# other errors mean fail, not nonfree
				error "PKGBUILD contains non-free issues"
				exit 15
			else
				warning "PKGBUILD couldn't be check aganist non-free issues"
			fi
		fi
	fi

	if $CLEANFIRST; then
		librechroot -c -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
	fi

	if $UPDATEFIRST; then
		librechroot -u -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
	fi

	unset CLEANFIRST UPDATEFIRST librechroot_args

	makechrootpkg "${makechrootpkg_args[@]}" -d -r "$CHROOTDIR/${CHROOT}" -l "$CHROOTCOPY"
	ev=$? # exit value
	copy_log
	exit $ev
}

main "$@"