[CMake] OS X architecture changes interfere with CheckTypeSize()?
Michael Jackson
mike.jackson at bluequartz.net
Wed Aug 11 16:16:57 EDT 2010
On Aug 11, 2010, at 3:52 PM, Michael Wild wrote:
>
> On 11. Aug, 2010, at 21:44 , Erik Lindahl wrote:
>
>> Hi,
>>
>> Sound technical answers from both David & Clinton - I see the
>> limitations, and why we have to live with it for now ;-)
>>
>> Given that there are good reasons to change it on-the-fly, but that
>> it is still almost as fundamental as a compiler change, perhaps it
>> could at least make sense to display some sort of warning if it is
>> changed, and stress that it will not update architecture-dependent
>> data in the cache?
>>
>> Cheers,
>>
>> Erik
>
> The problem is more fundamental. If you set CMAKE_OSX_ARCHITECTURES
> to e.g. i386;x86_64;ppc;ppc64 to compile a four-way universal
> binary, what is the expected result from CheckTypeSize() and similar
> functions? There should be one result for each of the architectures.
> That's why you need to do it at compile-time using __i386__,
> __x86_64__, __ppc__ and __ppc64__, or you test the length of the
> CMAKE_OSX_ARCHITECTURES list and if that is larger than one, you
> error out. IMHO CMake can't help you much beyond that.
>
> Michael
Just as I was looking something else up I came across the docs for
"CheckTypeSize".
Check if the type exists and determine its size. On return, "HAVE_$
{VARIABLE}" holds the existence of the type, and "${VARIABLE}" holds
one of the following:
<size> = type has non-zero size <size>
"0" = type has arch-dependent size (see below)
"" = type does not exist
Furthermore, the variable "${VARIABLE}_CODE" holds C preprocessor code
to define the macro "${VARIABLE}" to the size of the type, or leave
the macro undefined if the type does not exist.
The variable "${VARIABLE}" may be "0" when CMAKE_OSX_ARCHITECTURES has
multiple architectures for building OS X universal binaries. This
indicates that the type size varies across architectures. In this case
"${VARIABLE}_CODE" contains C preprocessor tests mapping from each
architecture macro to the corresponding type size. The list of
architecture macros is stored in "${VARIABLE}_KEYS", and the value for
each key is stored in "${VARIABLE}-${KEY}".
With that I wrote the following CMakeLists.txt
# Begin CMakeLists.txt
project(test)
cmake_minimum_required(VERSION 2.8)
INCLUDE (${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
CHECK_TYPE_SIZE(long SIZE_OF_LONG)
message(STATUS "Preprocessor Code To use. \n ${SIZE_OF_LONG_CODE}")
foreach( key ${SIZE_OF_LONG_KEYS})
message(STATUS "Variable: SIZE_OF_LONG key: ${key} value: $
{SIZE_OF_LONG-${key}}")
endforeach()
# End CMakeLists.txt file
and invoked it with the following:
cmake -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" ../
and got back this in response.
.....
-- Check size of long
-- Check size of long - done
-- Preprocessor Code To use.
#if defined(__i386)
# define SIZE_OF_LONG 4
#elif defined(__x86_64)
# define SIZE_OF_LONG 8
#else
# error SIZE_OF_LONG unknown
#endif
-- Variable: SIZE_OF_LONG key: __i386 value: 4
-- Variable: SIZE_OF_LONG key: __x86_64 value: 8
.....
So CMake is _trying_ to help you as best it can at the moment. You
should still be able to wrap the test to CheckTypeSize() with your own
function, detect the change to CMAKE_OSX_ARCHITECTURES and the
forcibly rerun the test again.
Hope some of that helps.
Mike Jackson
More information about the CMake
mailing list