diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2010-12-28 00:59:19 -0600 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2010-12-28 01:22:34 -0600 |
commit | d1a0fca316ab8d9d61474028da54615e4d9f7540 (patch) | |
tree | 21381e6c1dfcf400369713d442c4ce9ba7b2f538 | |
parent | 2a6b235ff6d2750171e8dff7cfdfe3bccb0f630e (diff) |
Make fc-arch stuff cross-compiling-safe
Fixes:
Bug 32679 - fontconfig-2.8.0 does not cross compile
Bug 25462 - Cross-compilation doesn't work
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | configure.in | 64 | ||||
-rw-r--r-- | fc-arch/Makefile.am | 54 | ||||
-rw-r--r-- | fc-arch/fc-arch.c | 138 | ||||
-rw-r--r-- | fc-arch/fcarch.tmpl.h | 65 | ||||
-rw-r--r-- | fc-cache/fc-cache.c | 2 | ||||
-rw-r--r-- | fc-cat/fc-cat.c | 2 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/fcarch.c | 72 | ||||
-rw-r--r-- | src/fcarch.h | 71 | ||||
-rw-r--r-- | src/fccache.c | 3 | ||||
-rw-r--r-- | src/fcint.h | 4 |
12 files changed, 167 insertions, 316 deletions
diff --git a/Makefile.am b/Makefile.am index ce365058..7931717a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,7 +22,7 @@ # PERFORMANCE OF THIS SOFTWARE. DOCSRC=@DOCSRC@ -SUBDIRS=fontconfig fc-case fc-lang fc-glyphname fc-arch src \ +SUBDIRS=fontconfig fc-case fc-lang fc-glyphname src \ fc-cache fc-cat fc-list fc-match fc-pattern fc-query fc-scan \ conf.d $(DOCSRC) test diff --git a/configure.in b/configure.in index 0a7b1b0d..5d92b5f9 100644 --- a/configure.in +++ b/configure.in @@ -56,7 +56,7 @@ AC_SUBST(LIBT_CURRENT_MINUS_AGE) dnl ========================================================================== -AM_CONFIG_HEADER(config.h) +AC_CONFIG_HEADERS(config.h) AC_PROG_CC AC_PROG_INSTALL @@ -98,59 +98,12 @@ AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes) dnl ========================================================================== -# Setup for compiling build tools (fc-glyphname, etc) -AC_MSG_CHECKING([for a C compiler for build tools]) -if test $cross_compiling = yes; then - AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc) -else - CC_FOR_BUILD=$CC -fi -AC_MSG_RESULT([$CC_FOR_BUILD]) -AC_SUBST(CC_FOR_BUILD) - -AC_MSG_CHECKING([for suffix of executable build tools]) -if test $cross_compiling = yes; then - cat >conftest.c <<\_______EOF -int -main () -{ - exit (0); -} -_______EOF - for i in .exe ""; do - compile="$CC_FOR_BUILD conftest.c -o conftest$i" - if AC_TRY_EVAL(compile); then - if (./conftest) 2>&AC_FD_CC; then - EXEEXT_FOR_BUILD=$i - break - fi - fi - done - rm -f conftest* - if test "${EXEEXT_FOR_BUILD+set}" != set; then - AC_MSG_ERROR([Cannot determine suffix of executable build tools]) - fi -else - EXEEXT_FOR_BUILD=$EXEEXT -fi -AC_MSG_RESULT([$EXEEXT_FOR_BUILD]) -AC_SUBST(EXEEXT_FOR_BUILD) - -dnl ========================================================================== - AC_ARG_WITH(arch, [ --with-arch=ARCH Force architecture to ARCH], arch="$withval", arch=auto) -if test $cross_compiling = yes; then - case "$arch" in - auto) - AC_MSG_ERROR([Cannot autodetect architecture in cross compile environment] - [Use --with-arch=ARCH to specify architecture]) - ;; - esac +if test "x$arch" != xauto; then + AC_DEFINE_UNQUOTED([FC_ARCHITECTURE], "$arch", [Architecture prefix to use for cache file names]) fi -ARCHITECTURE=$arch -AC_SUBST(ARCHITECTURE) dnl ========================================================================== @@ -529,13 +482,20 @@ fi AC_SUBST(DOCSRC) AC_SUBST(DOCMAN3) + +dnl Figure out what cache format suffix to use for this architecture +AC_C_BIGENDIAN +AC_CHECK_SIZEOF([void *]) +AC_CHECK_ALIGNOF([double]) + + + AC_OUTPUT([ -Makefile +Makefile fontconfig/Makefile fc-lang/Makefile fc-glyphname/Makefile fc-case/Makefile -fc-arch/Makefile src/Makefile conf.d/Makefile fc-cache/Makefile diff --git a/fc-arch/Makefile.am b/fc-arch/Makefile.am deleted file mode 100644 index b1ecbf44..00000000 --- a/fc-arch/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -# -# $Id $ -# -# Copyright © 2003 Keith Packard -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of the author(s) not be used in -# advertising or publicity pertaining to distribution of the software without -# specific, written prior permission. The authors make no -# representations about the suitability of this software for any purpose. It -# is provided "as is" without express or implied warranty. -# -# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. -# - -CC = @CC_FOR_BUILD@ -EXEEXT = @EXEEXT_FOR_BUILD@ -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ - -INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS) - -TMPL=fcarch.tmpl.h -STMPL=${top_srcdir}/fc-arch/fcarch.tmpl.h -TARG=fcarch.h - -ARCHITECTURE=@ARCHITECTURE@ -.PRECIOUS: $(TARG) - -noinst_PROGRAMS=fc-arch - -EXTRA_DIST=$(TMPL) - -$(TARG):fc-arch${EXEEXT} $(STMPL) ${top_srcdir}/src/fcint.h ../config.h - $(AM_V_GEN) $(RM) $(TARG); \ - ./fc-arch${EXEEXT} $(ARCHITECTURE) < $(STMPL) > $(TARG).tmp && \ - mv $(TARG).tmp $(TARG) - -ALIAS_FILES = fcalias.h fcaliastail.h - -BUILT_SOURCES = $(ALIAS_FILES) $(TARG) - -$(ALIAS_FILES): - touch $(ALIAS_FILES) - -CLEANFILES=$(TARG) $(ALIAS_FILES) diff --git a/fc-arch/fc-arch.c b/fc-arch/fc-arch.c deleted file mode 100644 index 1ef0cf18..00000000 --- a/fc-arch/fc-arch.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © 2006 Keith Packard - * Copyright © 2005 Patrick Lam - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of the copyright holders not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no representations - * about the suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#include "fcint.h" -#include <ctype.h> - -#define ENDIAN_TEST 0x01020304 -#define MACHINE_SIGNATURE_SIZE 1024 - -static char * -FcCacheMachineSignature (void) -{ - static char buf[MACHINE_SIGNATURE_SIZE]; - int32_t magic = ENDIAN_TEST; - char * m = (char *)&magic; - - sprintf (buf, "%01x%01x%01x%01x_" - "%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_" - "%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x", - m[0], m[1], m[2], m[3], - (unsigned int)sizeof (FcAlign), - (unsigned int)sizeof (char), - (unsigned int)sizeof (char *), - (unsigned int)sizeof (int), - (unsigned int)sizeof (intptr_t), - (unsigned int)sizeof (FcPattern), - (unsigned int)sizeof (FcPatternEltPtr), - (unsigned int)sizeof (struct FcPatternElt *), - (unsigned int)sizeof (FcPatternElt), - (unsigned int)sizeof (FcObject), - (unsigned int)sizeof (FcValueListPtr), - (unsigned int)sizeof (FcValue), - (unsigned int)sizeof (FcValueBinding), - (unsigned int)sizeof (struct FcValueList *), - (unsigned int)sizeof (FcStrSet *), /* For FcLangSet */ - (unsigned int)sizeof (FcCharSet), - (unsigned int)sizeof (FcCharLeaf **), - (unsigned int)sizeof (FcChar16 *), - (unsigned int)sizeof (FcChar16), - (unsigned int)sizeof (FcCharLeaf), - (unsigned int)sizeof (FcChar32), - (unsigned int)sizeof (FcCache)); - - return buf; -} - -int -main (int argc, char **argv) -{ - static char line[1024]; - char *signature; - int signature_length; - char *space; - char *arch = NULL; - int lineno = 0; - - if (argc != 2) - fprintf (stderr, "Usage: %s <architecture>|auto < fcarch.tmpl.h > fcarch.h\n", - argv[0]); - arch = argv[1]; - /* - * Scan the input until the marker is found - */ - - while (fgets (line, sizeof (line), stdin)) - { - lineno++; - if (!strncmp (line, "@@@", 3)) - break; - fputs (line, stdout); - } - signature = FcCacheMachineSignature(); - signature_length = strlen (signature); - - if (strcmp (arch, "auto") == 0) - { - arch = NULL; - /* - * Search for signature - */ - while (fgets (line, sizeof (line), stdin)) - { - lineno++; - /* - * skip comments - */ - if (!strncmp (line, "@@@", 3)) - continue; - space = line; - while (*space && !isspace (*space)) - space++; - if (!space) - { - fprintf (stderr, "%s: malformed input on line %d\n", - argv[0], lineno); - exit (1); - } - *space++ = '\0'; - while (isspace (*space)) - space++; - if (!strncmp (space, signature, signature_length)) - { - arch = line; - break; - } - } - } - if (!arch) - { - fprintf (stderr, "%s: unknown signature \"%s\"\n", argv[0], signature); - fprintf (stderr, "\tPlease update fcarch.tmpl.h and rebuild\n"); - exit (1); - } - printf ("#define FC_ARCHITECTURE \"%s\"\n", arch); - fflush (stdout); - exit (ferror (stdout)); -} - diff --git a/fc-arch/fcarch.tmpl.h b/fc-arch/fcarch.tmpl.h deleted file mode 100644 index 2f972ba4..00000000 --- a/fc-arch/fcarch.tmpl.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright © 2006 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of the author(s) not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. The authors make no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -@@@ -@@@ Each unique machine architecture needs an entry in this file -@@@ If fc-arch runs and doesn't find a matching entry, it will print -@@@ out the archtecture signature in the error message. Take that -@@@ signature and place it in this file along with a suitable architecture -@@@ name. Architecture names are used to construct file names, so -@@@ use something reasonable and don't include any spaces -@@@ -@@@ So far the differences boil down to: endianness, 32 vs 64 bit pointers, -@@@ and on 32bit ones, whether double is aligned to one word or two words. -@@@ Those result in the 6 formats listed below. -@@@ -@@@ ,name (endianness,pointer-size,double-alignment) -@@@ | ,endian -@@@ | | ,FcAlign -@@@ | | | ,char -@@@ | | | | ,char* -@@@ | | | | | ,int -@@@ | | | | | | ,intptr_t -@@@ | | | | | | | ,Pattern -@@@ | | | | | | | | ,EltPtr -@@@ | | | | | | | | | ,Elt * -@@@ | | | | | | | | | | ,Elt -@@@ | | | | | | | | | | | ,ObjPtr -@@@ | | | | | | | | | | | | ,ValueListPtr -@@@ | | | | | | | | | | | | | ,Value -@@@ | | | | | | | | | | | | | | ,ValueBinding -@@@ | | | | | | | | | | | | | | | ,ValueList * -@@@ | | | | | | | | | | | | | | | | ,StrSet * -@@@ | | | | | | | | | | | | | | | | | ,CharSet -@@@ | | | | | | | | | | | | | | | | | | ,CharLeaf ** -@@@ | | | | | | | | | | | | | | | | | | | ,Char16 * -@@@ | | | | | | | | | | | | | | | | | | | | ,Char16 -@@@ | | | | | | | | | | | | | | | | | | | | | ,CharLeaf -@@@ | | | | | | | | | | | | | | | | | | | | | | ,Char32 -@@@ | | | | | | | | | | | | | | | | | | | | | | | ,Cache -@@@ | | | | | | | | | | | | | | | | | | | | | | | | -le32d4 4321_08_01_04_04_04_10_04_04_08_04_04_0c_04_04_04_10_04_04_02_20_04_20 -le32d8 4321_08_01_04_04_04_10_04_04_08_04_04_10_04_04_04_10_04_04_02_20_04_20 -le64 4321_08_01_08_04_08_18_08_08_10_04_08_10_04_08_08_18_08_08_02_20_04_38 -be32d4 1234_08_01_04_04_04_10_04_04_08_04_04_0c_04_04_04_10_04_04_02_20_04_20 -be32d8 1234_08_01_04_04_04_10_04_04_08_04_04_10_04_04_04_10_04_04_02_20_04_20 -be64 1234_08_01_08_04_08_18_08_08_10_04_08_10_04_08_08_18_08_08_02_20_04_38 diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c index a0da50e5..d2653507 100644 --- a/fc-cache/fc-cache.c +++ b/fc-cache/fc-cache.c @@ -22,7 +22,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include "../fc-arch/fcarch.h" +#include "../src/fcarch.h" #ifdef HAVE_CONFIG_H #include <config.h> diff --git a/fc-cat/fc-cat.c b/fc-cat/fc-cat.c index 40c38c48..c6c39934 100644 --- a/fc-cat/fc-cat.c +++ b/fc-cat/fc-cat.c @@ -32,7 +32,7 @@ #endif #include <fontconfig/fontconfig.h> -#include "../fc-arch/fcarch.h" +#include "../src/fcarch.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/Makefile.am b/src/Makefile.am index 59b9c75b..e300fe94 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -84,13 +84,12 @@ noinst_HEADERS=fcint.h fcftint.h fcdeprecate.h ALIAS_FILES = fcalias.h fcaliastail.h fcftalias.h fcftaliastail.h BUILT_SOURCES = $(ALIAS_FILES) \ - ../fc-arch/fcarch.h \ ../fc-case/fccase.h \ ../fc-glyphname/fcglyphname.h \ ../fc-lang/fclang.h -../fc-arch/fcarch.h: - cd ../fc-arch && $(MAKE) $(AM_MAKEFLAGS) fcarch.h +noinst_PROGRAMS = fcarch + ../fc-case/fccase.h: cd ../fc-case && $(MAKE) $(AM_MAKEFLAGS) fccase.h ../fc-glyphname/fcglyphname.h: @@ -99,6 +98,7 @@ BUILT_SOURCES = $(ALIAS_FILES) \ cd ../fc-lang && $(MAKE) $(AM_MAKEFLAGS) fclang.h libfontconfig_la_SOURCES = \ + fcarch.h \ fcatomic.c \ fcblanks.c \ fccache.c \ diff --git a/src/fcarch.c b/src/fcarch.c new file mode 100644 index 00000000..36d0ce5c --- /dev/null +++ b/src/fcarch.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the author(s) not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The authors make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include <stdio.h> + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +/* If architecture is hardcoded, skip the assert tests */ + +#ifndef FC_ARCHITECTURE + +#include "fcarch.h" + +/* Make sure the cache structure is consistent with what we expect */ + +#include "fcint.h" + +FC_ASSERT_STATIC (1 == sizeof (char)); +FC_ASSERT_STATIC (2 == sizeof (FcChar16)); +FC_ASSERT_STATIC (4 == sizeof (int)); +FC_ASSERT_STATIC (4 == sizeof (FcChar32)); +FC_ASSERT_STATIC (4 == sizeof (FcObject)); +FC_ASSERT_STATIC (4 == sizeof (FcValueBinding)); +FC_ASSERT_STATIC (8 == sizeof (FcAlign)); +FC_ASSERT_STATIC (0x20 == sizeof (FcCharLeaf)); + +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (intptr_t)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcPatternEltPtr)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcValueListPtr)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (char *)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (struct FcPatternElt *)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcValueList *)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcStrSet *)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcCharLeaf **)); +FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcChar16 *)); + +FC_ASSERT_STATIC (0x08 + 1*SIZEOF_VOID_P == sizeof (FcValue)); +FC_ASSERT_STATIC (0x00 + 2*SIZEOF_VOID_P == sizeof (FcPatternElt)); +FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcPattern)); +FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcCharSet)); +FC_ASSERT_STATIC (0x08 + 6*SIZEOF_VOID_P == sizeof (FcCache)); + +#endif + + +int +main (int argc, char **argv) +{ + printf ("%s\n", FC_ARCHITECTURE); + return 0; +} diff --git a/src/fcarch.h b/src/fcarch.h new file mode 100644 index 00000000..0c8cd053 --- /dev/null +++ b/src/fcarch.h @@ -0,0 +1,71 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2010 Behdad Esfahbod + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the author(s) not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The authors make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +#ifndef _FCARCH_H_ +#define _FCARCH_H_ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +/* + * Each unique machine architecture needs an entry in this file + * So far the differences boil down to: endianness, 32 vs 64 bit pointers, + * and on 32bit ones, whether double is aligned to one word or two words. + * Those result in the 6 formats listed below. + * + * If any of the assertion errors in fccache.c fail, you need to add a new + * architecture. Contact the fontconfig mailing list in that case. + * + * name endianness pointer-size double-alignment + * + * le32d4 4321 4 4 + * le32d8 4321 4 8 + * le64 4321 8 8 + * be32d4 1234 4 4 + * be32d8 1234 4 8 + * be64 1234 8 8 + */ + +#if defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN +# define FC_ARCH_ENDIAN "be" +#else /* !WORDS_BIGENDIAN */ +# define FC_ARCH_ENDIAN "le" +#endif + +#if SIZEOF_VOID_P == 4 +# if ALIGNOF_DOUBLE == 4 +# define FC_ARCH_SIZE_ALIGN "32d4" +# else /* ALIGNOF_DOUBLE != 4 */ +# define FC_ARCH_SIZE_ALIGN "32d8" +# endif +#else /* SIZEOF_VOID_P != 4 */ +# define FC_ARCH_SIZE_ALIGN "64" +#endif + +#ifdef ARCHITECTURE +# define ARCHITECTURE FC_ARCHITECTURE +#else +# define FC_ARCHITECTURE FC_ARCH_ENDIAN FC_ARCH_SIZE_ALIGN +#endif + +#endif /* _FCARCH_H_ */ diff --git a/src/fccache.c b/src/fccache.c index d557d340..1bbd7997 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -22,7 +22,7 @@ */ #include "fcint.h" -#include "../fc-arch/fcarch.h" +#include "fcarch.h" #include <stdio.h> #include <fcntl.h> #include <dirent.h> @@ -41,6 +41,7 @@ #define O_BINARY 0 #endif + struct MD5Context { FcChar32 buf[4]; FcChar32 bits[2]; diff --git a/src/fcint.h b/src/fcint.h index 2bc7878c..a8599138 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -107,6 +107,10 @@ #define FC_MEM_NUM 30 +#define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1] +#define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond)) +#define FC_ASSERT_STATIC(_cond) _FC_ASSERT_STATIC0 (__LINE__, (_cond)) + #define FC_MIN(a,b) ((a) < (b) ? (a) : (b)) #define FC_MAX(a,b) ((a) > (b) ? (a) : (b)) #define FC_ABS(a) ((a) < 0 ? -(a) : (a)) |