On Oct 30, 2009, at 12:26 PM, Paolo Bonzini wrote:
On 10/30/2009 08:24 PM, Kevin Van Vechten wrote:
I'm not very familiar with autoconf conventions and was wondering why some config.h values are merely defined and some are explicitly defined to 1.
That's a bad decision in configure.ac usually. Just look for occurrences of AC_DEFINE([FOO],,[Comment]) and add a 1 between the two commas.
Is there a strong convention to do #ifdef HAVE_FOO instead of #if HAVE_FOO when testing for configure features? For various reasons, the ability to define a macro to 0 or 1 would be useful for the Mac OS X version of config.h — it would let us define certain features in terms of other features without as much conditional logic.
... that said, why can't config.h be generated for Mac OS X by running configure every time a change to the autoconf source is checked in? There should be no need for conditional logic.
I think this is the problem Kevin is alluding to: Mac OS X projects usually use the same set of source files for all of the multiple machine architectures that the project is be built for. This can cause problems when a configure-time check doesn't match the target architecture. An example that has come up in the past is configure-time detection of endianness. If configure was run on a PowerPC machine, the generated config.h would indicate that the machine was big-endian: /* Define if the machine architecture is big-endian. */ #define WORDS_BIGENDIAN 1 whereas if it was run on in an Intel machine, the generated config.h would indicate that the machine was little-endian: /* Define if the machine architecture is big-endian. */ /* #undef WORDS_BIGENDIAN */ One possible solution that has been employed in the past is to hand- modify the checked in pre-created config.h to use the (Apple-specific) compiler built-in: /* Define if the machine architecture is big-endian. */ #define WORDS_BIGENDIAN __BIG_ENDIAN__ If the code that uses this #define is written using "#if WORDS_BIGENDIAN", it will work correctly, but if it instead uses "#ifdef WORDS_BIGENDIAN", it will incorrectly treat all architectures as big-endian. Ronnie