/* * ckconfig.c * * Copyright (C) 1991, 1992, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. */ /* * This program is intended to help you determine how to configure the JPEG * software for installation on a particular system. The idea is to try to * compile and execute this program. If your compiler fails to compile the * program, make changes as indicated in the comments below. Once you can * compile the program, run it, and it will tell you how to set the various * switches in jconfig.h and in your Makefile. * * This could all be done automatically if we could assume we were on a Unix * system, but we don't want to assume that, so you'll have to edit and * recompile this program until it works. * * As a general rule, each time you try to compile this program, * pay attention only to the *first* error message you get from the compiler. * Many C compilers will issue lots of spurious error messages once they * have gotten confused. Go to the line indicated in the first error message, * and read the comments preceding that line to see what to change. * * Almost all of the edits you may need to make to this program consist of * changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL", * or vice versa. This is called defining or undefining that symbol. */ /* First we must see if your system has the include files we need. * We start out with the assumption that your system follows the ANSI * conventions for include files. If you get any error in the next dozen * lines, undefine INCLUDES_ARE_ANSI. */ #define INCLUDES_ARE_ANSI /* replace 'define' by 'undef' if error here */ #ifdef INCLUDES_ARE_ANSI /* this will be skipped if you undef... */ #include /* If you ain't got this, you ain't got C. */ #ifdef __SASC /* Amiga SAS C provides size_t in stddef.h. */ #include /* (They are wrong...) */ #endif #include /* size_t might be here too. */ typedef size_t my_size_t; /* The payoff: do we have size_t now? */ #include /* Check other ANSI includes we use. */ #endif /* If your system doesn't follow the ANSI conventions, we have to figure out * what it does follow. If you didn't get an error before this line, you can * ignore everything down to "#define HAVE_ANSI_DEFINITIONS". */ #ifndef INCLUDES_ARE_ANSI /* skip these tests if INCLUDES_ARE_ANSI */ #include /* If you ain't got this, you ain't got C. */ /* jinclude.h will try to include if you don't set * INCLUDES_ARE_ANSI. We need to test whether that include file is provided. * If you get an error here, undefine HAVE_TYPES_H. */ #define HAVE_TYPES_H #ifdef HAVE_TYPES_H #include #endif /* We have to see if your string functions are defined by * strings.h (BSD convention) or string.h (everybody else). * We try the non-BSD convention first; define BSD if the compiler * says it can't find string.h. */ #undef BSD #ifdef BSD #include #else #include #endif /* Usually size_t is defined in stdio.h, sys/types.h, and/or string.h. * If not, you'll get an error on the "typedef size_t my_size_t;" line below. * In that case, you'll have to search through your system library to * figure out which include file defines "size_t". Look for a line that * says "typedef something-or-other size_t;" (stddef.h and stdlib.h are * good places to look first). Then, change the line below that says * "#include " to instead include the file * you found size_t in, and define NEED_SPECIAL_INCLUDE. */ #undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */ #ifdef NEED_SPECIAL_INCLUDE #include #endif typedef size_t my_size_t; /* The payoff: do we have size_t now? */ #endif /* INCLUDES_ARE_ANSI */ /* The next question is whether your compiler supports ANSI-style function * definitions. You need to know this in order to choose between using * makefile.ansi and using makefile.unix. * The #define line below is set to assume you have ANSI function definitions. * If you get an error in this group of lines, undefine HAVE_ANSI_DEFINITIONS. */ #define HAVE_ANSI_DEFINITIONS #ifdef HAVE_ANSI_DEFINITIONS int testfunction (int arg1, int * arg2); /* check prototypes */ struct methods_struct { /* check method-pointer declarations */ int (*error_exit) (char *msgtext); int (*trace_message) (char *msgtext); int (*another_method) (void); }; int testfunction (int arg1, int * arg2) /* check definitions */ { return arg2[arg1]; } int testfunction1 (void) /* check void arg list */ { return 0; } #endif /* Now we want to find out if your compiler knows what "unsigned char" means. * If you get an error on the "unsigned char un_char;" line, * then undefine HAVE_UNSIGNED_CHAR. */ #define HAVE_UNSIGNED_CHAR #ifdef HAVE_UNSIGNED_CHAR unsigned char un_char; #endif /* Now we want to find out if your compiler knows what "unsigned short" means. * If you get an error on the "unsigned short un_short;" line, * then undefine HAVE_UNSIGNED_SHORT. */ #define HAVE_UNSIGNED_SHORT #ifdef HAVE_UNSIGNED_SHORT unsigned short un_short; #endif /* Now we want to find out if your compiler understands type "void". * If you get an error anywhere in here, undefine HAVE_VOID. */ #define HAVE_VOID #ifdef HAVE_VOID typedef void * void_ptr; /* check void * */ typedef void (*void_func) (); /* check ptr to function returning void */ void testfunction2 (arg1, arg2) /* check void function result */ void_ptr arg1; void_func arg2; { char * locptr = (char *) arg1; /* check casting to and from void * */ arg1 = (void *) locptr; (*arg2) (1, 2); /* check call of fcn returning void */ } #endif /* Now we want to find out if your compiler knows what "const" means. * If you get an error here, undefine HAVE_CONST. */ #define HAVE_CONST #ifdef HAVE_CONST static const int carray[3] = {1, 2, 3}; int testfunction3 (arg1) const int arg1; { return carray[arg1]; } #endif /************************************************************************ * OK, that's it. You should not have to change anything beyond this * point in order to compile and execute this program. (You might get * some warnings, but you can ignore them.) * When you run the program, it will make a couple more tests that it * can do automatically, and then it will print out a summary of the changes * that you need to make to the makefile and jconfig.h. ************************************************************************ */ static int any_changes = 0; int new_change () { if (! any_changes) { printf("\nMost of the changes recommended by this program can be made either\n"); printf("by editing jconfig.h, or by adding -Dsymbol switches to the CFLAGS\n"); printf("line in your Makefile. (Some PC compilers expect /Dsymbol instead.)\n"); printf("The CFLAGS method is simpler, but if your compiler doesn't support -D,\n"); printf("then you must change jconfig.h. Also, it's best to change jconfig.h\n"); printf("if you plan to use the JPEG software as a library for other programs.\n"); any_changes = 1; } printf("\n"); /* blank line before each problem report */ return 0; } int test_char_sign (arg) int arg; { if (arg == 189) { /* expected result for unsigned char */ new_change(); printf("You should add -DCHAR_IS_UNSIGNED to CFLAGS,\n"); printf("or else remove the /* */ comment marks from the line\n"); printf("/* #define CHAR_IS_UNSIGNED */ in jconfig.h.\n"); printf("(Be sure to delete the space before the # character too.)\n"); } else if (arg != -67) { /* expected result for signed char */ new_change(); printf("Hmm, it seems 'char' is less than eight bits wide on your machine.\n"); printf("I fear the JPEG software will not work at all.\n"); } return 0; } int test_shifting (arg) long arg; /* See whether right-shift on a long is signed or not. */ { long res = arg >> 4; if (res == 0x80817F4L) { /* expected result for unsigned */ new_change(); printf("You must add -DRIGHT_SHIFT_IS_UNSIGNED to CFLAGS,\n"); printf("or else remove the /* */ comment marks from the line\n"); printf("/* #define RIGHT_SHIFT_IS_UNSIGNED */ in jconfig.h.\n"); } else if (res != -0x7F7E80CL) { /* expected result for signed */ new_change(); printf("Right shift isn't acting as I expect it to.\n"); printf("I fear the JPEG software will not work at all.\n"); } return 0; } int main (argc, argv) int argc; char ** argv; { char signed_char_check = (char) (-67); printf("Results of configuration check for Independent JPEG Group's software:\n"); printf("\nIf there's not a specific makefile provided for your compiler,\n"); #ifdef HAVE_ANSI_DEFINITIONS printf("you should use makefile.ansi as the starting point for your Makefile.\n"); #else printf("you should use makefile.unix as the starting point for your Makefile.\n"); #endif /* Check whether we have all the ANSI features, */ /* and whether this agrees with __STDC__ being predefined. */ #ifdef __STDC__ #define HAVE_STDC /* ANSI compilers won't allow redefining __STDC__ */ #endif #ifdef HAVE_ANSI_DEFINITIONS #ifdef HAVE_UNSIGNED_CHAR #ifdef HAVE_UNSIGNED_SHORT #ifdef HAVE_CONST #define HAVE_ALL_ANSI_FEATURES #endif #endif #endif #endif #ifdef HAVE_ALL_ANSI_FEATURES #ifndef HAVE_STDC new_change(); printf("Your compiler doesn't claim to be ANSI-compliant, but it is close enough\n"); printf("for me. Either add -DHAVE_STDC to CFLAGS, or add #define HAVE_STDC at the\n"); printf("beginning of jconfig.h.\n"); #define HAVE_STDC #endif #else /* !HAVE_ALL_ANSI_FEATURES */ #ifdef HAVE_STDC new_change(); printf("Your compiler claims to be ANSI-compliant, but it is lying!\n"); printf("Delete the line #define HAVE_STDC near the beginning of jconfig.h.\n"); #undef HAVE_STDC #endif #endif /* HAVE_ALL_ANSI_FEATURES */ #ifndef HAVE_STDC #ifdef HAVE_ANSI_DEFINITIONS new_change(); printf("You should add -DPROTO to CFLAGS, or else take out the several\n"); printf("#ifdef/#else/#endif lines surrounding #define PROTO in jconfig.h.\n"); printf("(Leave only one #define PROTO line.)\n"); #endif #ifdef HAVE_UNSIGNED_CHAR #ifdef HAVE_UNSIGNED_SHORT new_change(); printf("You should add -DHAVE_UNSIGNED_CHAR and -DHAVE_UNSIGNED_SHORT\n"); printf("to CFLAGS, or else take out the #ifdef HAVE_STDC/#endif lines\n"); printf("surrounding #define HAVE_UNSIGNED_CHAR and #define HAVE_UNSIGNED_SHORT\n"); printf("in jconfig.h.\n"); #else /* only unsigned char */ new_change(); printf("You should add -DHAVE_UNSIGNED_CHAR to CFLAGS,\n"); printf("or else move #define HAVE_UNSIGNED_CHAR outside the\n"); printf("#ifdef HAVE_STDC/#endif lines surrounding it in jconfig.h.\n"); #endif #else /* !HAVE_UNSIGNED_CHAR */ #ifdef HAVE_UNSIGNED_SHORT new_change(); printf("You should add -DHAVE_UNSIGNED_SHORT to CFLAGS,\n"); printf("or else move #define HAVE_UNSIGNED_SHORT outside the\n"); printf("#ifdef HAVE_STDC/#endif lines surrounding it in jconfig.h.\n"); #endif #endif /* HAVE_UNSIGNED_CHAR */ #ifdef HAVE_CONST new_change(); printf("You should delete the #define const line from jconfig.h.\n"); #endif #endif /* HAVE_STDC */ test_char_sign((int) signed_char_check); test_shifting(-0x7F7E80B1L); #ifndef HAVE_VOID new_change(); printf("You should add -Dvoid=char to CFLAGS,\n"); printf("or else remove the /* */ comment marks from the line\n"); printf("/* #define void char */ in jconfig.h.\n"); printf("(Be sure to delete the space before the # character too.)\n"); #endif #ifdef INCLUDES_ARE_ANSI #ifndef __STDC__ new_change(); printf("You should add -DINCLUDES_ARE_ANSI to CFLAGS, or else add\n"); printf("#define INCLUDES_ARE_ANSI at the beginning of jinclude.h (NOT jconfig.h).\n"); #endif #else /* !INCLUDES_ARE_ANSI */ #ifdef __STDC__ new_change(); printf("You should add -DNONANSI_INCLUDES to CFLAGS, or else add\n"); printf("#define NONANSI_INCLUDES at the beginning of jinclude.h (NOT jconfig.h).\n"); #endif #ifdef NEED_SPECIAL_INCLUDE new_change(); printf("In jinclude.h, change the line reading #include \n"); printf("to instead include the file you found size_t in.\n"); #else /* !NEED_SPECIAL_INCLUDE */ #ifndef HAVE_TYPES_H new_change(); printf("In jinclude.h, delete the line reading #include .\n"); #endif #endif /* NEED_SPECIAL_INCLUDE */ #ifdef BSD new_change(); printf("You should add -DBSD to CFLAGS, or else add\n"); printf("#define BSD at the beginning of jinclude.h (NOT jconfig.h).\n"); #endif #endif /* INCLUDES_ARE_ANSI */ if (any_changes) { printf("\nI think that's everything...\n"); } else { printf("\nI think jconfig.h is OK as distributed.\n"); } return any_changes; }