[PATCH 1 of 1] refine static linking check to better guide user
Daniel Price
daniel.price@gmail.com
Mon Nov 19 22:49:00 GMT 2012
Here it is again, as an attachment. I cannot (apparently) persuade
gmail not to wrap lines. Apologies.
-dp
On Mon, Nov 19, 2012 at 2:40 PM, Daniel Price <daniel.price@gmail.com> wrote:
> An IRC discussion with Yann last week led to a request that I submit a
> patch which covers a series of blunders I made as a novice user of
> crosstool. One was that I didn't have static libc installed on my
> host system, and was stymied by the wording of the message: "Static
> linking impossible on the host system" (solution: install the static
> glibc package). Two was that I had a misconfigured directory
> structure which had a ':' in it-- this causes $PATH to be misparsed,
> and, ironically, trips the "Static linking impossible" message all
> over again.
>
> Via google, I have noticed that the "static linking" error message has
> come up a number of times, and this patch hopefully will help to
> clarify for the user what they might need to do to make crosstool work
> for them by first proving that gcc is present, can compile a trivial
> program, and can compile trivial static binaries. I also adjusted the
> error messages somewhat in order to provide some hints if things go
> wrong.
>
> Comments appreciated; I made a number of editorial decisions which
> perhaps not everyone would agree with. Also, my ability to test this
> on a variety of hosts is very limited. Thanks,
>
> -dp
>
> # HG changeset patch
> # User Daniel Price <daniel.price@gmail.com>
> # Date 1353364265 28800
> # Node ID fe774e44305a643f553b509a147e7fc78ed7d3dd
> # Parent 1c68438f44f74e7fcf761838271f1e4d156ceeda
> scripts: refine static linking check to better guide the user
>
> Signed-off-by: Daniel Price <daniel.price@gmail.com>
>
> diff -r 1c68438f44f7 -r fe774e44305a scripts/crosstool-NG.sh.in
> --- a/scripts/crosstool-NG.sh.in Fri Nov 16 14:59:27 2012 +0100
> +++ b/scripts/crosstool-NG.sh.in Mon Nov 19 14:31:05 2012 -0800
> @@ -422,8 +422,7 @@
> where=$(CT_Which "${tool}")
> fi
>
> - # Not all tools are available for all platforms, but some
> are really,
> - # bally needed
> + # Not all tools are available for all platforms, but some
> are required.
> if [ -n "${where}" ]; then
> CT_DoLog DEBUG " '${!v}-${tool}' -> '${where}'"
> printf "#${BANG}${CT_CONFIG_SHELL}\nexec '${where}'
> \"\${@}\"\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}"
> @@ -475,17 +474,60 @@
> *) ;;
> esac
>
> + # Now that we've set up $PATH, sanity test that GCC is runnable so that
> + # the user can troubleshoot problems if not.
> + CT_DoLog DEBUG "Sanity testing gcc"
> + gccout="${CT_BUILD_DIR}/.gcc-output"
> + GCC=${CT_HOST}-gcc
> + ret=0
> + ${GCC} -v > $gccout 2>&1 || ret=$?
> + if [ $ret != 0 ]; then
> + CT_DoLog DEBUG "Failed to invoke '${GCC} -v' (exited ${ret}):
> Output Follows:"
> + CT_DoLog DEBUG "$(cat ${gccout})"
> + fi
> + case $ret in
> + 0)
> + ;;
> + 126)
> + CT_Abort "${GCC}: cannot execute; check permissions."
> + ;;
> + 127)
> + CT_Abort "${GCC}: not found in PATH; check for
> metacharacters or other problems in PATH (PATH=${PATH})"
> + ;;
> + *)
> + CT_Abort "Ran '${GCC} -v', but command failed with exit ${ret}"
> + ;;
> + esac
> + rm -f "${gccout}"
> +
> + CT_DoLog DEBUG "Testing that gcc can compile a trivial program"
> + tmp="${CT_BUILD_DIR}/.gcc-test"
> + # Try a trivial program to ensure the compiler works.
> + if ! "${CT_HOST}-gcc" -xc - -o "${tmp}" > ${gccout} 2>&1 <<-_EOF_
> + int main() {return 0; }
> + _EOF_
> + then
> + CT_DoLog DEBUG "'${GCC}' failed (exited ${ret}): Output Follows:"
> + CT_DoLog DEBUG "$(cat ${gccout})"
> + CT_Abort "Couldn't compile a trivial program using ${CT_HOST}-gcc"
> + fi
> + rm -f "${tmp}" "${gccout}"
> +
> # Now we know our host and where to find the host tools, we can check
> # if static link was requested, but only if it was requested
> if [ "${CT_WANTS_STATIC_LINK}" = "y" ]; then
> tmp="${CT_BUILD_DIR}/.static-test"
> - if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" >/dev/null
> 2>&1 <<-_EOF_
> +
> + CT_DoLog DEBUG "Testing that gcc can compile a trivial
> statically linked program"
> + if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" > ${gccout}
> 2>&1 <<-_EOF_
> int main() { return 0; }
> _EOF_
> then
> - CT_Abort "Static linking impossible on the host system
> '${CT_HOST}'"
> + CT_DoLog DEBUG "'${GCC}' failed (exited ${ret}): Output Follows:"
> + CT_DoLog DEBUG "$(cat ${gccout})"
> + CT_Abort "Static linking impossible on the host system
> '${CT_HOST}'; is libc.a installed?"
> fi
> - rm -f "${tmp}"
> + rm -f "${tmp}" "${gccout}"
> fi
>
> # Help gcc
>
>
>
> --
> Daniel.Price@gmail.com; Twitter: @danielbprice
--
Daniel.Price@gmail.com; Twitter: @danielbprice
-------------- next part --------------
# HG changeset patch
# User Daniel Price <daniel.price@gmail.com>
# Date 1353364265 28800
# Node ID fe774e44305a643f553b509a147e7fc78ed7d3dd
# Parent 1c68438f44f74e7fcf761838271f1e4d156ceeda
scripts: refine static linking check to better guide the user
Signed-off-by: Daniel Price <daniel.price@gmail.com>
diff -r 1c68438f44f7 -r fe774e44305a scripts/crosstool-NG.sh.in
--- a/scripts/crosstool-NG.sh.in Fri Nov 16 14:59:27 2012 +0100
+++ b/scripts/crosstool-NG.sh.in Mon Nov 19 14:31:05 2012 -0800
@@ -422,8 +422,7 @@
where=$(CT_Which "${tool}")
fi
- # Not all tools are available for all platforms, but some are really,
- # bally needed
+ # Not all tools are available for all platforms, but some are required.
if [ -n "${where}" ]; then
CT_DoLog DEBUG " '${!v}-${tool}' -> '${where}'"
printf "#${BANG}${CT_CONFIG_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}"
@@ -475,17 +474,60 @@
*) ;;
esac
+ # Now that we've set up $PATH, sanity test that GCC is runnable so that
+ # the user can troubleshoot problems if not.
+ CT_DoLog DEBUG "Sanity testing gcc"
+ gccout="${CT_BUILD_DIR}/.gcc-output"
+ GCC=${CT_HOST}-gcc
+ ret=0
+ ${GCC} -v > $gccout 2>&1 || ret=$?
+ if [ $ret != 0 ]; then
+ CT_DoLog DEBUG "Failed to invoke '${GCC} -v' (exited ${ret}): Output Follows:"
+ CT_DoLog DEBUG "$(cat ${gccout})"
+ fi
+ case $ret in
+ 0)
+ ;;
+ 126)
+ CT_Abort "${GCC}: cannot execute; check permissions."
+ ;;
+ 127)
+ CT_Abort "${GCC}: not found in PATH; check for metacharacters or other problems in PATH (PATH=${PATH})"
+ ;;
+ *)
+ CT_Abort "Ran '${GCC} -v', but command failed with exit ${ret}"
+ ;;
+ esac
+ rm -f "${gccout}"
+
+ CT_DoLog DEBUG "Testing that gcc can compile a trivial program"
+ tmp="${CT_BUILD_DIR}/.gcc-test"
+ # Try a trivial program to ensure the compiler works.
+ if ! "${CT_HOST}-gcc" -xc - -o "${tmp}" > ${gccout} 2>&1 <<-_EOF_
+ int main() {return 0; }
+ _EOF_
+ then
+ CT_DoLog DEBUG "'${GCC}' failed (exited ${ret}): Output Follows:"
+ CT_DoLog DEBUG "$(cat ${gccout})"
+ CT_Abort "Couldn't compile a trivial program using ${CT_HOST}-gcc"
+ fi
+ rm -f "${tmp}" "${gccout}"
+
# Now we know our host and where to find the host tools, we can check
# if static link was requested, but only if it was requested
if [ "${CT_WANTS_STATIC_LINK}" = "y" ]; then
tmp="${CT_BUILD_DIR}/.static-test"
- if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_
+
+ CT_DoLog DEBUG "Testing that gcc can compile a trivial statically linked program"
+ if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" > ${gccout} 2>&1 <<-_EOF_
int main() { return 0; }
_EOF_
then
- CT_Abort "Static linking impossible on the host system '${CT_HOST}'"
+ CT_DoLog DEBUG "'${GCC}' failed (exited ${ret}): Output Follows:"
+ CT_DoLog DEBUG "$(cat ${gccout})"
+ CT_Abort "Static linking impossible on the host system '${CT_HOST}'; is libc.a installed?"
fi
- rm -f "${tmp}"
+ rm -f "${tmp}" "${gccout}"
fi
# Help gcc
-------------- next part --------------
--
For unsubscribe information see http://sourceware.org/lists.html#faq
More information about the crossgcc
mailing list