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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
|
#!/bin/bash
# Copyright 2005 The Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2
# $Header: /var/cvsroot/gentoo-x86/scripts/bootstrap-darwin.sh,v 1.1 2005/02/12 01:50:04 kito Exp $
# Make sure sudo passwd is asked for
sudo true
trap 'exit 1' TERM KILL INT QUIT ABRT
# we only run on Darwin
if [ `uname` == "Darwin" ]; then
:
else
echo `uname`
echo "You need to be running a mach kernel to proceed."
exit 1
fi
## some vars
# We do not want stray $TMP, $TMPDIR or $TEMP settings
unset TMP TMPDIR TEMP
ARCH=ppc
CFLAGS="-O2 -pipe"
CHOST="powerpc-apple-darwin"
ROOT=""
PORTDIR=${ROOT}/usr/portage
DISTDIR=${PORTDIR}/distfiles
PORTAGE_TMPDIR=${ROOT}/var/tmp
PORTAGEURL="http://gentoo.twobit.net/portage"
PORTAGEVERSION=2.0.51.16
PYTHONVERSION=2.3.4
DMGURL="http://www.metadistribution.org/gentoo/macos"
DMGVERSION=20041118
BOOTSTRAPSCRIPT="`pwd`/${0##*/}"
echo ${BOOTSTRAPSCRIPT}
if [ -z "${CHOST}" ] ; then
echo "Please set CHOST"
exit 1
fi
if [ -z "${CFLAGS}" ] ; then
echo "Please set CFLAGS"
exit 1
fi
if [ -z "${ARCH}" ] ; then
echo "Please set ARCH"
exit 1
fi
export CXXFLAGS="${CXXFLAGS:-${CFLAGS}}"
export MAKEOPTS="${MAKEOPTS:--j2}"
# Source functions to have colors and nice output
if [ -e /etc/init.d/functions.sh ] ; then
source /etc/init.d/functions.sh
# Use our own custom script, else logger cause things to
# 'freeze' if we do not have a system logger running
esyslog() {
echo &> /dev/null
}
else
eerror() { echo "!!! $*"; }
einfo() { echo "* $*"; }
fi
## Functions Start Here
bootstrap_od() {
## TODO
echo "Not implemented yet."
exit 1
}
bootstrap_portage() {
TARGET=$1
if [ ! -x ${ROOT}/usr/bin/emerge ] ; then
PV=${PORTAGEVERSION}
A=portage-${PV}.tar.bz2
if [ ! -e ${DISTDIR}/${A} ] ; then
cd ${DISTDIR} && sudo curl -O ${PORTAGEURL}/${A}
fi
export S="${PORTAGE_TMPDIR}/portage-${PV}"
rm -rf ${S}
mkdir -p ${S}
cd ${S}
tar -jxvf ${DISTDIR}/${A}
S=${S}/portage-${PV}
cd ${S}
cd ${S}/src ; gcc ${CFLAGS} tbz2tool.c -o tbz2tool
cd ${S}/cnf
[ -d ${TARGET}/etc ] || sudo mkdir -p ${TARGET}/etc
cp make.globals.mac ${TARGET}/etc/make.globals
cp make.conf ${TARGET}/etc/make.conf
cp etc-update.conf dispatch-conf.conf ${TARGET}/etc/
mkdir -p ${TARGET}/usr/lib/portage/pym
cd ${S}/pym
cp *.py ${TARGET}/usr/lib/portage/pym/
mkdir -p ${TARGET}/usr/lib/portage/bin
cd ${S}/bin
cp * ${S}/src/tbz2tool ${TARGET}/usr/lib/portage/bin/
[ -d ${TARGET}/usr/bin ] || sudo mkdir ${TARGET}/usr/bin
[ -d ${TARGET}/usr/sbin ] || sudo mkdir ${TARGET}/usr/sbin
[ -d ${TARGET}/var/lib/portage ] || sudo mkdir ${TARGET}/var/lib/portage
cd ${TARGET}/usr/bin
ln -sf ../lib/portage/bin/emerge ${TARGET}/usr/bin/emerge
ln -sf ../lib/portage/bin/pkgmerge $TARGET/usr/sbin/pkgmerge
ln -sf ../lib/portage/bin/ebuild ${TARGET}/usr/sbin/ebuild
ln -sf ../lib/portage/bin/ebuild.sh ${TARGET}/usr/sbin/ebuild.sh
ln -sf ../lib/portage/bin/etc-update ${TARGET}/usr/sbin/etc-update
ln -sf ../lib/portage/bin/dispatch-conf ${TARGET}/usr/sbin/dispatch-conf
ln -sf ../lib/portage/bin/archive-conf ${TARGET}/usr/sbin/archive-conf
ln -sf ../lib/portage/bin/fixpackages ${TARGET}/usr/sbin/fixpackages
ln -sf ../lib/portage/bin/env-update ${TARGET}/usr/sbin/env-update
ln -sf ../lib/portage/bin/xpak ${TARGET}/usr/bin/xpak
ln -sf ../lib/portage/bin/repoman ${TARGET}/usr/bin/repoman
ln -sf ../lib/portage/bin/tbz2tool ${TARGET}/usr/bin/tbz2tool
ln -sf ../lib/portage/bin/portageq ${TARGET}/usr/bin/portageq
ln -sf ../lib/portage/bin/g-cpan.pl ${TARGET}/usr/bin/g-cpan.pl
ln -sf ../lib/portage/bin/quickpkg ${TARGET}/usr/bin/quickpkg
ln -sf ../lib/portage/bin/regenworld ${TARGET}/usr/sbin/regenworld
ln -sf ../lib/portage/bin/emerge-webrsync ${TARGET}/usr/sbin/emerge-webrsync
ln -sf ../lib/portage/bin/newins ../lib/portage/bin/donewins
echo
echo -e "Portage succesfully bootstrapped"
echo
else
echo
echo -e "`type -p emerge`"
echo
fi
}
bootstrap_progressive() {
#This bootstraps a 'progressive' Gentoo for Mac OS X system.
## TODO prompt to grab stage{1,2,3} from mirrors or install Xcode from CD/DVD/pkg
gcc -v 2> /dev/null || missing_devtools
bootstrap_python
bootstrap_portage
setup_users
[ -f ${ROOT}/etc/make.profile ] && sudo rm -rf ${ROOT}/etc/make.profile
[ -f ${ROOT}/${PORTDIR}/profiles ] || sudo mkdir -p ${ROOT}/${PORTDIR}/profiles
sudo ln -sf ${ROOT}/${PORTDIR}/profiles/default-darwin/macos/progressive ${ROOT}/etc/make.profile || echo -n "Failed to properly link to ${PORTDIR}/profiles/${profile}"
echo
echo -n "Would you like to emerge sync now (y/n)? "
read answer
if [ $answer == "y" ]; then
echo
echo -e "Grabbing current Portage tree...."
echo
sudo emerge sync && echo "emerge sync complete." || echo "!!! emerge sync failed"
else
echo
echo "Gentoo bootstrap finished. Please run emerge sync then emerge system."
echo
fi
echo -n "We need to install the base system. Run emerge system now (y/n) ? "
read answer
if [ $answer == "y" ]; then
echo
sudo emerge -v system || echo "!!! emerge system failed"
else
echo
echo "Before installing any packages, you must run emerge system."
exit 1
fi
echo
echo -n "OK! Your Gentoo for Mac OS X system is complete."
echo
exit 1
# TODO add links to docs
}
bootstrap_python() {
TARGET=$1
PV=${PYTHONVERSION}
A=Python-${PV}.tar.bz2
[ ! -d ${DISTDIR} ] && sudo mkdir -p {DISTDIR}
if [ ! -e ${DISTDIR}/${A} ] ; then
echo "Fetching Python..."
cd ${DISTDIR} && sudo curl -O http://www.python.org/ftp/python/${PV%_*}/${A}
fi
export S="${PORTAGE_TMPDIR}/python-${PV}"
export PYTHON_DISABLE_MODULES="readline pyexpat dbm gdbm bsddb _curses _curses_panel _tkinter"
export PYTHON_DISABLE_SSL=1
export OPT="${CFLAGS}"
rm -rf ${S}
mkdir -p ${S}
cd ${S}
echo "Unpacking Python..."
sudo tar -jxf ${DISTDIR}/${A} || exit 1
S=${S}/Python-${PV}
echo "Configuring Python..."
cd ${S}
./configure \
--enable-unicode=ucs4 \
--prefix=${TARGET}/usr \
--host=${CHOST} \
--mandir=${TARGET}/usr/share/man \
--infodir=${TARGET}/usr/share/info \
--datadir=${TARGET}/usr/share \
--sysconfdir=${TARGET}/etc \
--localstatedir=${TARGET}/var/lib \
--with-fpectl \
--enable-shared \
--disable-ipv6 \
--infodir='${prefix}'/share/info \
--mandir='${prefix}'/share/man \
--with-threads \
--with-cxx=no \
|| exit 1
sudo make ${MAKEOPTS} || exit 1
sudo make altinstall || exit 1
cd ${TARGET}/usr/bin
sudo ln -sf python2.3 python
echo
echo -e "Python succesfully bootstrapped"
}
bootstrap_standard() {
#This mounts the current .dmg installer if portage is not found, and links to the appropriate FEATURES="collision-protect" profile
# TODO make / ${ROOT}
gcc -v 2> /dev/null || missing_devtools
if [ ! -x /usr/bin/emerge ] ; then
A=gentoo-macos-${DMGVERSION}.dmg
echo
echo "Mounting Gentoo for Mac OS X Disk Image at ${DMGURL}/${A}"
echo
sudo hdid ${DMGURL}/${A} || echo "Could not mount remote image"
# TODO check md5 sum/timeout
export CM_BUILD=CM_BUILD
sudo installer -verbose -pkg /Volumes/gentoo-macos/Gentoo\ for\ Mac\ OS\ X\ Installer.pkg -target / || exit 1
sudo hdiutil unmount /Volumes/gentoo-macos/
echo
echo -e "Portage sucessfully installed"
echo
else
echo "Portage seems to be installed. Setting up profile..."
fi
check_release_version
sudo rm -rf /etc/make.profile
sudo mkdir -p ${PORTDIR}/profiles
sudo ln -sf ${PORTDIR}/profiles/${profile} /etc/make.profile || echo -n "Failed to properly link to ${PORTDIR}/profiles/${profile}"
if [ ! -f /usr/portage/metadata/timestamp ]; then
echo -e "Grabbing current Portage tree...."
echo
sudo emerge sync && echo "emerge sync complete." || echo "emerge sync failed. Please run this command manually" && exit 1
fi
sudo emerge -ev system && echo "emerge system complete." || echo "There were errors running emerge system. Please run this command manually" && exit 1
echo -n "OK! Your Gentoo for Mac OS X system is complete."
echo
exit 1
# TODO add links to docs
}
check_release_version() {
if [ -x `which sw_vers` ]; then
NAME="Mac OS X"
RV_MAJOR="`sw_vers | grep ProductVersion | sed s:'ProductVersion\:::' | awk '{print $1}' | cut -d. -f 1`"
RV_MINOR="`sw_vers | grep ProductVersion | cut -d. -f 2`"
RV_PATCH="`sw_vers | grep ProductVersion | cut -d. -f 3`"
RV="${RV_MAJOR}.${RV_MINOR}"
if [ ${RV_MINOR} -lt 3 ]; then
echo "Sorry, you need at least Mac OS X 10.3 Panther."
exit 1
fi
echo
echo -e "It appears you are running Mac OS X ${RV_MAJOR}.${RV_MINOR}"
echo
profile="default-darwin/macos/${RV}"
return
else
echo
echo -e "It appears you are not running Mac OS X...Assuming its Darwin..."
echo
bootstrap_od
exit 1
fi
}
create_dmg() {
export CM_BUILD=CM_BUILD
TARGET=${ROOT}/mnt/gentoo
BUILDDIR=${PORTAGE_TMPDIR}/portage/build
if [ -d ${BUILDIR} ]; then
sudo rm -rf ${BUILDDIR}
fi
sudo mkdir -p ${BUILDDIR}/dmg ${TARGET}
sudo hdiutil create -type UDIF -size 4.2g -fs HFS+J -volname gentoo -uid 0 -gid 0 ${BUILDDIR}/dmg/gentoo-osx.dmg
sudo hdiutil attach ${BUILDDIR}/dmg/gentoo-osx.dmg -mountpoint ${TARGET} -nobrowse -owners on
sudo installer -verbose -pkg ~/Desktop/BaseSystem.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/Essentials.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/BSD.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/DeveloperTools.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/DevSDK.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/BSDSDK.pkg -target ${TARGET}
sudo installer -verbose -pkg ~/Desktop/gcc3.3.pkg -target ${TARGET}
# TODO check for incremental updates
if [ -d ~/Desktop/MacOSXUpdateCombo10.3.8.pkg ];then
sudo installer -verbose -pkg ~/Desktop/MacOSXUpdateCombo10.3.8.pkg -target ${TARGET}
else
echo
echo -e "Mac OS X 10.3.8 Update not found...oh well, vanilla 10.3 it is."
echo
fi
echo
echo -e "Completed Installing Base System."
echo
[ ! -f ${TARGET}/var/log/CDIS.custom ] && sudo mkdir -p /var/log
sudo echo 'LANGUAGE=English' > ${TARGET}/var/log/CDIS.custom
echo
echo "Updating mkext cache"
sudo kextcache -K ${TARGET}/mach_kernel -a ${ARCH} -m ${TARGET}/System/Library/Extensions.mkext ${TARGET}/System/Library/Extensions 2>/dev/null
sudo cp ${BOOTSTRAPSCRIPT} ${TARGET}/sbin && sudo chmod a+x ${TARGET}/sbin/"${0##*/}"
## HACK we cant mount images in the chroot properly, so we copy the standard install pkg to the target before we chroot
echo -n "Would you like this to be a standard install(no apple files will be modified) (y/n)? "
read answer
if [ $answer == "y" ]; then
A=gentoo-macos-${DMGVERSION}.dmg
echo
echo "Mounting Gentoo for Mac OS X Disk Image at ${DMGURL}/${A}"
echo
sudo hdid ${DMGURL}/${A} || echo "Could not mount remote image"
# TODO check md5 sum/timeout
export CM_BUILD=CM_BUILD
sudo installer -verbose -pkg /Volumes/gentoo-macos/Gentoo\ for\ Mac\ OS\ X\ Installer.pkg -target ${TARGET} || exit 1
sudo hdiutil unmount /Volumes/gentoo-macos/
echo -e "Portage installed on ${TARGET}"
else
echo -e "Ok, this will be a progressive chroot"
fi
echo -n "Would you like to chroot and complete the bootstrap process now (y/n)? "
read answer
if [ $answer == "y" ]; then
echo
if [ ! -c "${TARGET}/dev/null" ]; then
echo "Mounting devfs..."
sudo mkdir -p "${TARGET}/dev"
sudo mount -t devfs stdin "${TARGET}/dev"
sudo mount -t fdesc -o union stdin "${TARGET}/dev"
else
echo "devfs appears to exist..."
fi
echo "Mounting volfs..."
[ -d "${TARGET}/sbin" ] || sudo mkdir -p "${TARGET}/sbin"
[ -f "${TARGET}/sbin/mount_volfs" ] || sudo cp /sbin/mount_volfs ${TARGET}/sbin/
[ -d "${TARGET}/.vol" ] || sudo mkdir -p "${TARGET}/.vol"
## If the directory is empty, assume volfs is not mounted
[ "$(echo ${TARGET}/.vol/*)" == "${TARGET}/.vol/*" ] && sudo /sbin/mount_volfs "${TARGET}/.vol"
sudo chroot ${TARGET} /bin/bash
echo
echo -e "Buh bye."
echo
# we do once for devfs and once for fdesc
sudo umount ${TARGET}/dev && sudo umount ${TARGET}/dev
sudo umount ${TARGET}/.vol
fi
sudo hdiutil unmount ${TARGET}
sudo mv ${BUILDDIR}/dmg/gentoo-osx.dmg ~/Desktop
echo
echo -e "Completed creating ~/Desktop/gentoo-osx.dmg"
echo -e "To finish bootstrap, mount your new disk image, mount devfs, fdesc, volfs "
echo -e "and enter the chroot. Once you are chrooted, run the bootstrap script like this: \n"
echo -e " /sbin/${0##*/} {standard,progressive} \n"
echo
exit 1
}
greeting() {
echo
echo -e "Gentoo for Mac OS X"
echo -e "http://www.gentoo.org/"
echo -e "Copyright 2005 The Gentoo Foundation"
echo -e "Distributed under the GPLv2 and APSL-2 Licenses"
echo
}
missing_devtools() {
## TODO install from Xcode CD,pkg on local disk, or use tools in portage
echo -e "Please install the Xcode Developer Tools available at http://developer.apple.com/tools/download"
echo
exit 1
sudo installer -verbose -pkg ${DISTDIR}/DeveloperTools.pkg -target ${ROOT}
sudo installer -verbose -pkg ${DISTDIR}/DevSDK.pkg -target ${ROOT}
sudo installer -verbose -pkg ${DISTDIR}/BSDSDK.pkg -target ${ROOT}
sudo installer -verbose -pkg ${DISTDIR}/gcc3.3.pkg -target ${ROOT}
}
setup_users() {
TARGET=$1
# TODO prompt current user to add to portage group
if [ ! -d ${TARGET}/var/db/netinfo/local.nidb ]; then
echo "Creating local NetInfo database"
# loop until password was entered the same twice
while [ 1 ]; do
ROOT_PW=`openssl passwd`
if [ ${?} == "0" ]; then
break
fi
done
sudo mkdir -p ${TARGET}/var/db/netinfo/local.nidb
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /users/root passwd ${ROOT_PW}
sudo touch ${TARGET}/var/db/.AppleSetupDone
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /users/portage
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /groups/portage
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /users/portage uid 250
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /users/portage gid 250
sudo nicl -raw ${TARGET}/var/db/netinfo/local.nidb -create /groups/portage gid 250
else
sudo niutil -create ${TARGET} /users/portage
sudo niutil -create ${TARGET} /groups/portage
sudo niutil -createprop ${TARGET} /users/portage uid 250
sudo niutil -createprop ${TARGET} /users/portage gid 250
sudo niutil -createprop ${TARGET} /groups/portage gid 250
fi
}
show_status() {
local num=$1
shift
echo " [[ ($num/6) $* ]]"
}
usage() {
echo -e "Usage: ${HILITE}${0##*/}${NORMAL} ${GOOD}[options]${NORMAL}"
echo -e " ${GOOD}standard${NORMAL} Mac OS X Standard - no system files will be modified (requires Xcode)"
echo -e " ${GOOD}progressive${NORMAL} Mac OS X Progressive - EXPERIMENTAL!! Tames your Panther."
echo -e " ${GOOD}dmg${NORMAL} Creates a Mac OS X Disk Image suitable for a development chroot"
exit 1
}
## End Functions
greeting
for ARG in "$@"; do
if [ "$ARG" == "progressive" ]; then
echo "Progressive!"
bootstrap_progressive
elif [ "$ARG" == "standard" ]; then
bootstrap_standard
elif [ "$ARG" == "dmg" ]; then
create_dmg
elif [ "$ARG" == "pythononly" ]; then
bootstrap_python $2
elif [ "$ARG" == "portageonly" ]; then
bootstrap_portage $2
fi
done
usage
|