Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
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}"