4 eselect profile set ${clst_target_profile}
6 # Trap these signals and kill ourselves if recieved
7 # Force ourselves to die if any of these signals are recieved
8 # most likely our controlling terminal is gone
9 trap "echo SIGTERM signal recieved killing $0 with pid $$;kill -9 $$" SIGTERM
10 trap "echo SIGHUP signal recieved killing $0 with pid $$;kill -9 $$" SIGHUP
11 trap "echo SIGKILL signal recieved killing $0 with pid $$;kill -9 $$" SIGKILL
13 #SIGINT interrupt character (usually Ctrl-C)
14 # * example: high-level sequence of events
15 # * my process (call it "P") is running
17 # * kernel recognizes this and generates SIGINT signal
18 trap "echo SIGINT signal recieved killing $0 with pid $$;kill -9 $$" SIGINT
20 check_genkernel_version(){
21 if [ -x /usr/bin/genkernel ]
23 genkernel_version=$(genkernel --version)
24 genkernel_version_major=${genkernel_version%%.*}
25 genkernel_version_minor_sub=${genkernel_version#${genkernel_version_major}.}
26 genkernel_version_minor=${genkernel_version_minor_sub%%.*}
27 genkernel_version_sub=${genkernel_version##*.}
28 if [ -n "${genkernel_version}" -a "${genkernel_version_major}" -eq '3' -a "${genkernel_version_minor}" -ge '3' ]
30 echo "Genkernel version ${genkernel_version} found ... continuing"
32 echo "ERROR: Your genkernel version is too low in your seed stage. genkernel version 3.3.0"
33 echo "or greater is required."
42 ABI=$(portageq envvar ABI)
43 DEFAULT_ABI=$(portageq envvar DEFAULT_ABI)
44 LIBDIR_default=$(portageq envvar LIBDIR_default)
53 elif [ -n "${DEFAULT_ABI}" ]
60 local var="LIBDIR_${abi}"
61 var=$(portageq envvar ${var})
67 export FEATURES="-news clean-logs"
68 if [ -n "${clst_CCACHE}" ]
70 export clst_myfeatures="${clst_myfeatures} ccache"
71 clst_root_path=/ run_merge --oneshot --noreplace dev-util/ccache || exit 1
74 if [ -n "${clst_DISTCC}" ]
76 export clst_myfeatures="${clst_myfeatures} distcc"
77 export DISTCC_HOSTS="${clst_distcc_hosts}"
78 [ -e /etc/portage/make.conf ] && \
79 echo 'USE="${USE} -avahi -gtk -gnome"' >> /etc/portage/make.conf
80 # We install distcc to / on stage1, then use --noreplace, so we need to
81 # have some way to check if we need to reinstall distcc without being
82 # able to rely on USE, so we check for the distcc user and force a
83 # reinstall if it isn't found.
84 if [ "$(getent passwd distcc | cut -d: -f1)" != "distcc" ]
86 clst_root_path=/ run_merge --oneshot sys-devel/distcc || exit 1
88 clst_root_path=/ run_merge --oneshot --noreplace sys-devel/distcc || exit 1
90 sed -i '/USE="${USE} -avahi -gtk -gnome"/d' /etc/portage/make.conf
92 echo "${clst_distcc_hosts}" > /etc/distcc/hosts
94 # This sets up automatic cross-distcc-fu according to
95 # http://www.gentoo.org/doc/en/cross-compiling-distcc.xml
96 CHOST=$(portageq envvar CHOST)
98 cd /usr/${LIBDIR}/distcc/bin
99 rm cc gcc g++ c++ 2>/dev/null
100 echo -e '#!/bin/bash\nexec /usr/'${LIBDIR}'/distcc/bin/'${CHOST}'-g${0:$[-2]} "$@"' > ${CHOST}-wrapper
101 chmod a+x /usr/${LIBDIR}/distcc/bin/${CHOST}-wrapper
102 for i in cc gcc g++ c++; do ln -s ${CHOST}-wrapper ${i}; done
105 if [ -n "${clst_ICECREAM}" ]
107 clst_root_path=/ run_merge --oneshot --noreplace sys-devel/icecream || exit 1
109 # This sets up automatic cross-icecc-fu according to
110 # http://gentoo-wiki.com/HOWTO_Setup_An_ICECREAM_Compile_Cluster#Icecream_and_cross-compiling
111 CHOST=$(portageq envvar CHOST)
113 cd /usr/${LIBDIR}/icecc/bin
114 rm cc gcc g++ c++ 2>/dev/null
115 echo -e '#!/bin/bash\nexec /usr/'${LIBDIR}'/icecc/bin/'${CHOST}'-g${0:$[-2]} "$@"' > ${CHOST}-wrapper
116 chmod a+x ${CHOST}-wrapper
117 for i in cc gcc g++ c++; do ln -s ${CHOST}-wrapper ${i}; done
118 export PATH="/usr/lib/icecc/bin:${PATH}"
119 export PREROOTPATH="/usr/lib/icecc/bin"
121 export FEATURES="${clst_myfeatures} -news"
124 setup_myemergeopts(){
125 if [ -n "${clst_VERBOSE}" ]
127 clst_myemergeopts="--verbose"
129 clst_myemergeopts="--quiet"
130 bootstrap_opts="${bootstrap_opts} -q"
132 if [ -n "${clst_FETCH}" ]
134 export bootstrap_opts="${bootstrap_opts} -f"
135 export clst_myemergeopts="${clst_myemergeopts} -f"
136 # if we have PKGCACHE, and either update_seed is empty or 'no', make and use binpkgs
137 elif [ -n "${clst_PKGCACHE}" ] && [ -z "${clst_update_seed}" -o "${clst_update_seed}" = "no" ]
139 export clst_myemergeopts="${clst_myemergeopts} --usepkg --buildpkg --newuse"
140 export bootstrap_opts="${bootstrap_opts} -r"
145 if [ -x /usr/bin/binutils-config ]
147 my_binutils=$( cd /etc/env.d/binutils; ls ${clst_CHOST}-* | head -n 1 )
148 if [ -z "${my_binutils}" ]
152 binutils-config ${my_binutils}; update_env_settings
157 if [ -x /usr/bin/gcc-config ]
159 my_gcc=$( cd /etc/env.d/gcc; ls ${clst_CHOST}-* | head -n 1 )
160 if [ -z "${my_gcc}" ]
164 gcc-config ${my_gcc}; update_env_settings
169 # We need to merge our package manager with USE="build" set in case it is
170 # portage to avoid frying our /etc/portage/make.conf file. Otherwise, we could
171 # just let emerge @system could merge it.
172 # Use --update or portage might just waste time/cycles and reinstall the same version.
173 [ -e /etc/portage/make.conf ] && echo 'USE="${USE} build"' >> /etc/portage/make.conf
174 run_merge --oneshot --update sys-apps/portage
175 sed -i '/USE="${USE} build"/d' /etc/portage/make.conf
180 rm -rf /etc/distcc/hosts
181 for i in cc gcc c++ g++; do
182 rm -f /usr/${LIBDIR}/distcc/bin/${i}
183 ln -s /usr/bin/distcc /usr/${LIBDIR}/distcc/bin/${i}
185 rm -f /usr/${LIBDIR}/distcc/bin/*-wrapper
190 for i in cc gcc c++ g++; do
191 rm -f /usr/${LIBDIR}/icecc/bin/${i}
192 ln -s /usr/bin/icecc /usr/${LIBDIR}/icecc/bin/${i}
194 rm -f /usr/${LIBDIR}/icecc/bin/*-wrapper
199 if [ -n "${clst_DISTCC}" ]
203 if [ -n "${clst_ICECREAM}" ]
207 case ${clst_target} in
209 run_merge --depclean --with-bdeps=y
212 echo "Skipping depclean operation for ${clst_target}"
215 case ${clst_target} in
216 stage1|stage2|stage3|system)
217 rm -f /var/lib/portage/world
218 touch /var/lib/portage/world
221 echo "Skipping removal of world file for ${clst_target}"
225 rm -f /var/log/emerge.log /var/log/portage/elog/*
228 update_env_settings(){
229 [ -x /usr/sbin/env-update ] && /usr/sbin/env-update
231 [ -f /tmp/envscript ] && source /tmp/envscript
240 # ROOT is / by default, so remove any ROOT= settings from make.conf
241 sed -i '/ROOT=/d' /etc/portage/make.conf
243 if [ "${1}" != "/" -a -n "${1}" ]
245 echo "ROOT=\"${1}\"" >> /etc/portage/make.conf
255 # Sets up the ROOT= parameter
256 # with no options ROOT=/
257 make_destpath ${clst_root_path}
259 export EMERGE_WARNING_DELAY=0
261 export EBEEP_IGNORE=0
262 export EPAUSE_IGNORE=0
263 export CONFIG_PROTECT="-*"
265 if [ -n "${clst_VERBOSE}" ]
267 echo "ROOT=${ROOT} emerge ${clst_myemergeopts} -pt $@" || exit 1
268 emerge ${clst_myemergeopts} -pt $@ || exit 3
269 echo "Press any key within 15 seconds to pause the build..."
273 echo "Press any key to continue..."
278 echo "emerge ${clst_myemergeopts} $@" || exit 1
280 emerge ${clst_myemergeopts} $@ || exit 1
284 if [ "${clst_DEBUG}" = "1" ]
288 echo "Profile/target info:"
289 echo "Profile inheritance:"
290 python -c 'import portage; print(portage.settings.profiles)'
292 # TODO: make this work on non-portage
294 # TODO: grab our entire env
295 # <zmedico> to get see the ebuild env you can do something like:
296 # `set > /tmp/env_dump.${EBUILD_PHASE}` inside /etc/portage/bashrc
297 # XXX: Also, portageq does *not* source profile.bashrc at any time.
299 echo "BOOTSTRAP_USE: $(portageq envvar BOOTSTRAP_USE)"
301 echo "USE (profile): $(portageq envvar USE)"
302 echo "FEATURES (profile): $(portageq envvar FEATURES)"
304 echo "ARCH: $(portageq envvar ARCH)"
305 echo "CHOST: $(portageq envvar CHOST)"
306 echo "CFLAGS: $(portageq envvar CFLAGS)"
308 echo "These should be blank on non-multilib profiles."
309 echo "ABI: $(portageq envvar ABI)"
310 echo "DEFAULT_ABI: $(portageq envvar DEFAULT_ABI)"
311 echo "KERNEL_ABI: $(portageq envvar KERNEL_ABI)"
312 echo "LIBDIR: $(get_libdir)"
313 echo "MULTILIB_ABIS: $(portageq envvar MULTILIB_ABIS)"
314 echo "PROFILE_ARCH: $(portageq envvar PROFILE_ARCH)"
319 run_default_funcs() {
320 if [ "${RUN_DEFAULT_FUNCS}" != "no" ]
329 # Copy libs of a executable in the chroot
330 function copy_libs() {
331 # Check if it's a dynamix exec
332 ldd ${1} > /dev/null 2>&1 || return
334 for lib in `ldd ${1} | awk '{ print $3 }'`
339 if [ ! -e ${clst_root_path}/${lib} ]
342 [ -e "${clst_root_path}/${lib}" ] && \
343 strip -R .comment -R .note ${clst_root_path}/${lib} \
344 || echo "WARNING : Cannot strip lib ${clst_root_path}/${lib} !"
347 echo "WARNING : Some library was not found for ${lib} !"
352 function copy_symlink() {
354 [ "${STACK}" = "" ] && STACK=16 || STACK=$((${STACK} - 1 ))
356 if [ ${STACK} -le 0 ]
358 echo "WARNING : ${TARGET} : too many levels of symbolic links !"
362 [ ! -e ${clst_root_path}/`dirname ${1}` ] && \
363 mkdir -p ${clst_root_path}/`dirname ${1}`
364 [ ! -e ${clst_root_path}/${1} ] && \
365 cp -vfdp ${1} ${clst_root_path}/${1}
367 if [[ -n $(type -p realpath) ]]; then
368 TARGET=`realpath ${1}`
370 TARGET=`readlink -f ${1}`
374 copy_symlink ${TARGET} ${STACK}
380 function copy_file() {
385 echo "WARNING : File not found : ${f}"
389 [ ! -e ${clst_root_path}/`dirname ${f}` ] && \
390 mkdir -p ${clst_root_path}/`dirname ${f}`
391 [ ! -e ${clst_root_path}/${f} ] && \
392 cp -vfdp ${f} ${clst_root_path}/${f}
393 if [ -x ${f} -a ! -h ${f} ]
396 strip -R .comment -R .note ${clst_root_path}/${f} > /dev/null 2>&1
403 create_handbook_icon() {
404 # This function creates a local icon to the Gentoo Handbook
405 echo "[Desktop Entry]
409 URL=file:///mnt/cdrom/docs/handbook/html/index.html
411 Name=Gentoo Linux Handbook
412 GenericName=Gentoo Linux Handbook
413 Comment=This is a link to the local copy of the Gentoo Linux Handbook.
414 Icon=text-editor" > /usr/share/applications/gentoo-handbook.desktop
417 # We do this everywhere, so why not put it in this script