blob: c5a38367f5f82edeb28b47084fa15f588e611a60 [file] [log] [blame]
Jonathan Peyton2e013352015-07-15 16:05:30 +00001#
2#//===----------------------------------------------------------------------===//
3#//
4#// The LLVM Compiler Infrastructure
5#//
6#// This file is dual licensed under the MIT and the University of Illinois Open
7#// Source Licenses. See LICENSE.txt for details.
8#//
9#//===----------------------------------------------------------------------===//
10#
11
12# Checking a linker flag to build a shared library
13# There is no real trivial way to do this in CMake, so we implement it here
14# this will have ${boolean} = TRUE if the flag succeeds, otherwise FALSE.
15function(libomp_check_linker_flag flag boolean)
16 if(NOT DEFINED "${boolean}")
17 set(retval TRUE)
18 set(library_source
19 "int foo(int a) { return a*a; }")
20 set(cmake_source
21 "cmake_minimum_required(VERSION 2.8)
22 project(foo C)
23 set(CMAKE_SHARED_LINKER_FLAGS \"${flag}\")
24 add_library(foo SHARED src_to_link.c)")
25 set(failed_regexes "[Ee]rror;[Uu]nknown;[Ss]kipping;LINK : warning")
26 set(base_dir ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/link_flag_check)
27 file(MAKE_DIRECTORY ${base_dir})
28 file(MAKE_DIRECTORY ${base_dir}/build)
29 file(WRITE ${base_dir}/src_to_link.c "${library_source}")
30 file(WRITE ${base_dir}/CMakeLists.txt "${cmake_source}")
31
32 message(STATUS "Performing Test ${boolean}")
33 try_compile(
34 try_compile_result
35 ${base_dir}/build
36 ${base_dir}
37 foo
38 OUTPUT_VARIABLE OUTPUT)
39
40 if(try_compile_result)
41 foreach(regex IN LISTS failed_regexes)
42 if("${OUTPUT}" MATCHES ${regex})
43 set(retval FALSE)
44 endif()
45 endforeach()
46 else()
47 set(retval FALSE)
48 endif()
49
50 if(${retval})
51 set(${boolean} 1 CACHE INTERNAL "Test ${boolean}")
52 message(STATUS "Performing Test ${boolean} - Success")
53 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
54 "Performing C Linker Flag test ${boolean} succeeded with the following output:\n"
55 "${OUTPUT}\n"
56 "Source file was:\n${library_source}\n")
57 else()
58 set(${boolean} "" CACHE INTERNAL "Test ${boolean}")
59 message(STATUS "Performing Test ${boolean} - Failed")
60 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
61 "Performing C Linker Flag test ${boolean} failed with the following output:\n"
62 "${OUTPUT}\n"
63 "Source file was:\n${library_source}\n")
64 endif()
65
66 set(${boolean} ${retval} PARENT_SCOPE)
67 endif()
68endfunction()