50 lines
2.3 KiB
CMake
50 lines
2.3 KiB
CMake
|
|
# Function to compile a source file to identify the compiler ABI.
|
|
# This is used internally by CMake and should not be included by user
|
|
# code.
|
|
|
|
FUNCTION(CMAKE_DETERMINE_COMPILER_ABI lang src)
|
|
IF(NOT DEFINED CMAKE_DETERMINE_${lang}_ABI_COMPILED)
|
|
MESSAGE(STATUS "Detecting ${lang} compiler info")
|
|
|
|
# Compile the ABI identification source.
|
|
SET(BIN "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeDetermineCompilerABI_${lang}.bin")
|
|
TRY_COMPILE(CMAKE_DETERMINE_${lang}_ABI_COMPILED
|
|
${CMAKE_BINARY_DIR} ${src}
|
|
OUTPUT_VARIABLE OUTPUT
|
|
COPY_FILE "${BIN}"
|
|
)
|
|
|
|
# Load the resulting information strings.
|
|
IF(CMAKE_DETERMINE_${lang}_ABI_COMPILED)
|
|
MESSAGE(STATUS "Detecting ${lang} compiler info - done")
|
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
|
"Detecting ${lang} compiler info compiled with the following output:\n${OUTPUT}\n\n")
|
|
FILE(STRINGS "${BIN}" ABI_STRINGS LIMIT_COUNT 2 REGEX "INFO:[^[]*\\[")
|
|
FOREACH(info ${ABI_STRINGS})
|
|
IF("${info}" MATCHES ".*INFO:sizeof_dptr\\[0*([^]]*)\\].*")
|
|
STRING(REGEX REPLACE ".*INFO:sizeof_dptr\\[0*([^]]*)\\].*" "\\1" ABI_SIZEOF_DPTR "${info}")
|
|
ENDIF("${info}" MATCHES ".*INFO:sizeof_dptr\\[0*([^]]*)\\].*")
|
|
IF("${info}" MATCHES ".*INFO:abi\\[([^]]*)\\].*")
|
|
STRING(REGEX REPLACE ".*INFO:abi\\[([^]]*)\\].*" "\\1" ABI_NAME "${info}")
|
|
ENDIF("${info}" MATCHES ".*INFO:abi\\[([^]]*)\\].*")
|
|
ENDFOREACH(info)
|
|
|
|
IF(ABI_SIZEOF_DPTR)
|
|
SET(CMAKE_${lang}_SIZEOF_DATA_PTR "${ABI_SIZEOF_DPTR}" PARENT_SCOPE)
|
|
SET(CMAKE_SIZEOF_VOID_P "${ABI_SIZEOF_DPTR}" PARENT_SCOPE)
|
|
ENDIF(ABI_SIZEOF_DPTR)
|
|
|
|
IF(ABI_NAME)
|
|
SET(CMAKE_${lang}_COMPILER_ABI "${ABI_NAME}" PARENT_SCOPE)
|
|
SET(CMAKE_INTERNAL_PLATFORM_ABI "${ABI_NAME}" PARENT_SCOPE)
|
|
ENDIF(ABI_NAME)
|
|
|
|
ELSE(CMAKE_DETERMINE_${lang}_ABI_COMPILED)
|
|
MESSAGE(STATUS "Detecting ${lang} compiler info - failed")
|
|
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
|
"Detecting ${lang} compiler info failed to compile with the following output:\n${OUTPUT}\n\n")
|
|
ENDIF(CMAKE_DETERMINE_${lang}_ABI_COMPILED)
|
|
ENDIF(NOT DEFINED CMAKE_DETERMINE_${lang}_ABI_COMPILED)
|
|
ENDFUNCTION(CMAKE_DETERMINE_COMPILER_ABI)
|