From 57c57e9dfae50f045503ae9f3107fa3748512483 Mon Sep 17 00:00:00 2001
From: Alexandre Rostovtsev <tetromino@gentoo.org>
Date: Sun, 3 Feb 2013 19:19:36 -0500
Subject: [PATCH] winebuild: Use $CCAS to assemble if found

Commit c14bdaf1 made winebuild use Clang to assemble if found.

However, just because a user has some version of Clang installed, it
does not mean that she wants to use Clang to assemble Wine. For example,
a user who has both Clang and GAS installed may want to use GAS to avoid
textrels (see https://bugs.gentoo.org/show_bug.cgi?id=455308).

This patch allows the user to override which assembler gets used by
exporting CCAS at Wine configure time; the name CCAS was chosen for
compatibility with automake's standard AM_PROG_AS macro.
---
 configure                   | 106 ++++++++++++++++++++++++++++++++++++++++++++
 configure.ac                |   4 ++
 tools/winebuild/Makefile.in |   5 ++-
 tools/winebuild/utils.c     |  12 +++++
 4 files changed, 126 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index e3253ee..d0b7777 100755
--- a/configure
+++ b/configure
@@ -732,6 +732,8 @@ FLEX
 TOOLSDIR
 WOW64_DISABLE
 TARGETFLAGS
+ac_ct_CCAS
+CCAS
 CPPBIN
 ac_ct_CXX
 CXXFLAGS
@@ -861,6 +863,7 @@ CPPFLAGS
 CXX
 CXXFLAGS
 CCC
+CCAS
 CPP
 XMKMF'
 
@@ -1549,6 +1552,7 @@ Some influential environment variables:
               you have headers in a nonstandard directory <include dir>
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
+  CCAS        Assembler command
   CPP         C preprocessor
   XMKMF       Path to xmkmf, Makefile generator for X Window System
 
@@ -4075,6 +4079,108 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in clang gas as
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CCAS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CCAS"; then
+  ac_cv_prog_CCAS="$CCAS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CCAS="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CCAS=$ac_cv_prog_CCAS
+if test -n "$CCAS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCAS" >&5
+$as_echo "$CCAS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CCAS" && break
+  done
+fi
+if test -z "$CCAS"; then
+  ac_ct_CCAS=$CCAS
+  for ac_prog in clang gas as
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CCAS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CCAS"; then
+  ac_cv_prog_ac_ct_CCAS="$ac_ct_CCAS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CCAS="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CCAS=$ac_cv_prog_ac_ct_CCAS
+if test -n "$ac_ct_CCAS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CCAS" >&5
+$as_echo "$ac_ct_CCAS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CCAS" && break
+done
+
+  if test "x$ac_ct_CCAS" = x; then
+    CCAS=""$CC""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CCAS=$ac_ct_CCAS
+  fi
+fi
+
+
 case $host in
   *-darwin*)
     if test "x$enable_win64" = "xyes"
diff --git a/configure.ac b/configure.ac
index c93cd08..760f325 100644
--- a/configure.ac
+++ b/configure.ac
@@ -126,6 +126,10 @@ dnl We can't use AC_PROG_CPP for winegcc, it uses by default $(CC) -E
 AC_CHECK_TOOL(CPPBIN,cpp,cpp)
 AC_DEFINE_UNQUOTED(EXEEXT,["$ac_exeext"],[Define to the file extension for executables.])
 
+dnl Analogous to AM_PROG_AS
+AC_ARG_VAR([CCAS],[Assembler command])
+AC_CHECK_TOOLS(CCAS,[clang gas as],["$CC"])
+
 case $host in
   *-darwin*)
     if test "x$enable_win64" = "xyes"
diff --git a/tools/winebuild/Makefile.in b/tools/winebuild/Makefile.in
index 2017129..3fe47a3 100644
--- a/tools/winebuild/Makefile.in
+++ b/tools/winebuild/Makefile.in
@@ -1,4 +1,7 @@
-DEFS      = -D__WINESRC__ $(EXTRADEFS)
+DEFS      = \
+	-DCCAS="\"@CCAS@\"" \
+	-D__WINESRC__ \
+	$(EXTRADEFS)
 
 PROGRAMS = winebuild$(EXEEXT)
 MANPAGE  = winebuild.man
diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c
index 262ff3a..1c5f918 100644
--- a/tools/winebuild/utils.c
+++ b/tools/winebuild/utils.c
@@ -352,6 +352,18 @@ struct strarray *get_as_command(void)
     static int as_is_clang = 0;
     struct strarray *args = strarray_init();
 
+    if (!as_command && strlen( CCAS ))
+    {
+        struct stat st;
+
+        if (!stat( CCAS, &st ))
+            as_command = CCAS;
+        else
+            as_command = find_tool( CCAS, NULL );
+
+        if (as_command && strstr( as_command, "clang" )) as_is_clang = 1;
+    }
+
     if (!as_command)
     {
         as_command = find_tool( "clang", NULL );
-- 
1.8.1.2

