On Thu, 17 Jan 2013 13:00:44 +0000 Simon Marlow <[email protected]> wrote:
> Cross-compilers please take note:
>
> On 17/01/13 12:57, Simon Marlow wrote:
>
> > Before
> > ------
> >
> > To build a cross-compiler:
> > ./configure --target=<..>
> >
> > To compile a foreign GHC:
> > ./configure --host=<..> --target=<..>
> >
> > Now
> > ---
> >
> > To build a cross-compiler:
> > ./configure --target=<..>
> > And set "Stage1Only=YES" in mk/build.mk
> >
> > To compile a foreign GHC:
> > ./configure --target=<..>
>
> Cheers,
> Simon
Looks great!
Tried a while ago with the following setup:
* --tagret=ia64-unknown-linux-gnu
* "Stage1Only=YES"
* host compiler is ghc-7.6.1 (unregisterised build)
to get real cross-compiler and found out the following issues:
mkGmpDerivedConstants is built for target and ran on host
[attached patches for it]
make install fails as it 'forgets' to install proper ghc-pkg in
$(${cross}-ghc --print-libdir)/bin/
But the resulting cross-compiler was able to build working hello world!
--
Sergei
From 64c14611b0907a672d97cb390c527e7ab9acb16f Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich <[email protected]> Date: Thu, 24 Jan 2013 01:36:21 +0300 Subject: [PATCH] integer-gmp: improve cross-compiling support GmpDerivedConstants.h Before the patch GmpDerivedConstants.h was generated by running mkGmpDerivedConstants on target. Now it's generated only with help of autoconf macros. Tested on --target=ia64-unknown-linux-gnu. Signed-off-by: Sergei Trofimovich <[email protected]> --- .gitignore | 1 - cbits/mkGmpDerivedConstants.c | 74 ---------------------------------------- cbits/GmpDerivedConstants.h.in | 10 ++++++ configure.ac | 28 ++++++++++++--- gmp/ghc.mk | 8 ----- 5 files changed, 34 insertions(+), 87 deletions(-) delete mode 100644 cbits/mkGmpDerivedConstants.c create mode 100644 cbits/GmpDerivedConstants.h.in diff --git a/.gitignore b/.gitignore index 012224d..56857e9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,3 @@ ghc.mk gmp/config.mk integer-gmp.buildinfo cbits/GmpDerivedConstants.h -cbits/mkGmpDerivedConstants diff --git a/cbits/mkGmpDerivedConstants.c b/cbits/mkGmpDerivedConstants.c deleted file mode 100644 index ed07111..0000000 --- a/cbits/mkGmpDerivedConstants.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -------------------------------------------------------------------------- - * - * (c) The GHC Team, 1992-2004 - * - * mkDerivedConstants.c - * - * Basically this is a C program that extracts information from the C - * declarations in the header files (primarily struct field offsets) - * and generates a header file that can be #included into non-C source - * containing this information. - * - * ------------------------------------------------------------------------*/ - -#include <stdio.h> -#include "gmp.h" - - -#define str(a,b) #a "_" #b - -#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field)) - -/* struct_size(TYPE) - * - */ -#define def_size(str, size) \ - printf("#define SIZEOF_" str " %lu\n", (unsigned long)size); - -#define struct_size(s_type) \ - def_size(#s_type, sizeof(s_type)); - - - -/* struct_field(TYPE, FIELD) - * - */ -#define def_offset(str, offset) \ - printf("#define OFFSET_" str " %d\n", (int)(offset)); - -#define field_offset_(str, s_type, field) \ - def_offset(str, OFFSET(s_type,field)); - -#define field_offset(s_type, field) \ - field_offset_(str(s_type,field),s_type,field); - -#define field_type_(str, s_type, field) \ - printf("#define REP_" str " b"); \ - printf("%lu\n", (unsigned long)sizeof (__typeof__(((((s_type*)0)->field)))) * 8); - -#define field_type(s_type, field) \ - field_type_(str(s_type,field),s_type,field); - -/* An access macro for use in C-- sources. */ -#define struct_field_macro(str) \ - printf("#define " str "(__ptr__) REP_" str "[__ptr__+OFFSET_" str "]\n"); - -/* Outputs the byte offset and MachRep for a field */ -#define struct_field(s_type, field) \ - field_offset(s_type, field); \ - field_type(s_type, field); \ - struct_field_macro(str(s_type,field)) - - -int -main(int argc, char *argv[]) -{ - printf("/* This file is created automatically. Do not edit by hand.*/\n\n"); - - struct_size(MP_INT); - struct_field(MP_INT,_mp_alloc); - struct_field(MP_INT,_mp_size); - struct_field(MP_INT,_mp_d); - - return 0; -} diff --git a/cbits/GmpDerivedConstants.h.in b/cbits/GmpDerivedConstants.h.in new file mode 100644 index 0000000..241372f --- /dev/null +++ b/cbits/GmpDerivedConstants.h.in @@ -0,0 +1,10 @@ +#define SIZEOF_MP_INT @SIZEOF_MP_INT@ +#define OFFSET_MP_INT__mp_alloc @OFFSET_MP_INT__mp_alloc@ +#define REP_MP_INT__mp_alloc b@REP_MP_INT__mp_alloc@ +#define MP_INT__mp_alloc(__ptr__) REP_MP_INT__mp_alloc[__ptr__+OFFSET_MP_INT__mp_alloc] +#define OFFSET_MP_INT__mp_size @OFFSET_MP_INT__mp_size@ +#define REP_MP_INT__mp_size b@REP_MP_INT__mp_size@ +#define MP_INT__mp_size(__ptr__) REP_MP_INT__mp_size[__ptr__+OFFSET_MP_INT__mp_size] +#define OFFSET_MP_INT__mp_d @OFFSET_MP_INT__mp_d@ +#define REP_MP_INT__mp_d b@REP_MP_INT__mp_d@ +#define MP_INT__mp_d(__ptr__) REP_MP_INT__mp_d[__ptr__+OFFSET_MP_INT__mp_d] diff --git a/configure.ac b/configure.ac index b6a8003..aeb1f86 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,5 @@ AC_INIT([Haskell integer (GMP)], [0.1], [[email protected]], [integer]) -# Safety check: Ensure that we are in the correct source directory. -AC_CONFIG_SRCDIR([cbits/mkGmpDerivedConstants.c]) - AC_CANONICAL_TARGET AC_ARG_WITH([cc], @@ -71,7 +68,30 @@ AC_SUBST(GMP_FRAMEWORK) AC_SUBST(HaveLibGmp) AC_SUBST(HaveFrameworkGMP) -AC_CONFIG_FILES([integer-gmp.buildinfo gmp/config.mk]) +dnl GMP_INT_TO_CONST(int_expr, var_name) +AC_DEFUN([GMP_INT_TO_VAR], +[ + AC_MSG_CHECKING([for $1 size]) + AC_COMPUTE_INT([$2], [$1],[[#include <stdio.h> +#include <stddef.h> +#include "gmp.h" + +#define FIELD_OFFSET(s_type, field) offsetof(s_type, field) +#define FIELD_SIZE_BITS(s_type, field) (unsigned long)sizeof (__typeof__(((((s_type*)0)->field)))) * 8 +]], AC_MSG_ERROR([Failed to compute size of $1])) + AC_MSG_RESULT($$2) + AC_SUBST($2) +]) + +GMP_INT_TO_VAR([[sizeof (MP_INT)]], [SIZEOF_MP_INT]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_alloc)]], [OFFSET_MP_INT__mp_alloc]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_alloc)]], [REP_MP_INT__mp_alloc]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_size)]], [OFFSET_MP_INT__mp_size]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_size)]], [REP_MP_INT__mp_size]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_d)]], [OFFSET_MP_INT__mp_d]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_d)]], [REP_MP_INT__mp_d]) + +AC_CONFIG_FILES([integer-gmp.buildinfo gmp/config.mk cbits/GmpDerivedConstants.h]) dnl-------------------------------------------------------------------- dnl * Generate the header cbits/GmpDerivedConstants.h diff --git a/gmp/ghc.mk b/gmp/ghc.mk index 8c60e6f..2dc46f3 100644 --- a/gmp/ghc.mk +++ b/gmp/ghc.mk @@ -42,12 +42,6 @@ endif libraries/integer-gmp_CC_OPTS += $(addprefix -I,$(GMP_INCLUDE_DIRS)) libraries/integer-gmp_CC_OPTS += $(addprefix -L,$(GMP_LIB_DIRS)) -libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext): libraries/integer-gmp/cbits/mkGmpDerivedConstants.c - "$(CC_STAGE1)" $(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) $(libraries/integer-gmp_CC_OPTS) $< -o $@ - -libraries/integer-gmp/cbits/GmpDerivedConstants.h: libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext) - $< > $@ - # Compile GMP only if we don't have it already # # We use GMP's own configuration stuff, because it's all rather hairy @@ -82,8 +76,6 @@ ifneq "$(HaveLibGmp)" "YES" ifneq "$(HaveFrameworkGMP)" "YES" $(libraries/integer-gmp_dist-install_depfile_c_asm): libraries/integer-gmp/gmp/gmp.h -libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext): libraries/integer-gmp/gmp/gmp.h - libraries/integer-gmp_CC_OPTS += -I$(TOP)/libraries/integer-gmp/gmp libraries/integer-gmp_dist-install_EXTRA_OBJS += libraries/integer-gmp/gmp/objs/*.o -- 1.8.1.1
From 36695406b909655de8431231f0c8bcfa4bec69bf Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich <[email protected]> Date: Thu, 24 Jan 2013 02:04:23 +0300 Subject: [PATCH] ghc: mkGmpDerivedConstants binary gone away --- ghc.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/ghc.mk b/ghc.mk index cf01b31..fa21514 100644 --- a/ghc.mk +++ b/ghc.mk @@ -1230,7 +1230,6 @@ sdist_%: CLEAN_FILES += libraries/bootstrapping.conf CLEAN_FILES += libraries/integer-gmp/cbits/GmpDerivedConstants.h -CLEAN_FILES += libraries/integer-gmp/cbits/mkGmpDerivedConstants # These are no longer generated, but we still clean them for a while # as they may still be in old GHC trees: -- 1.8.1.1
signature.asc
Description: PGP signature
_______________________________________________ ghc-devs mailing list [email protected] http://www.haskell.org/mailman/listinfo/ghc-devs
