[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