2 # Copyright 2007 Yann E. MORIN
3 # Licensed under the GPL v2. See COPYING in the root of this package.
5 # This is the main entry point to crosstool
7 # - download, extract and patch the toolchain components
8 # - build and install each components in turn
9 # - and eventually test the resulting toolchain
11 # What this file does is prepare the environment, based upon the user-choosen
12 # options. It also checks the existing environment for un-friendly variables,
13 # and checks for needed tools. It eventually calls the main build script.
15 # User must set CT_TOP_DIR in is environment!
16 # Once we can build out-of-tree, then this will have to go.
17 if [ -z "${CT_TOP_DIR}" -o ! -d "${CT_TOP_DIR}" ]; then
18 # We don't have the functions right now, because we don't have CT_TOP_DIR.
19 # Do the print stuff by hand:
20 echo "CT_TOP_DIR not set. You must set CT_TOP_DIR to the top directory where crosstool is installed."
24 # Parse the common functions
25 . "${CT_TOP_DIR}/scripts/functions"
27 CT_STAR_DATE=`CT_DoDate +%s%N`
28 CT_STAR_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
30 # Log to a temporary file until we have built our environment
31 CT_ACTUAL_LOG_FILE="`pwd`/$$.log"
33 # CT_TOP_DIR should be an absolute path.
34 CT_TOP_DIR="`CT_MakeAbsolutePath \"${CT_TOP_DIR}\"`"
36 # Parse the configuration file
37 CT_TestOrAbort "Configuration file not found. Please create one." -f "${CT_TOP_DIR}/.config"
38 . "${CT_TOP_DIR}/.config"
40 # The progress bar indicator is asked for
41 if [ "${CT_LOG_PROGRESS_BAR}" = "y" ]; then
43 [ $((cpt/5)) -eq 0 ] && echo -en "/"
44 [ $((cpt/5)) -eq 1 ] && echo -en "-"
45 [ $((cpt/5)) -eq 2 ] && echo -en "\\"
46 [ $((cpt/5)) -eq 3 ] && echo -en "|"
50 CT_PROG_BAR=_CT_PROG_BAR
51 export -f _CT_PROG_BAR
56 # Apply the color scheme if needed
57 if [ "${CT_LOG_USE_COLORS}" = "y" ]; then
58 CT_ERROR_COLOR="${_A_NOR}${_A_BRI}${_F_RED}"
59 CT_WARN_COLOR="${_A_NOR}${_A_BRI}${_F_YEL}"
60 CT_INFO_COLOR="${_A_NOR}${_A_BRI}${_F_GRN}"
61 CT_EXTRA_COLOR="${_A_NOR}${_A_DIM}${_F_GRN}"
62 CT_DEBUG_COLOR="${_A_NOR}${_A_DIM}${_F_WHI}"
63 CT_NORMAL_COLOR="${_A_NOR}"
73 # Yes! We can do full logging from now on!
74 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
76 # Some sanity checks in the environment and needed tools
77 CT_DoLog INFO "Checking environment sanity"
79 # Enable known ordering of files in directory listings:
80 CT_Test "Crosstool-NG might not work as expected with LANG=\"${LANG}\"" -n "${LANG}"
81 case "${LC_COLLATE},${LC_ALL}" in
82 # These four combinations are known to sort files in the correct order:
87 # Anything else is destined to be borked if not gracefuly handled:
88 *) CT_DoLog WARN "Either LC_COLLATE=\"${LC_COLLATE}\" or LC_ALL=\"${LC_ALL}\" is not supported."
89 export LC_ALL=`locale -a |egrep "^(fr_FR|en_US)" |head -n 1`
90 CT_TestOrAbort "Neither en_US* nor fr_FR* locales found on your system." -n "${LC_ALL}"
91 CT_DoLog WARN "Forcing to known working LC_ALL=\"${LC_ALL}\"."
95 # Other environment sanity checks
96 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
97 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
98 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
99 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
106 CT_DoStep DEBUG "Dumping crosstool-NG configuration"
107 cat ${CT_TOP_DIR}/.config |egrep '^(# |)CT_' |CT_DoLog DEBUG
110 CT_DoLog INFO "Building environment variables"
112 # This should go in buildToolchain.sh, but we might need it because it could
113 # be used by the user in his/her paths definitions.
114 # Target triplet: CT_TARGET needs a little love:
115 case "${CT_ARCH_BE},${CT_ARCH_LE}" in
116 y,) target_endian_eb=eb; target_endian_el=;;
117 ,y) target_endian_eb=; target_endian_el=el;;
120 arm) CT_TARGET="${CT_ARCH}${target_endian_eb}";;
121 mips) CT_TARGET="${CT_ARCH}${target_endian_el}";;
122 x86*) # Much love for this one :-(
123 # Ultimately, we should use config.sub to output the correct
124 # procesor name. Work for later...
125 arch="${CT_ARCH_ARCH}"
126 [ -z "${arch}" ] && arch="${CT_ARCH_TUNE}"
128 x86_64) CT_TARGET=x86_64;;
131 i386|i486|i586|i686) CT_TARGET="${arch}";;
132 winchip*) CT_TARGET=i486;;
133 pentium|pentium-mmx|c3*) CT_TARGET=i586;;
134 nocona|athlon*64|k8|athlon-fx|opteron) CT_TARGET=x86_64;;
135 pentiumpro|pentium*|athlon*) CT_TARGET=i686;;
140 case "${CT_TARGET_VENDOR}" in
141 "") CT_TARGET="${CT_TARGET}-unknown";;
142 *) CT_TARGET="${CT_TARGET}-${CT_TARGET_VENDOR}";;
144 case "${CT_KERNEL}" in
145 linux*) CT_TARGET="${CT_TARGET}-linux";;
146 cygwin*) CT_TARGET="${CT_TARGET}-cygwin";;
149 glibc) CT_TARGET="${CT_TARGET}-gnu";;
150 uClibc) CT_TARGET="${CT_TARGET}-uclibc";;
152 case "${CT_ARCH_ABI}" in
153 eabi) CT_TARGET="${CT_TARGET}eabi";;
155 CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`"
157 # Now, build up the variables from the user-configured options.
158 CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}"
159 CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}"
160 if [ "${CT_CC_USE_CORE}" != "y" ]; then
161 CT_CC_CORE="${CT_CC}"
162 CT_CC_CORE_VERSION="${CT_CC_VERSION}"
163 CT_CC_CORE_EXTRA_CONFIG="${CT_CC_EXTRA_CONFIG}"
165 CT_CC_CORE_FILE="${CT_CC_CORE}-${CT_CC_CORE_VERSION}"
166 CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}"
167 CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}"
168 [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_LIBFLOAT_FILE="libfloat-990616"
170 # Kludge: If any of the configured options needs CT_TARGET or CT_TOP_DIR,
171 # then rescan the options file now:
172 . "${CT_TOP_DIR}/.config"
174 # Determine build system if not set by the user
175 CT_Test "You did not specify the build system. Guessing." -z "${CT_BUILD}"
176 CT_BUILD="`${CT_TOP_DIR}/tools/config.sub \"${CT_BUILD:-\`${CT_TOP_DIR}/tools/config.guess\`}\"`"
178 # Get rid of pre-existing installed toolchain and previous build directories.
179 # We need to do that _before_ we can safely log, because the log file will
180 # most probably be in the toolchain directory.
181 if [ -d "${CT_PREFIX_DIR}" ]; then
182 mv "${CT_PREFIX_DIR}" "${CT_PREFIX_DIR}.$$"
183 nohup rm -rf "${CT_PREFIX_DIR}.$$" >/dev/null 2>&1 &
185 mkdir -p "${CT_PREFIX_DIR}"
186 if [ -d "${CT_BUILD_DIR}" ]; then
187 mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
188 nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
190 mkdir -p "${CT_BUILD_DIR}"
192 # Check now if we can write to the destination directory:
193 if [ -d "${CT_PREFIX_DIR}" ]; then
194 CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not writeable" ! -w "${CT_PREFIX_DIR}"
196 mkdir -p "${CT_PREFIX_DIR}" || CT_Abort "Could not create destination directory \"${CT_PREFIX_DIR}\""
199 # Redirect log to the actual log file now we can
200 # It's quite understandable that the log file will be installed in the
201 # install directory, so we must first ensure it exists and is writeable (above)
202 # before we can log there
203 t="${CT_ACTUAL_LOG_FILE}"
204 case "${CT_LOG_TO_FILE},${CT_LOG_FILE}" in
205 ,*) CT_ACTUAL_LOG_FILE=/dev/null
208 y,/*) mkdir -p "`dirname \"${CT_LOG_FILE}\"`"
209 CT_ACTUAL_LOG_FILE="${CT_LOG_FILE}"
210 mv "${t}" "${CT_ACTUAL_LOG_FILE}"
212 y,*) mkdir -p "`pwd`/`dirname \"${CT_LOG_FILE}\"`"
213 CT_ACTUAL_LOG_FILE="`pwd`/${CT_LOG_FILE}"
214 mv "${t}" "${CT_ACTUAL_LOG_FILE}"
218 # Some more sanity checks now that we have all paths set up
219 case "${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
220 *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
223 # Note: we'll always install the core compiler in its own directory, so as to
224 # not mix the two builds: core and final. Anyway, its generic, wether we use
225 # a different compiler as core, or not.
226 CT_CC_CORE_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core"
228 # Good, now grab a bit of informations on the system we're being run,
229 # just in case something goes awok, and it's not our fault:
230 CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true`
231 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
232 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}"
233 CT_SYS_KERNEL=`uname -s`
234 CT_SYS_REVISION=`uname -r`
235 # MacOS X lacks '-o' :
236 CT_SYS_OS=`uname -o || echo Unkown`
237 CT_SYS_MACHINE=`uname -m`
238 CT_SYS_PROCESSOR=`uname -p`
239 CT_SYS_USER="`id -un`"
240 CT_SYS_DATE=`CT_DoDate +%Y%m%d.%H%M%S`
241 CT_SYS_GCC=`gcc -dumpversion`
242 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_SYS_DATE} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME} for ${CT_TARGET}"
245 renice ${CT_NICE} $$ |CT_DoLog DEBUG
247 # Include sub-scripts instead of calling them: that way, we do not have to
248 # export any variable, nor re-parse the configuration and functions files.
249 . "${CT_TOP_DIR}/scripts/getExtractPatch.sh"
250 . "${CT_TOP_DIR}/scripts/buildToolchain.sh"
251 #. "${CT_TOP_DIR}/scripts/testToolchain.sh"
253 if [ -n "${CT_TARGET_ALIAS}" ]; then
254 CT_DoLog EXTRA "Creating symlinks from \"${CT_TARGET}-*\" to \"${CT_TARGET_ALIAS}-*\""
255 CT_Pushd "${CT_PREFIX_DIR}/bin"
256 for t in "${CT_TARGET}-"*; do
257 _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`"
258 CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
264 if [ "${CT_REMOVE_DOCS}" = "y" ]; then
265 CT_DoLog INFO "Removing installed documentation"
266 rm -rf "${CT_PREFIX_DIR}/"{man,info}
269 CT_STOP_DATE=`CT_DoDate +%s%N`
270 CT_STOP_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
271 CT_DoLog INFO "Build completed at ${CT_STOP_DATE_HUMAN}"
272 elapsed=$((CT_STOP_DATE-CT_STAR_DATE))
273 elapsed_min=$((elapsed/(60*1000*1000*1000)))
274 elapsed_sec=`printf "%02d" $(((elapsed%(60*1000*1000*1000))/(1000*1000*1000)))`
275 elapsed_csec=`printf "%02d" $(((elapsed%(1000*1000*1000))/(10*1000*1000)))`
276 CT_DoLog INFO "(elapsed: ${elapsed_min}:${elapsed_sec}.${elapsed_csec})"
278 # Restore a 'normal' color setting
279 echo -en "${CT_NORMAL_COLOR}"