Project

General

Profile

Download (12.2 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/bin/sh
2
#
3
# build.sh
4
#
5
# Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
6
#
7
# Redistribution and use in source and binary forms, with or without
8
# modification, are permitted provided that the following conditions are met:
9
#
10
# 1. Redistributions of source code must retain the above copyright notice,
11
#    this list of conditions and the following disclaimer.
12
#
13
# 2. Redistributions in binary form must reproduce the above copyright
14
#    notice, this list of conditions and the following disclaimer in
15
#    the documentation and/or other materials provided with the
16
#    distribution.
17
#
18
# 3. All advertising materials mentioning features or use of this software
19
#    must display the following acknowledgment:
20
#    "This product includes software developed by the pfSense Project
21
#    for use in the pfSense® software distribution. (http://www.pfsense.org/).
22
#
23
# 4. The names "pfSense" and "pfSense Project" must not be used to
24
#    endorse or promote products derived from this software without
25
#    prior written permission. For written permission, please contact
26
#    coreteam@pfsense.org.
27
#
28
# 5. Products derived from this software may not be called "pfSense"
29
#    nor may "pfSense" appear in their names without prior written
30
#    permission of the Electric Sheep Fencing, LLC.
31
#
32
# 6. Redistributions of any form whatsoever must retain the following
33
#    acknowledgment:
34
#
35
# "This product includes software developed by the pfSense Project
36
# for use in the pfSense software distribution (http://www.pfsense.org/).
37
#
38
# THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
39
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
42
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49
# OF THE POSSIBILITY OF SUCH DAMAGE.
50
#
51

    
52
###########################################
53
# Product builder configuration file      #
54
# Please don't modify this file, you      #
55
# can put your settings and options       #
56
# in build.conf, which is sourced at the  #
57
# beginning of this file                  #
58
###########################################
59

    
60
# Detect if this file is being sourced by a script from root or from tools
61
local _curdir=$(basename $(dirname ${0}))
62

    
63
if [ "${_curdir}" = "tools" ]; then
64
	export BUILDER_TOOLS=$(realpath ${_curdir})
65
	export BUILDER_ROOT=$(realpath "${_curdir}/..")
66
else
67
	export BUILDER_TOOLS=$(realpath "${_curdir}/tools")
68
	export BUILDER_ROOT=$(realpath "${_curdir}")
69
fi
70

    
71
BUILD_CONF="${BUILDER_ROOT}/build.conf"
72

    
73
# Ensure file exists
74
if [ -f ${BUILD_CONF} ]; then
75
	. ${BUILD_CONF}
76
fi
77

    
78
# Make sure pkg will not be interactive
79
export ASSUME_ALWAYS_YES=true
80

    
81
# Architecture, supported ARCH values are: 
82
#  Tier 1: i386, AMD64, and PC98
83
#  Tier 2: ARM, PowerPC, ia64, Sparc64 and sun4v
84
#  Tier 3: MIPS and S/390
85
#  Tier 4: None at the moment
86
#  Source: http://www.freebsd.org/doc/en/articles/committers-guide/archs.html
87
export TARGET=${TARGET:-"`uname -m`"}
88
export TARGET_ARCH=${TARGET_ARCH:-${TARGET}}
89
# Set TARGET_ARCH_CONF_DIR
90
if [ "$TARGET_ARCH" = "" ]; then
91
        export TARGET_ARCH=`uname -p`
92
fi
93
export BUILDER_HOST_TARGET=`uname -m`
94

    
95
# This is used for using svn for retrieving src
96
export FREEBSD_REPO_BASE=${FREEBSD_REPO_BASE:-"git@git.pfmechanics.com:pfsense/freebsd-src.git"}
97
export FREEBSD_BRANCH=${FREEBSD_BRANCH:-"devel"}
98
export FREEBSD_PARENT_BRANCH=${FREEBSD_PARENT_BRANCH:-"stable/10"}
99

    
100
# Product details
101
export PRODUCT_NAME=${PRODUCT_NAME:-"pfSense"}
102
export PRODUCT_URL=${PRODUCT_VERSION:-"https://www.pfsense.org/"}
103
export PRODUCT_SRC=${PRODUCT_SRC:-"${BUILDER_ROOT}/src"}
104

    
105
if [ -z "${PRODUCT_VERSION}" ]; then
106
	if [ ! -f ${PRODUCT_SRC}/etc/version ]; then
107
		echo ">>> ERROR: PRODUCT_VERSION is not defined and ${PRODUCT_SRC}/etc/version was not found"
108
		print_error_pfS
109
	fi
110

    
111
	export PRODUCT_VERSION=$(head -n 1 ${PRODUCT_SRC}/etc/version)
112
fi
113

    
114
# Product repository tag to build
115
local _cur_git_repo_branch_or_tag=$(git -C ${BUILDER_ROOT} rev-parse --abbrev-ref HEAD)
116
if [ "${_cur_git_repo_branch_or_tag}" = "HEAD" ]; then
117
	# We are on a tag, lets find out its name
118
	export GIT_REPO_BRANCH_OR_TAG=$(git -C ${BUILDER_ROOT} describe --tags)
119
else
120
	export GIT_REPO_BRANCH_OR_TAG="${_cur_git_repo_branch_or_tag}"
121
fi
122

    
123
# Directory to be used for writing temporary information
124
export SCRATCHDIR=${SCRATCHDIR:-"${BUILDER_ROOT}/tmp"}
125
if [ ! -d ${SCRATCHDIR} ]; then
126
	mkdir -p ${SCRATCHDIR}
127
fi
128

    
129
# Area that the final image will appear in
130
export IMAGES_FINAL_DIR=${IMAGES_FINAL_DIR:-"${SCRATCHDIR}/${PRODUCT_NAME}/"}
131

    
132
export BUILDER_LOGS=${BUILDER_LOGS:-"${BUILDER_ROOT}/logs"}
133
if [ ! -d ${BUILDER_LOGS} ]; then
134
	mkdir -p ${BUILDER_LOGS}
135
fi
136

    
137
# Poudriere
138
export ZFS_TANK=${ZFS_TANK:-"tank"}
139
export ZFS_ROOT=${ZFS_ROOT:-"/poudriere"}
140
export POUDRIERE_PORTS_NAME=${POUDRIERE_PORTS_NAME:-"${PRODUCT_NAME}_${GIT_REPO_BRANCH_OR_TAG}"}
141

    
142
export POUDRIERE_BULK=${POUDRIERE_BULK:-"${BUILDER_TOOLS}/conf/pfPorts/poudriere_bulk"}
143
export POUDRIERE_PORTS_GIT_URL=${POUDRIERE_PORTS_GIT_URL:-"git@git.pfmechanics.com:pfsense/freebsd-ports.git"}
144
export POUDRIERE_PORTS_GIT_BRANCH=${POUDRIERE_PORTS_GIT_BRANCH:-"devel"}
145

    
146
# This is where files will be staged
147
export STAGE_CHROOT_DIR=${STAGE_CHROOT_DIR:-"/usr/local/stage-dir"}
148

    
149
export SRCDIR=${SRCDIR:-"/usr/${PRODUCT_NAME}src/src.${GIT_REPO_BRANCH_OR_TAG}"}
150

    
151
# 400M is not enough for amd64
152
export MEMORYDISK_SIZE=${MEMORYDISK_SIZE:-"768M"}
153

    
154
# OVF/vmdk parms
155
export OVFPATH=${OVFPATH:-"${IMAGES_FINAL_DIR}"}
156
# Name of ovf file included inside OVA archive
157
export OVFFILE=${OVFFILE:-"${PRODUCT_NAME}.ovf"}
158
# On disk name of VMDK file included in OVA
159
export OVFVMDK=${OVFVMDK:-"${PRODUCT_NAME}.vmdk"}
160
# optional
161
export OVFCERT=${OVFCERT:-""}
162
# 10 gigabyte on disk VMDK size
163
export OVADISKSIZE=${OVADISKSIZE:-"10737418240"}
164
# dd buffering size when creating raw backed VMDK
165
export OVABLOCKSIZE=${OVABLOCKSIZE:-"409600"}
166
# first partition size (freebsd-ufs) GPT
167
export OVA_FIRST_PART_SIZE=${OVA_FIRST_PART_SIZE:-"8G"}
168
# swap partition size (freebsd-swap) GPT -
169
# remaining space of 10G-8G - 128 block beginning/loader
170
export OVA_SWAP_PART_SIZE=${OVA_SWAP_PART_SIZE:-"4193725"}
171
# 10737254400 = 10240MB = virtual box vmdk file size XXX grab this value from vbox creation
172
export OVA_DISKSECTIONALLOCATIONUNITS=${OVA_DISKSECTIONALLOCATIONUNITS:-"10737254400"}
173
# end of OVF
174

    
175
# Leave this alone.
176
export SRC_CONF=${SRC_CONF:-"${SRCDIR}/release/conf/${PRODUCT_NAME}_src.conf"}
177
export MAKE_CONF=${MAKE_CONF:-"${SRCDIR}/release/conf/${PRODUCT_NAME}_make.conf"}
178

    
179
# Extra tools to be added to ITOOLS
180
export EXTRA_TOOLS=${EXTRA_TOOLS:-"uuencode uudecode ex"}
181

    
182
# Path to kernel files being built
183
export KERNEL_BUILD_PATH=${KERNEL_BUILD_PATH:-"${SCRATCHDIR}/kernels"}
184

    
185
# Controls how many concurrent make processes are run for each stage
186
if [ "${NO_MAKEJ}" = "" ]; then
187
	CPUS=`sysctl -n kern.smp.cpus`
188
	CPUS=`expr $CPUS '*' 2`
189
	export MAKEJ_WORLD=${MAKEJ_WORLD:-"-j$CPUS"}
190
	export MAKEJ_KERNEL=${MAKEJ_KERNEL:-"-j$CPUS"}
191
else
192
	export MAKEJ_WORLD=${MAKEJ_WORLD:-""}
193
	export MAKEJ_KERNEL=${MAKEJ_KERNEL:-""}
194
fi
195
if [ "${TARGET}" = "i386" ]; then
196
	export MODULES_OVERRIDE=${MODULES_OVERRIDE:-"i2c ipmi ndis ipfw ipdivert dummynet fdescfs opensolaris zfs glxsb if_stf coretemp amdtemp hwpmc"}
197
else
198
	export MODULES_OVERRIDE=${MODULES_OVERRIDE:-"i2c ipmi ndis ipfw ipdivert dummynet fdescfs opensolaris zfs glxsb if_stf coretemp amdtemp aesni sfxge hwpmc"}
199
fi
200

    
201
# Number of code images on media (1 or 2)
202
export NANO_IMAGES=2
203
# 0 -> Leave second image all zeroes so it compresses better.
204
# 1 -> Initialize second image with a copy of the first
205
export NANO_INIT_IMG2=1
206
export NANO_WITH_VGA=${NANO_WITH_VGA:-""}
207
export NANO_NEWFS="-b 4096 -f 512 -i 8192 -O1"
208
export FLASH_SIZE=${FLASH_SIZE:-"1g"}
209
# Size of code file system in 512 bytes sectors
210
# If zero, size will be as large as possible.
211
export NANO_CODESIZE=0
212
# Size of data file system in 512 bytes sectors
213
# If zero: no partition configured.
214
# If negative: max size possible
215
export NANO_DATASIZE=0
216
# Size of Product /conf partition  # 102400 = 50 megabytes.
217
export NANO_CONFSIZE=102400
218
# packet is OK for 90% of embedded
219
export NANO_BOOT0CFG="-o packet -s 1 -m 3"
220

    
221
# " - UNBREAK TEXTMATE FORMATTING - PLEASE LEAVE.
222

    
223
# Host to rsync pkg repos from poudriere
224
export PKG_RSYNC_HOSTNAME=${PKG_RSYNC_HOSTNAME:-"beta.pfsense.org"}
225
export PKG_RSYNC_USERNAME=${PKG_RSYNC_USERNAME:-"wwwsync"}
226
export PKG_RSYNC_SSH_PORT=${PKG_RSYNC_SSH_PORT:-"22"}
227
export PKG_RSYNC_DESTDIR=${PKG_RSYNC_DESTDIR:-"/usr/local/www/beta/packages"}
228
export PKG_REPO_SERVER=${PKG_REPO_SERVER:-"pkg+http://beta.pfsense.org/packages"}
229
export PKG_REPO_CONF_BRANCH=${PKG_REPO_CONF_BRANCH:-"${GIT_REPO_BRANCH_OR_TAG}"}
230

    
231
# Package overlay. This gives people a chance to build product
232
# installable image that already contains certain extra packages.
233
#
234
# Needs to contain comma separated package names. Of course
235
# package names must be valid. Using non existent
236
# package name would yield an error.
237
#
238
#export custom_package_list=""
239

    
240
# Directory that will clone to in order to create
241
# iso staging area.
242
export FINAL_CHROOT_DIR=${FINAL_CHROOT_DIR:-"/usr/local/final-dir"}
243

    
244
# NOTE: Date string is used for creating file names of images
245
#       The file is used for sharing the same value with build_snapshots.sh
246
local _BUILDER_EPOCH=$(date +"%s")
247
export DATESTRINGFILE=${DATESTRINGFILE:-"$SCRATCHDIR/version.snapshots"}
248
if [ "${DATESTRING}" = "" ]; then
249
	if [ -f $DATESTRINGFILE ]; then
250
		# If the file is more than 30 minutes old regenerate it
251
		TMPDATESTRINGFILE=$(($_BUILDER_EPOCH - `stat -f %m $DATESTRINGFILE`))
252
		if [ -z "${_USE_OLD_DATESTRING}" -a $TMPDATESTRINGFILE -gt 1800 ]; then
253
			export DATESTRING=`date "+%Y%m%d-%H%M"`
254
		else
255
			export DATESTRING=`cat $DATESTRINGFILE`
256
		fi
257
		unset TMPDATESTRINGFILE
258
	else
259
		export DATESTRING=`date "+%Y%m%d-%H%M"`
260
	fi
261
	echo "$DATESTRING" > $DATESTRINGFILE
262
fi
263

    
264
# NOTE: Date string is placed on the final image etc folder to help detect new updates
265
#       The file is used for sharing the same value with build_snapshots.sh
266
export BUILTDATESTRINGFILE=${BUILTDATESTRINGFILE:-"$SCRATCHDIR/version.buildtime"}
267
if [ "${BUILTDATESTRING}" = "" ]; then
268
	if [ -f $BUILTDATESTRINGFILE ]; then
269
		# If the file is more than 30 minutes old regenerate it
270
		TMPBUILTDATESTRINGFILE=$(($_BUILDER_EPOCH - `stat -f %m $BUILTDATESTRINGFILE`))
271
		if [ $TMPBUILTDATESTRINGFILE -gt 1800 ]; then
272
			export BUILTDATESTRING=`date "+%a %b %d %T %Z %Y"`
273
		else
274
			export BUILTDATESTRING=`cat $BUILTDATESTRINGFILE`
275
		fi
276
		unset TMPBUILTDATESTRINGFILE
277
	else
278
		export BUILTDATESTRING=`date "+%a %b %d %T %Z %Y"`
279
	fi
280
	echo "$BUILTDATESTRING" > $BUILTDATESTRINGFILE
281
fi
282

    
283
# Define base package version, based on date for snaps
284
CORE_PKG_VERSION=${PRODUCT_VERSION%%-*}
285
if echo "${PRODUCT_VERSION}" | grep -qv -- '-RELEASE'; then
286
	CORE_PKG_VERSION="${CORE_PKG_VERSION}.${DATESTRING}"
287
fi
288
export CORE_PKG_PATH=${CORE_PKG_PATH:-"${SCRATCHDIR}/core_pkg"}
289
export CORE_PKG_TMP=${CORE_PKG_TMP:-"${SCRATCHDIR}/core_pkg_tmp"}
290

    
291
# General builder output filenames
292
export UPDATESDIR=${UPDATESDIR:-"${IMAGES_FINAL_DIR}/updates"}
293
export ISOPATH=${ISOPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-LiveCD-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.iso"}
294
export MEMSTICKPATH=${MEMSTICKPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"}
295
export MEMSTICKSERIALPATH=${MEMSTICKSERIALPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-serial-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"}
296
export MEMSTICKADIPATH=${MEMSTICKADIPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-ADI-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"}
297

    
298
# set full-update update filename
299
export UPDATES_TARBALL_FILENAME=${UPDATES_TARBALL_FILENAME:-"${UPDATESDIR}/${PRODUCT_NAME}-Full-Update-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.tgz"}
300

    
301
# " - UNBREAK TEXTMATE FORMATTING - PLEASE LEAVE.
302

    
303
if [ "${TARGET}" = "i386" ]; then
304
	export BUILD_KERNELS=${BUILD_KERNELS:-"${PRODUCT_NAME} ${PRODUCT_NAME}_WRAP ${PRODUCT_NAME}_WRAP_VGA"}
305
else
306
	export BUILD_KERNELS=${BUILD_KERNELS:-"${PRODUCT_NAME}"}
307
fi
(3-3/3)