[PATCH] Allow kmscon to be cross-compiled

David Herrmann dh.herrmann at gmail.com
Mon Sep 9 03:48:08 PDT 2013


Hi

On Mon, Sep 9, 2013 at 12:27 PM, Thierry Reding
<thierry.reding at 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 at 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 at 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
>


More information about the dri-devel mailing list