LibompCheckLinkerFlag.cmake 2.37 KB
#
#//===----------------------------------------------------------------------===//
#//
#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
#// See https://llvm.org/LICENSE.txt for license information.
#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#//
#//===----------------------------------------------------------------------===//
#

# Checking a linker flag to build a shared library
# There is no real trivial way to do this in CMake, so we implement it here
# this will have ${boolean} = TRUE if the flag succeeds, otherwise FALSE.
function(libomp_check_linker_flag flag boolean)
  if(NOT DEFINED "${boolean}")
  set(retval TRUE)
  set(library_source
    "int foo(int a) { return a*a; }")
  set(cmake_source
    "cmake_minimum_required(VERSION 2.8)
     project(foo C)
     set(CMAKE_SHARED_LINKER_FLAGS \"${flag}\")
     add_library(foo SHARED src_to_link.c)")
  set(failed_regexes "[Ee]rror;[Uu]nknown;[Ss]kipping;LINK : warning")
  set(base_dir ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/link_flag_check_${boolean})
  file(MAKE_DIRECTORY ${base_dir})
  file(MAKE_DIRECTORY ${base_dir}/build)
  file(WRITE ${base_dir}/src_to_link.c "${library_source}")
  file(WRITE ${base_dir}/CMakeLists.txt "${cmake_source}")

  message(STATUS "Performing Test ${boolean}")
  try_compile(
    try_compile_result
    ${base_dir}/build
    ${base_dir}
    foo
    OUTPUT_VARIABLE OUTPUT)

  if(try_compile_result)
    foreach(regex IN LISTS failed_regexes)
      if("${OUTPUT}" MATCHES ${regex})
        set(retval FALSE)
      endif()
    endforeach()
  else()
    set(retval FALSE)
  endif()

  if(${retval})
    set(${boolean} 1 CACHE INTERNAL "Test ${boolean}")
    message(STATUS "Performing Test ${boolean} - Success")
    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
      "Performing C Linker Flag test ${boolean} succeeded with the following output:\n"
      "${OUTPUT}\n"
      "Source file was:\n${library_source}\n")
  else()
    set(${boolean} "" CACHE INTERNAL "Test ${boolean}")
    message(STATUS "Performing Test ${boolean} - Failed")
    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
      "Performing C Linker Flag test ${boolean} failed with the following output:\n"
      "${OUTPUT}\n"
      "Source file was:\n${library_source}\n")
  endif()

  set(${boolean} ${retval} PARENT_SCOPE)
  endif()
endfunction()