aboutsummaryrefslogtreecommitdiff
path: root/rc3/runtime/cmake/LibompCheckLinkerFlag.cmake
blob: 75a38e316b137ac23a57e6379468d7a22a899af8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#
#//===----------------------------------------------------------------------===//
#//
#//                     The LLVM Compiler Infrastructure
#//
#// This file is dual licensed under the MIT and the University of Illinois Open
#// Source Licenses. See LICENSE.txt for details.
#//
#//===----------------------------------------------------------------------===//
#

# 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()