Patchwork [1,of,1] refine static linking check to better guide user

login
register
mail settings
Submitter Daniel Price
Date Nov. 19, 2012, 10:49 p.m.
Message ID <CAKduhSthXBnu29QJM8Nt1xGKK8E4azQ2_hBfMNbxLEnoAMJh4g@mail.gmail.com>
Download mbox | patch
Permalink /patch/200210/
State Superseded
Headers show

Comments

Daniel Price - Nov. 19, 2012, 10:49 p.m.
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
Yann E. MORIN - Nov. 19, 2012, 10:55 p.m.
Daniel, All,

On Monday 19 November 2012 Daniel Price wrote:
> Here it is again, as an attachment.  I cannot (apparently) persuade
> gmail not to wrap lines.  Apologies.

Do not use gmail's web client. It is uterly broken.
Instead, use 'hg email' to send your patches. It can use your gmail
account as smtp server, but ensurss the patches are not mangled.

I'll look at your patch later. Thank you!

Regards,
Yann E. MORIN.

Patch

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