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.
This commit is contained in:
Keith Packard 2006-08-27 16:25:07 -07:00
parent 199a922411
commit 2b629781d7
5 changed files with 244 additions and 1 deletions

View File

@ -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 = \

View File

@ -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

50
fc-arch/Makefile.am Normal file
View File

@ -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)

144
fc-arch/fc-arch.c Normal file
View File

@ -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 <ctype.h>
#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 <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));
}

32
fc-arch/fcarch.tmpl.h Normal file
View File

@ -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