blob: 56a96e580c9648c14cbe9e6299fad59d234ec17b [file] [log] [blame]
macro(xcrun_find VARIABLE NAME)
execute_process(COMMAND xcrun ${XCRUN_FLAGS} -f ${NAME}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE ${VARIABLE})
endmacro()
macro(xcrun_find_update_cache VARIABLE NAME)
xcrun_find(${VARIABLE} ${NAME})
set(${VARIABLE} "${${VARIABLE}}" CACHE STRING "")
endmacro()
execute_process(COMMAND xcrun ${XCRUN_FLAGS} --show-sdk-path
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE SDK_PATH)
xcrun_find_update_cache(CMAKE_LINKER ld)
if (CMAKE_C_COMPILER)
# The user manually specified a compiler which is usually different than
# the one coming with the SDK.
# Construct shim for ranlib, ar, etc.
# This is necessary because the ranlib coming with the xcode sdk looks for
# ../lib/libLTO.dylib and will therefor pick up libLTO.dylib coming with the
# SDK. However for correct behavior it has to pick up libLTO.dylib coming
# the clang compiler used.
xcrun_find_update_cache(SDK_RANLIB ranlib)
get_filename_component(COMPILER_DIR ${CMAKE_C_COMPILER} DIRECTORY)
macro(create_shim VARIABLE TOOLNAME)
xcrun_find(SDK_TOOL_BIN ${TOOLNAME})
file(WRITE ${CMAKE_BINARY_DIR}/${TOOLNAME} "
# Shim to have the tool use the correct libLTO.dylib
DYLD_LIBRARY_PATH=\"${COMPILER_DIR}/../lib:$DYLD_LIBRARY_PATH\" ${SDK_TOOL_BIN} \"$@\"
")
execute_process(COMMAND chmod +x ${CMAKE_BINARY_DIR}/${TOOLNAME})
set(${VARIABLE} ${CMAKE_BINARY_DIR}/${TOOLNAME} CACHE STRING "")
endmacro()
create_shim(CMAKE_AR ar)
create_shim(CMAKE_NM nm)
create_shim(CMAKE_RANLIB ranlib)
create_shim(CMAKE_STRIP strip)
# Skip linking in cmake compiler tests, as the cmake won't pass the -B flags
# required to pick up the correct linker to the early compiler tests. However
# it does have an option to not link in the early tests.
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY CACHE STRING "")
# Some benchmarks check for the function re_comp by using
# check_function_exists. This function is not available in any Xcode SDK, and
# the check returns YES with custom built compilers when we cross-compile,
# because of "CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY" explained just
# above. We work around that by forcing it to NO.
set(HAVE_RE_COMP CACHE BOOL NO)
else()
# Search and use compiler coming with the SDK.
# Note that we do not search CMAKE_CXX_COMPILER here. cmake will try
# `${CMAKE_C_COMPILER}++` and use that if available.
xcrun_find_update_cache(CMAKE_AR ar)
xcrun_find_update_cache(CMAKE_NM nm)
xcrun_find_update_cache(CMAKE_C_COMPILER clang)
xcrun_find_update_cache(CMAKE_RANLIB ranlib)
xcrun_find_update_cache(CMAKE_STRIP strip)
endif()
set(CMAKE_OSX_SYSROOT "${SDK_PATH}" CACHE STRING "")
# Append -B so clang picks up the linker coming with the SDK instead of the
# one in $PATH.
xcrun_find(LINKER_PATH ld)
get_filename_component(LINKER_DIR ${LINKER_PATH} DIRECTORY)
set(TEST_SUITE_ARCH_FLAGS "${TEST_SUITE_ARCH_FLAGS} -B ${LINKER_DIR}" CACHE STRING "")
# The problem with TEST_SUITE_ARCH_FLAGS is that they will not be used when
# cmake is testing for features with try_compile().
#
# This is a work around for this: try_compile() does honor toolchain files which
# can chane CMAKE_C_FLAGS.
#
# Note that CMAKE_TRY_COMPILE_PLATFORM_VARIABLES used by this is only available
# in cmake >=3.6
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/arch_flags_toolchain.cmake CACHE STRING "")
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES "TEST_SUITE_ARCH_FLAGS_FORWARD" CACHE STRING "")
set(TEST_SUITE_ARCH_FLAGS_FORWARD "${TEST_SUITE_ARCH_FLAGS}" CACHE STRING "")