From 2b629781d74b5a7db1fff873ce5322e59a0f863a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 27 Aug 2006 16:25:07 -0700 Subject: [PATCH] Construct short architecture name from architecture signature. Map existing architecture signature to short architecture name at build time. This architecture name is (as yet) unused, but will be used to build per-architecture cache files with names made unique by including the architecture name. The auto-detected architecture name can be overridden with the --with-arch=ARCH configure option. --- Makefile.am | 2 +- configure.in | 17 +++++ fc-arch/Makefile.am | 50 +++++++++++++++ fc-arch/fc-arch.c | 144 ++++++++++++++++++++++++++++++++++++++++++ fc-arch/fcarch.tmpl.h | 32 ++++++++++ 5 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 fc-arch/Makefile.am create mode 100644 fc-arch/fc-arch.c create mode 100644 fc-arch/fcarch.tmpl.h diff --git a/Makefile.am b/Makefile.am index ee1eeca..90825ba 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 src \ +SUBDIRS=fontconfig fc-case fc-lang fc-glyphname fc-arch src \ fc-cache fc-cat fc-list fc-match conf.d $(DOCSRC) test EXTRA_DIST = \ diff --git a/configure.in b/configure.in index a3d2c77..7875831 100644 --- a/configure.in +++ b/configure.in @@ -132,6 +132,22 @@ 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 +fi + +ARCHITECTURE=$arch +AC_SUBST(ARCHITECTURE) + +dnl ========================================================================== + # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC @@ -539,6 +555,7 @@ fontconfig/Makefile fc-lang/Makefile fc-glyphname/Makefile fc-case/Makefile +fc-arch/Makefile src/Makefile src/fontconfig.def conf.d/Makefile diff --git a/fc-arch/Makefile.am b/fc-arch/Makefile.am new file mode 100644 index 0000000..60cd764 --- /dev/null +++ b/fc-arch/Makefile.am @@ -0,0 +1,50 @@ +# +# $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 Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL KEITH PACKARD 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} $(FREETYPE_CFLAGS) $(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 + +noinst_HEADERS=$(TARG) + +noinst_MANS=fc-arch.man + +EXTRA_DIST=$(TMPL) + +$(TARG):fc-arch${EXEEXT} $(STMPL) + rm -f $(TARG) + ./fc-arch${EXEEXT} $(ARCHITECTURE) < $(STMPL) > $(TARG) + +CLEANFILES=$(TARG) diff --git a/fc-arch/fc-arch.c b/fc-arch/fc-arch.c new file mode 100644 index 0000000..0179034 --- /dev/null +++ b/fc-arch/fc-arch.c @@ -0,0 +1,144 @@ +/* + * 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 + +#define ENDIAN_TEST 0x12345678 +#define MACHINE_SIGNATURE_SIZE (9*21 + 1) +#define MACHINE_ARCH_SIZE 32 +/* for when we don't have sysconf: */ +#define FC_HARDCODED_PAGESIZE 8192 + +static char * +FcCacheMachineSignature (void) +{ + static char buf[MACHINE_SIGNATURE_SIZE]; + int32_t magic = ENDIAN_TEST; + char * m = (char *)&magic; + + sprintf (buf, "%2x%2x%2x%2x_" + "%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x_" + "%08x_%08x_%08x_%08x_%08x_%08x_%08x_%08x", + m[0], m[1], m[2], m[3], + (unsigned int)sizeof (char), + (unsigned int)sizeof (char *), + (unsigned int)sizeof (int), + (unsigned int)sizeof (FcPattern), + (unsigned int)sizeof (FcPatternEltPtr), + (unsigned int)sizeof (struct FcPatternElt *), + (unsigned int)sizeof (FcPatternElt), + (unsigned int)sizeof (FcObjectPtr), + (unsigned int)sizeof (FcValueListPtr), + (unsigned int)sizeof (FcValue), + (unsigned int)sizeof (FcValueBinding), + (unsigned int)sizeof (struct FcValueList *), + (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), +#if defined (HAVE_SYSCONF) + (unsigned int)sysconf(_SC_PAGESIZE) +#else + (unsigned int)FC_HARDCODED_PAGESIZE +#endif + ); + + 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 |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 new file mode 100644 index 0000000..fe95e51 --- /dev/null +++ b/fc-arch/fcarch.tmpl.h @@ -0,0 +1,32 @@ +/* + * 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 Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD 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 +@@@ +@@@ name endian char char* int Pattern EltPtr Elt * Elt ObjPtr VLPtr Value Binding VL * CharSet Leaf** Char16 * Char16 Leaf Char32 Cache PageSize +x86 78563412_00000001_00000004_00000004_00000018_00000008_00000004_0000000c_00000004_00000008_0000000c_00000004_00000004_00000014_00000004_00000004_00000002_00000020_00000004_00000030_00001000 -- 2.39.5