diff mbox

Allow kmscon to be cross-compiled

Message ID 1378722468-21961-1-git-send-email-treding@nvidia.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thierry Reding Sept. 9, 2013, 10:27 a.m. UTC
The genshader and genunifont utilities are run during the build process
to generate source files. In order for that to work when cross-compiling
the files need to be built using the native compiler instead of the
cross-compiler.

Add the AX_PROG_CC_FOR_BUILD m4 macro which defines various *_FOR_BUILD
variables that are the native equivalents of CC, CFLAGS, LDFLAGS, etc.
Override CC, CFLAGS and LDFLAGS for genshader and genunifont and their
object files so that they will be built natively and can be executed
during the build.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 Makefile.am                |  16 ++++--
 configure.ac               |   3 +-
 m4/ax_prog_cc_for_build.m4 | 125 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+), 5 deletions(-)
 create mode 100644 m4/ax_prog_cc_for_build.m4

Comments

David Herrmann Sept. 9, 2013, 10:48 a.m. UTC | #1
Hi

On Mon, Sep 9, 2013 at 12:27 PM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> The genshader and genunifont utilities are run during the build process
> to generate source files. In order for that to work when cross-compiling
> the files need to be built using the native compiler instead of the
> cross-compiler.
>
> Add the AX_PROG_CC_FOR_BUILD m4 macro which defines various *_FOR_BUILD
> variables that are the native equivalents of CC, CFLAGS, LDFLAGS, etc.
> Override CC, CFLAGS and LDFLAGS for genshader and genunifont and their
> object files so that they will be built natively and can be executed
> during the build.

Thanks a lot! Looks all good, few comments below. I think I will apply
it as is, anyway. New bugfix-release is planned for this week, too.

> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>  Makefile.am                |  16 ++++--
>  configure.ac               |   3 +-
>  m4/ax_prog_cc_for_build.m4 | 125 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 139 insertions(+), 5 deletions(-)
>  create mode 100644 m4/ax_prog_cc_for_build.m4
>
> diff --git a/Makefile.am b/Makefile.am
> index 7019290..f1b4435 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -445,8 +445,12 @@ EXTRA_DIST += $(SHADERS)
>  CLEANFILES += src/static_shaders.c
>  genshader_SOURCES = src/genshader.c
>
> -src/static_shaders.c: $(SHADERS) genshader$(EXEEXT)
> -       $(AM_V_GEN)./genshader$(EXEEXT) src/static_shaders.c $(SHADERS)
> +src/static_shaders.c: $(SHADERS) genshader$(BUILD_EXEEXT)
> +       $(AM_V_GEN)./genshader$(BUILD_EXEEXT) src/static_shaders.c $(SHADERS)
> +
> +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CC = $(CC_FOR_BUILD)
> +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
> +genshader$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)

Just wondering, isn't this going to break if $BUILD_EXEEXT != $EXEEXT
I mean, noinst_PROGRAMS generates build-rules for $EXEEXT, not for
$BUILD_EXEEXT, so a dependency on "genshader$(BUILD_EXEEXT)" won't do
anything if it differs from $EXEEXT. But maybe I am just missing
something and automake creates rules for both?

Otherwise, looks good.
Thanks
David

>  #
>  # Unifont Generator
> @@ -461,8 +465,12 @@ EXTRA_DIST += $(UNIFONT)
>  CLEANFILES += $(UNIFONT_BIN)
>  genunifont_SOURCES = src/genunifont.c
>
> -$(UNIFONT_BIN): $(UNIFONT) genunifont$(EXEEXT)
> -       $(AM_V_GEN)./genunifont$(EXEEXT) $(UNIFONT_BIN) $(UNIFONT)
> +genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CC = $(CC_FOR_BUILD)
> +genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
> +genunifont$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
> +
> +$(UNIFONT_BIN): $(UNIFONT) genunifont$(BUILD_EXEEXT)
> +       $(AM_V_GEN)./genunifont$(BUILD_EXEEXT) $(UNIFONT_BIN) $(UNIFONT)
>
>  #
>  # Kmscon Modules
> diff --git a/configure.ac b/configure.ac
> index bf3c89c..b5d9513 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -17,7 +17,7 @@ AC_CONFIG_HEADER(config.h)
>  AC_USE_SYSTEM_EXTENSIONS
>  AC_SYS_LARGEFILE
>  AC_PREFIX_DEFAULT([/usr])
> -AC_CANONICAL_HOST
> +AC_CANONICAL_SYSTEM
>
>  AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects dist-xz no-dist-gzip tar-pax -Wall -Werror -Wno-portability])
>  AM_SILENT_RULES([yes])
> @@ -31,6 +31,7 @@ AM_SILENT_RULES([yes])
>  : ${CFLAGS=""}
>
>  AC_PROG_CC
> +AX_PROG_CC_FOR_BUILD
>  AC_PROG_CC_C99
>  AM_PROG_CC_C_O
>  m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
> diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
> new file mode 100644
> index 0000000..6369809
> --- /dev/null
> +++ b/m4/ax_prog_cc_for_build.m4
> @@ -0,0 +1,125 @@
> +# ===========================================================================
> +#   http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
> +# ===========================================================================
> +#
> +# SYNOPSIS
> +#
> +#   AX_PROG_CC_FOR_BUILD
> +#
> +# DESCRIPTION
> +#
> +#   This macro searches for a C compiler that generates native executables,
> +#   that is a C compiler that surely is not a cross-compiler. This can be
> +#   useful if you have to generate source code at compile-time like for
> +#   example GCC does.
> +#
> +#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
> +#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
> +#   The value of these variables can be overridden by the user by specifying
> +#   a compiler with an environment variable (like you do for standard CC).
> +#
> +#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
> +#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
> +#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
> +#   substituted in the Makefile.
> +#
> +# LICENSE
> +#
> +#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
> +#
> +#   Copying and distribution of this file, with or without modification, are
> +#   permitted in any medium without royalty provided the copyright notice
> +#   and this notice are preserved. This file is offered as-is, without any
> +#   warranty.
> +
> +#serial 5
> +
> +AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
> +AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
> +AC_REQUIRE([AC_PROG_CC])dnl
> +AC_REQUIRE([AC_PROG_CPP])dnl
> +AC_REQUIRE([AC_EXEEXT])dnl
> +AC_REQUIRE([AC_CANONICAL_SYSTEM])dnl
> +
> +dnl Use the standard macros, but make them use other variable names
> +dnl
> +pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
> +pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
> +pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
> +pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
> +pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
> +pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
> +pushdef([ac_cv_objext], ac_cv_build_objext)dnl
> +pushdef([ac_exeext], ac_build_exeext)dnl
> +pushdef([ac_objext], ac_build_objext)dnl
> +pushdef([CC], CC_FOR_BUILD)dnl
> +pushdef([CPP], CPP_FOR_BUILD)dnl
> +pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
> +pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
> +pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
> +pushdef([host], build)dnl
> +pushdef([host_alias], build_alias)dnl
> +pushdef([host_cpu], build_cpu)dnl
> +pushdef([host_vendor], build_vendor)dnl
> +pushdef([host_os], build_os)dnl
> +pushdef([ac_cv_host], ac_cv_build)dnl
> +pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
> +pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
> +pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
> +pushdef([ac_cv_host_os], ac_cv_build_os)dnl
> +pushdef([ac_cpp], ac_build_cpp)dnl
> +pushdef([ac_compile], ac_build_compile)dnl
> +pushdef([ac_link], ac_build_link)dnl
> +
> +save_cross_compiling=$cross_compiling
> +save_ac_tool_prefix=$ac_tool_prefix
> +cross_compiling=no
> +ac_tool_prefix=
> +
> +AC_PROG_CC
> +AC_PROG_CPP
> +AC_EXEEXT
> +
> +ac_tool_prefix=$save_ac_tool_prefix
> +cross_compiling=$save_cross_compiling
> +
> +dnl Restore the old definitions
> +dnl
> +popdef([ac_link])dnl
> +popdef([ac_compile])dnl
> +popdef([ac_cpp])dnl
> +popdef([ac_cv_host_os])dnl
> +popdef([ac_cv_host_vendor])dnl
> +popdef([ac_cv_host_cpu])dnl
> +popdef([ac_cv_host_alias])dnl
> +popdef([ac_cv_host])dnl
> +popdef([host_os])dnl
> +popdef([host_vendor])dnl
> +popdef([host_cpu])dnl
> +popdef([host_alias])dnl
> +popdef([host])dnl
> +popdef([LDFLAGS])dnl
> +popdef([CPPFLAGS])dnl
> +popdef([CFLAGS])dnl
> +popdef([CPP])dnl
> +popdef([CC])dnl
> +popdef([ac_objext])dnl
> +popdef([ac_exeext])dnl
> +popdef([ac_cv_objext])dnl
> +popdef([ac_cv_exeext])dnl
> +popdef([ac_cv_prog_cc_g])dnl
> +popdef([ac_cv_prog_cc_cross])dnl
> +popdef([ac_cv_prog_cc_works])dnl
> +popdef([ac_cv_prog_gcc])dnl
> +popdef([ac_cv_prog_CPP])dnl
> +
> +dnl Finally, set Makefile variables
> +dnl
> +BUILD_EXEEXT=$ac_build_exeext
> +BUILD_OBJEXT=$ac_build_objext
> +AC_SUBST(BUILD_EXEEXT)dnl
> +AC_SUBST(BUILD_OBJEXT)dnl
> +AC_SUBST([CFLAGS_FOR_BUILD])dnl
> +AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
> +AC_SUBST([LDFLAGS_FOR_BUILD])dnl
> +])
> --
> 1.8.4
>
Thierry Reding Sept. 9, 2013, 11:43 a.m. UTC | #2
On Mon, Sep 09, 2013 at 12:48:08PM +0200, David Herrmann wrote:
> Hi
> 
> On Mon, Sep 9, 2013 at 12:27 PM, Thierry Reding
> <thierry.reding@gmail.com> wrote:
> > The genshader and genunifont utilities are run during the build process
> > to generate source files. In order for that to work when cross-compiling
> > the files need to be built using the native compiler instead of the
> > cross-compiler.
> >
> > Add the AX_PROG_CC_FOR_BUILD m4 macro which defines various *_FOR_BUILD
> > variables that are the native equivalents of CC, CFLAGS, LDFLAGS, etc.
> > Override CC, CFLAGS and LDFLAGS for genshader and genunifont and their
> > object files so that they will be built natively and can be executed
> > during the build.
> 
> Thanks a lot! Looks all good, few comments below. I think I will apply
> it as is, anyway. New bugfix-release is planned for this week, too.
> 
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> >  Makefile.am                |  16 ++++--
> >  configure.ac               |   3 +-
> >  m4/ax_prog_cc_for_build.m4 | 125 +++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 139 insertions(+), 5 deletions(-)
> >  create mode 100644 m4/ax_prog_cc_for_build.m4
> >
> > diff --git a/Makefile.am b/Makefile.am
> > index 7019290..f1b4435 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -445,8 +445,12 @@ EXTRA_DIST += $(SHADERS)
> >  CLEANFILES += src/static_shaders.c
> >  genshader_SOURCES = src/genshader.c
> >
> > -src/static_shaders.c: $(SHADERS) genshader$(EXEEXT)
> > -       $(AM_V_GEN)./genshader$(EXEEXT) src/static_shaders.c $(SHADERS)
> > +src/static_shaders.c: $(SHADERS) genshader$(BUILD_EXEEXT)
> > +       $(AM_V_GEN)./genshader$(BUILD_EXEEXT) src/static_shaders.c $(SHADERS)
> > +
> > +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CC = $(CC_FOR_BUILD)
> > +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
> > +genshader$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
> 
> Just wondering, isn't this going to break if $BUILD_EXEEXT != $EXEEXT
> I mean, noinst_PROGRAMS generates build-rules for $EXEEXT, not for
> $BUILD_EXEEXT, so a dependency on "genshader$(BUILD_EXEEXT)" won't do
> anything if it differs from $EXEEXT. But maybe I am just missing
> something and automake creates rules for both?

That's a good point. And yes, I think it would break if both extensions
differed. On the other hand I have no idea on how to make automake
generate rules for $(BUILD_EXEEXT). I don't think it can.

Interestingly, I mistakenly used genshader$(EXEEXT) initially, but that
causes automake to spew out warnings that these "rules" (which aren't
really rules at all) were overriding previous commands for the same
target. So while $(BUILD_EXEEXT) is the right extension to use, it also
works around a shortcoming in automake. Another shortcoming of automake
will cause this to break when doing MinGW->Unix and Unix->MinGW cross-
builds...

A different approach of this patch was to move genshader and genunifont
to a tools subdirectory with a separate Makefile.am and overwrite the
CC, CFLAGS and LDFLAGS variables in that directory only, but automake
doesn't accept that either because CFLAGS is considered a user variable
and therefore can't be overwritten.

I think this is as good as it gets for now. I've tried to fix this kind
of problem in automake several times but never managed to. Perhaps it's
time to move on to something like SCons...

Thierry
David Herrmann Sept. 12, 2013, 11:41 a.m. UTC | #3
Hi

On Mon, Sep 9, 2013 at 1:43 PM, Thierry Reding <thierry.reding@gmail.com> wrote:
> On Mon, Sep 09, 2013 at 12:48:08PM +0200, David Herrmann wrote:
>> Hi
>>
>> On Mon, Sep 9, 2013 at 12:27 PM, Thierry Reding
>> <thierry.reding@gmail.com> wrote:
>> > The genshader and genunifont utilities are run during the build process
>> > to generate source files. In order for that to work when cross-compiling
>> > the files need to be built using the native compiler instead of the
>> > cross-compiler.
>> >
>> > Add the AX_PROG_CC_FOR_BUILD m4 macro which defines various *_FOR_BUILD
>> > variables that are the native equivalents of CC, CFLAGS, LDFLAGS, etc.
>> > Override CC, CFLAGS and LDFLAGS for genshader and genunifont and their
>> > object files so that they will be built natively and can be executed
>> > during the build.
>>
>> Thanks a lot! Looks all good, few comments below. I think I will apply
>> it as is, anyway. New bugfix-release is planned for this week, too.
>>
>> > Signed-off-by: Thierry Reding <treding@nvidia.com>
>> > ---
>> >  Makefile.am                |  16 ++++--
>> >  configure.ac               |   3 +-
>> >  m4/ax_prog_cc_for_build.m4 | 125 +++++++++++++++++++++++++++++++++++++++++++++
>> >  3 files changed, 139 insertions(+), 5 deletions(-)
>> >  create mode 100644 m4/ax_prog_cc_for_build.m4
>> >
>> > diff --git a/Makefile.am b/Makefile.am
>> > index 7019290..f1b4435 100644
>> > --- a/Makefile.am
>> > +++ b/Makefile.am
>> > @@ -445,8 +445,12 @@ EXTRA_DIST += $(SHADERS)
>> >  CLEANFILES += src/static_shaders.c
>> >  genshader_SOURCES = src/genshader.c
>> >
>> > -src/static_shaders.c: $(SHADERS) genshader$(EXEEXT)
>> > -       $(AM_V_GEN)./genshader$(EXEEXT) src/static_shaders.c $(SHADERS)
>> > +src/static_shaders.c: $(SHADERS) genshader$(BUILD_EXEEXT)
>> > +       $(AM_V_GEN)./genshader$(BUILD_EXEEXT) src/static_shaders.c $(SHADERS)
>> > +
>> > +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CC = $(CC_FOR_BUILD)
>> > +genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
>> > +genshader$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
>>
>> Just wondering, isn't this going to break if $BUILD_EXEEXT != $EXEEXT
>> I mean, noinst_PROGRAMS generates build-rules for $EXEEXT, not for
>> $BUILD_EXEEXT, so a dependency on "genshader$(BUILD_EXEEXT)" won't do
>> anything if it differs from $EXEEXT. But maybe I am just missing
>> something and automake creates rules for both?
>
> That's a good point. And yes, I think it would break if both extensions
> differed. On the other hand I have no idea on how to make automake
> generate rules for $(BUILD_EXEEXT). I don't think it can.
>
> Interestingly, I mistakenly used genshader$(EXEEXT) initially, but that
> causes automake to spew out warnings that these "rules" (which aren't
> really rules at all) were overriding previous commands for the same
> target. So while $(BUILD_EXEEXT) is the right extension to use, it also
> works around a shortcoming in automake. Another shortcoming of automake
> will cause this to break when doing MinGW->Unix and Unix->MinGW cross-
> builds...
>
> A different approach of this patch was to move genshader and genunifont
> to a tools subdirectory with a separate Makefile.am and overwrite the
> CC, CFLAGS and LDFLAGS variables in that directory only, but automake
> doesn't accept that either because CFLAGS is considered a user variable
> and therefore can't be overwritten.
>
> I think this is as good as it gets for now. I've tried to fix this kind
> of problem in automake several times but never managed to. Perhaps it's
> time to move on to something like SCons...

Yepp, automake has issues but it's still better than the alternatives,
imho. Patch is applied and pushed. I only added a small TODO-comment
so I don't forget about this issue. I don't have any better idea right
now.

Btw., there's kmscon-devel@lists.<fdo> (which is an open list and
doesn't require registration).

Thanks
David
diff mbox

Patch

diff --git a/Makefile.am b/Makefile.am
index 7019290..f1b4435 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -445,8 +445,12 @@  EXTRA_DIST += $(SHADERS)
 CLEANFILES += src/static_shaders.c
 genshader_SOURCES = src/genshader.c
 
-src/static_shaders.c: $(SHADERS) genshader$(EXEEXT)
-	$(AM_V_GEN)./genshader$(EXEEXT) src/static_shaders.c $(SHADERS)
+src/static_shaders.c: $(SHADERS) genshader$(BUILD_EXEEXT)
+	$(AM_V_GEN)./genshader$(BUILD_EXEEXT) src/static_shaders.c $(SHADERS)
+
+genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CC = $(CC_FOR_BUILD)
+genshader$(BUILD_EXEEXT) $(genshader_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
+genshader$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
 
 #
 # Unifont Generator
@@ -461,8 +465,12 @@  EXTRA_DIST += $(UNIFONT)
 CLEANFILES += $(UNIFONT_BIN)
 genunifont_SOURCES = src/genunifont.c
 
-$(UNIFONT_BIN): $(UNIFONT) genunifont$(EXEEXT)
-	$(AM_V_GEN)./genunifont$(EXEEXT) $(UNIFONT_BIN) $(UNIFONT)
+genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CC = $(CC_FOR_BUILD)
+genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
+genunifont$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
+
+$(UNIFONT_BIN): $(UNIFONT) genunifont$(BUILD_EXEEXT)
+	$(AM_V_GEN)./genunifont$(BUILD_EXEEXT) $(UNIFONT_BIN) $(UNIFONT)
 
 #
 # Kmscon Modules
diff --git a/configure.ac b/configure.ac
index bf3c89c..b5d9513 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@  AC_CONFIG_HEADER(config.h)
 AC_USE_SYSTEM_EXTENSIONS
 AC_SYS_LARGEFILE
 AC_PREFIX_DEFAULT([/usr])
-AC_CANONICAL_HOST
+AC_CANONICAL_SYSTEM
 
 AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects dist-xz no-dist-gzip tar-pax -Wall -Werror -Wno-portability])
 AM_SILENT_RULES([yes])
@@ -31,6 +31,7 @@  AM_SILENT_RULES([yes])
 : ${CFLAGS=""}
 
 AC_PROG_CC
+AX_PROG_CC_FOR_BUILD
 AC_PROG_CC_C99
 AM_PROG_CC_C_O
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
new file mode 100644
index 0000000..6369809
--- /dev/null
+++ b/m4/ax_prog_cc_for_build.m4
@@ -0,0 +1,125 @@ 
+# ===========================================================================
+#   http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_PROG_CC_FOR_BUILD
+#
+# DESCRIPTION
+#
+#   This macro searches for a C compiler that generates native executables,
+#   that is a C compiler that surely is not a cross-compiler. This can be
+#   useful if you have to generate source code at compile-time like for
+#   example GCC does.
+#
+#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
+#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
+#   The value of these variables can be overridden by the user by specifying
+#   a compiler with an environment variable (like you do for standard CC).
+#
+#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
+#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
+#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
+#   substituted in the Makefile.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 5
+
+AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
+AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+AC_REQUIRE([AC_CANONICAL_SYSTEM])dnl
+
+dnl Use the standard macros, but make them use other variable names
+dnl
+pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
+pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
+pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
+pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
+pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
+pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
+pushdef([ac_cv_objext], ac_cv_build_objext)dnl
+pushdef([ac_exeext], ac_build_exeext)dnl
+pushdef([ac_objext], ac_build_objext)dnl
+pushdef([CC], CC_FOR_BUILD)dnl
+pushdef([CPP], CPP_FOR_BUILD)dnl
+pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
+pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
+pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
+pushdef([host], build)dnl
+pushdef([host_alias], build_alias)dnl
+pushdef([host_cpu], build_cpu)dnl
+pushdef([host_vendor], build_vendor)dnl
+pushdef([host_os], build_os)dnl
+pushdef([ac_cv_host], ac_cv_build)dnl
+pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
+pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
+pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
+pushdef([ac_cv_host_os], ac_cv_build_os)dnl
+pushdef([ac_cpp], ac_build_cpp)dnl
+pushdef([ac_compile], ac_build_compile)dnl
+pushdef([ac_link], ac_build_link)dnl
+
+save_cross_compiling=$cross_compiling
+save_ac_tool_prefix=$ac_tool_prefix
+cross_compiling=no
+ac_tool_prefix=
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_EXEEXT
+
+ac_tool_prefix=$save_ac_tool_prefix
+cross_compiling=$save_cross_compiling
+
+dnl Restore the old definitions
+dnl
+popdef([ac_link])dnl
+popdef([ac_compile])dnl
+popdef([ac_cpp])dnl
+popdef([ac_cv_host_os])dnl
+popdef([ac_cv_host_vendor])dnl
+popdef([ac_cv_host_cpu])dnl
+popdef([ac_cv_host_alias])dnl
+popdef([ac_cv_host])dnl
+popdef([host_os])dnl
+popdef([host_vendor])dnl
+popdef([host_cpu])dnl
+popdef([host_alias])dnl
+popdef([host])dnl
+popdef([LDFLAGS])dnl
+popdef([CPPFLAGS])dnl
+popdef([CFLAGS])dnl
+popdef([CPP])dnl
+popdef([CC])dnl
+popdef([ac_objext])dnl
+popdef([ac_exeext])dnl
+popdef([ac_cv_objext])dnl
+popdef([ac_cv_exeext])dnl
+popdef([ac_cv_prog_cc_g])dnl
+popdef([ac_cv_prog_cc_cross])dnl
+popdef([ac_cv_prog_cc_works])dnl
+popdef([ac_cv_prog_gcc])dnl
+popdef([ac_cv_prog_CPP])dnl
+
+dnl Finally, set Makefile variables
+dnl
+BUILD_EXEEXT=$ac_build_exeext
+BUILD_OBJEXT=$ac_build_objext
+AC_SUBST(BUILD_EXEEXT)dnl
+AC_SUBST(BUILD_OBJEXT)dnl
+AC_SUBST([CFLAGS_FOR_BUILD])dnl
+AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
+AC_SUBST([LDFLAGS_FOR_BUILD])dnl
+])