xref: /llvm-project/flang/CMakeLists.txt (revision ab1ee912be95a864827aadd33175bfeec026f000)
1cmake_minimum_required(VERSION 3.20.0)
2set(LLVM_SUBPROJECT_TITLE "Flang")
3
4if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
5  set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
6endif()
7include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
8  NO_POLICY_SCOPE)
9
10set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
11
12# Flang requires C++17.
13set(CMAKE_CXX_STANDARD 17)
14set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
15set(CMAKE_CXX_EXTENSIONS OFF)
16
17if (LLVM_ENABLE_EH)
18  # To match with the flang guidelines we currently disable
19  # building with exception support in core LLVM.
20  message(FATAL_ERROR "Flang does not currently support building with \
21          LLVM exceptions enabled.  Please disable LLVM_ENABLE_EH when building \
22          flang.")
23endif()
24
25set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
26
27if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
28  message(FATAL_ERROR "In-source builds are not allowed. \
29          Please create a directory and run cmake from there,\
30          passing the path to this source directory as the last argument.\
31          This process created the file `CMakeCache.txt' and the directory\
32          `CMakeFiles'. Please delete them.")
33endif()
34
35option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
36
37# The out of tree builds of the compiler and the Fortran runtime
38# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
39# to be composable. Failure to synchronize this setting may result
40# in linking errors or fatal failures in F128 runtime functions.
41set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
42  "Specifies the target library used for implementing IEEE-754 128-bit float \
43  math in F18 runtime, e.g. it might be libquadmath for targets where \
44  REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
45  is mapped to long double, etc."
46  )
47
48# Check for a standalone build and configure as appropriate from
49# there.
50if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
51  message("Building Flang as a standalone project.")
52  project(Flang)
53  set(FLANG_STANDALONE_BUILD ON)
54else()
55  set(FLANG_STANDALONE_BUILD OFF)
56endif()
57
58# Must go below project(..)
59include(GNUInstallDirs)
60
61# MSVC + clang-cl build requires clang_rt.builtin.${target} library
62if (MSVC AND CMAKE_CXX_COMPILER_ID MATCHES Clang)
63  include(HandleCompilerRT)
64  find_compiler_rt_library(builtins CLANG_RT_BUILTINS_LIBRARY)
65  get_filename_component(LIBDIR "${CLANG_RT_BUILTINS_LIBRARY}" DIRECTORY)
66  if (IS_DIRECTORY "${LIBDIR}")
67    link_libraries(${CLANG_RT_BUILTINS_LIBRARY})
68  endif()
69
70  if (MSVC_VERSION EQUAL 1942)
71    message(FATAL_ERROR "Flang cannot be built with clang and the MSVC 17.12 "
72            "toolchain version. Please upgrade to 17.13 or later, or switch "
73            "to the 17.10 LTSC release. "
74            "See https://github.com/microsoft/STL/issues/4959 for more details.")
75  endif()
76endif()
77
78if(CMAKE_SIZEOF_VOID_P EQUAL 4)
79  message(FATAL_ERROR "flang isn't supported on 32 bit CPUs")
80endif()
81
82if (FLANG_STANDALONE_BUILD)
83  set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
84  set(CMAKE_INCLUDE_CURRENT_DIR ON)
85  if (NOT MSVC_IDE)
86    set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
87      CACHE BOOL "Enable assertions")
88    # Assertions follow llvm's configuration.
89    mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
90  endif()
91
92  # If the user specifies a relative path to LLVM_DIR, the calls to include
93  # LLVM modules fail. Append the absolute path to LLVM_DIR instead.
94  if (LLVM_DIR)
95    get_filename_component(LLVM_DIR_ABSOLUTE ${LLVM_DIR}
96      REALPATH BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
97    list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR_ABSOLUTE})
98  endif()
99  # We need a pre-built/installed version of LLVM.
100  find_package(LLVM REQUIRED HINTS "${LLVM_DIR_ABSOLUTE}")
101  if (NOT LLVM_DIR_ABSOLUTE)
102    # If the user did not specify a LLVM_DIR (and therefore LLVM_DIR_ABSOLUTE
103    # was not set), append the discovered path to CMAKE_MODULE_PATH.
104    list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
105  endif()
106
107  # Users might specify a path to CLANG_DIR that's:
108  #   * a full path, or
109  #   * a path relative to the path of this script.
110  # Append the absolute path to CLANG_DIR so that find_package works in both
111  # cases.
112  if (CLANG_DIR)
113    get_filename_component(
114      CLANG_DIR_ABSOLUTE
115      ${CLANG_DIR}
116      REALPATH
117      BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
118    list(APPEND CMAKE_MODULE_PATH ${CLANG_DIR_ABSOLUTE})
119
120    # TODO: Remove when libclangDriver is lifted out of Clang
121    find_package(Clang REQUIRED PATHS "${CLANG_DIR_ABSOLUTE}" NO_DEFAULT_PATH)
122  else()
123    find_package(Clang REQUIRED)
124    list(APPEND CMAKE_MODULE_PATH ${Clang_DIR})
125  endif()
126
127  # If LLVM links to zlib we need the imported targets so we can too.
128  if(LLVM_ENABLE_ZLIB)
129    find_package(ZLIB REQUIRED)
130  endif()
131  option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
132  if(CMAKE_COMPILER_IS_GNUCXX)
133    set(USE_NO_MAYBE_UNINITIALIZED 1)
134  endif()
135
136  include(AddLLVM)
137  include(HandleLLVMOptions)
138  include(VersionFromVCS)
139  include(GetErrcMessages)
140
141  include(AddClang)
142
143  include(TableGen)
144  # If the user specifies a relative path to MLIR_DIR, the calls to include
145  # MLIR modules fail. Append the absolute path to MLIR_DIR instead.
146  if (MLIR_DIR)
147    get_filename_component(MLIR_DIR_ABSOLUTE ${MLIR_DIR}
148      REALPATH BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
149    list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR_ABSOLUTE})
150  endif()
151  find_package(MLIR REQUIRED CONFIG HINTS ${MLIR_DIR_ABSOLUTE})
152  if (NOT MLIR_DIR_ABSOLUTE)
153    list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR})
154  endif()
155  # Use SYSTEM for the same reasons as for LLVM includes
156  include_directories(SYSTEM ${MLIR_INCLUDE_DIRS})
157  include(AddMLIR)
158  find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR}
159    NO_DEFAULT_PATH)
160
161  option(LLVM_INSTALL_TOOLCHAIN_ONLY
162    "Only include toolchain files in the 'install' target." OFF)
163  option(LLVM_FORCE_USE_OLD_TOOLCHAIN
164    "Set to ON to force using an old, unsupported host toolchain." OFF)
165
166
167  # Add LLVM include files as if they were SYSTEM because there are complex unused
168  # parameter issues that may or may not appear depending on the environments and
169  # compilers (ifdefs are involved). This allows warnings from LLVM headers to be
170  # ignored while keeping -Wunused-parameter a fatal error inside f18 code base.
171  # This may have to be fine-tuned if flang headers are consider part of this
172  # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers
173  # should not be suppressed).
174  include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
175  add_definitions(${LLVM_DEFINITIONS})
176
177  # LLVM's cmake configuration files currently sneak in a c++11 flag.
178  # We look for it here and remove it from Flang's compile flags to
179  # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17).
180  if (DEFINED LLVM_CXX_STD)
181    message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}")
182    if (NOT LLVM_CXX_STD EQUAL "c++17")
183      message("Flang: Overriding LLVM's 'cxx_std' setting...")
184      message("    removing '-std=${LLVM_CXX_STD}'")
185      message("    CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
186      string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
187      message("    [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
188    endif()
189  endif()
190
191  link_directories("${LLVM_LIBRARY_DIR}")
192
193  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
194  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
195    ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
196  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
197    ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
198
199  set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit")
200
201  option(FLANG_INCLUDE_TESTS
202         "Generate build targets for the Flang unit tests."
203         ON)
204
205  get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
206
207#Handle unittests when out-of-tree
208  set(FLANG_GTEST_AVAIL 0)
209  if (FLANG_INCLUDE_TESTS)
210    set(UNITTEST_DIR ${LLVM_THIRD_PARTY_DIR}/unittest)
211    if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)
212      if (NOT TARGET llvm_gtest)
213        add_subdirectory(${UNITTEST_DIR} third-party/unittest)
214      endif()
215      set(FLANG_GTEST_AVAIL 1)
216    else()
217      message(WARNING
218      "Unit-tests will be skipped as LLVM install does not include google-test related headers and libraries.")
219      set(FLANG_GTEST_AVAIL 0)
220    endif()
221  endif()
222  if (FLANG_GTEST_AVAIL)
223    add_custom_target(check-all DEPENDS check-flang FlangUnitTests)
224  else()
225    add_custom_target(check-all DEPENDS check-flang )
226  endif()
227  if (LLVM_BUILD_DOCS)
228    add_custom_target(doxygen ALL)
229  endif()
230
231else()
232  option(FLANG_INCLUDE_TESTS
233         "Generate build targets for the Flang unit tests."
234         ${LLVM_INCLUDE_TESTS})
235  set(FLANG_GTEST_AVAIL 1)
236
237  if(FLANG_STANDALONE_BUILD)
238    set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang)
239  else()
240    set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
241  endif()
242
243  set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir ) # --src-root
244  set(MLIR_INCLUDE_DIR ${MLIR_MAIN_SRC_DIR}/include ) # --includedir
245  set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include)
246  include_directories(SYSTEM ${MLIR_INCLUDE_DIR})
247  include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})
248endif()
249
250set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
251    "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
252mark_as_advanced(FLANG_TOOLS_INSTALL_DIR)
253
254set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_BINARY_DIR}/include/flang)
255set(FLANG_INCLUDE_DIR ${FLANG_BINARY_DIR}/include)
256
257# TODO: Remove when libclangDriver is lifted out of Clang
258if(FLANG_STANDALONE_BUILD)
259  set(CLANG_INCLUDE_DIR ${CLANG_INCLUDE_DIRS} )
260  # No need to specify TableGen output dir as that's embedded in CLANG_DIR
261else()
262  set(CLANG_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../clang/include )
263  # Specify TableGen output dir for things like DiagnosticCommonKinds.inc,
264  # DiagnosticDriverKinds.inc (required for reporting diagnostics)
265  set(CLANG_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/clang/include)
266  include_directories(SYSTEM ${CLANG_TABLEGEN_OUTPUT_DIR})
267endif()
268include_directories(SYSTEM ${CLANG_INCLUDE_DIR})
269
270# tco tool and FIR lib output directories
271if(FLANG_STANDALONE_BUILD)
272  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
273  set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
274endif()
275# Always build tco tool
276set(LLVM_BUILD_TOOLS ON)
277
278include_directories(BEFORE
279  ${FLANG_BINARY_DIR}/include
280  ${FLANG_SOURCE_DIR}/include)
281
282# Add Flang-centric modules to cmake path.
283list(INSERT CMAKE_MODULE_PATH 0
284  "${FLANG_SOURCE_DIR}/cmake/modules"
285  "${LLVM_COMMON_CMAKE_UTILS}/Modules"
286  )
287include(AddFlang)
288
289if (NOT DEFAULT_SYSROOT)
290  set(DEFAULT_SYSROOT "" CACHE PATH
291    "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).")
292endif()
293
294if (NOT ENABLE_LINKER_BUILD_ID)
295  set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
296endif()
297
298set(FLANG_DEFAULT_LINKER "" CACHE STRING
299  "Default linker to use (linker name or absolute path, empty for platform default)")
300
301set(FLANG_DEFAULT_RTLIB "" CACHE STRING
302   "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.")
303
304if (NOT(FLANG_DEFAULT_RTLIB STREQUAL ""))
305  message(WARNING "Resetting Flang's default runtime library to use platform default.")
306  set(FLANG_DEFAULT_RTLIB "" CACHE STRING
307      "Default runtime library to use (empty for platform default)" FORCE)
308endif()
309
310
311
312set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
313if (NOT PACKAGE_VERSION)
314  set(PACKAGE_VERSION ${LLVM_VERSION_MAJOR})
315endif()
316
317
318if (NOT DEFINED FLANG_VERSION_MAJOR)
319  set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
320endif()
321
322if (NOT DEFINED FLANG_VERSION_MINOR)
323  set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})
324endif()
325
326if (NOT DEFINED FLANG_VERSION_PATCHLEVEL)
327  set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
328endif()
329
330# Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX.
331set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}")
332message(STATUS "Flang version: ${FLANG_VERSION}")
333# Flang executable version information
334set(FLANG_EXECUTABLE_VERSION
335    "${FLANG_VERSION_MAJOR}" CACHE STRING
336    "Major version number to appended to the flang executable name.")
337set(LIBFLANG_LIBRARY_VERSION
338    "${FLANG_VERSION_MAJOR}" CACHE STRING
339    "Major version number to appended to the libflang library.")
340
341mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION)
342
343set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
344  "Vendor-specific Flang version information.")
345set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING
346  "Vendor-specific uti.")
347
348if (FLANG_VENDOR)
349  add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ")
350endif()
351
352set(FLANG_REPOSITORY_STRING "" CACHE STRING
353  "Vendor-specific text for showing the repository the source is taken from.")
354if (FLANG_REPOSITORY_STRING)
355  add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
356endif()
357
358if (FLANG_RUNTIME_F128_MATH_LIB)
359  add_compile_definitions(
360    FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}"
361    )
362endif()
363
364include(TestBigEndian)
365test_big_endian(IS_BIGENDIAN)
366if (IS_BIGENDIAN)
367  add_compile_definitions(FLANG_BIG_ENDIAN=1)
368else ()
369  add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
370endif ()
371
372# Configure Flang's Version.inc file.
373configure_file(
374  ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
375  ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc)
376# Configure Flang's version info header file.
377configure_file(
378  ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake
379  ${FLANG_BINARY_DIR}/include/flang/Config/config.h)
380
381if (FLANG_ENABLE_WERROR)
382  # The following is taken from llvm/cmake/modules/HandleLLVMOptions.cmake
383  # Keep this up-to-date with that file
384  if( MSVC )
385    append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
386  endif()
387  if ( LLVM_COMPILER_IS_GCC_COMPATIBLE )
388    append("-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
389    append("-Wno-error" CMAKE_REQUIRED_FLAGS)
390  endif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
391endif()
392
393# Builtin check_cxx_compiler_flag doesn't seem to work correctly
394macro(check_compiler_flag flag resultVar)
395  unset(${resultVar} CACHE)
396  check_cxx_compiler_flag("${flag}" ${resultVar})
397endmacro()
398
399check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
400if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
401  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy")
402endif()
403check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
404if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
405  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion")
406endif()
407check_compiler_flag("-Wno-ctad-maybe-unsupported" CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG)
408if (CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG)
409  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-ctad-maybe-unsupported")
410endif()
411
412# Add appropriate flags for GCC
413if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
414
415  if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
416    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fno-semantic-interposition")
417  else()
418    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \
419          -Wcovered-switch-default")
420  endif()  # Clang.
421
422  check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
423  if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
424    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types")
425  endif()
426
427  # Add to build type flags.
428  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18")
429  set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"")
430
431  # Building shared libraries is bad for performance with GCC by default
432  # due to the need to preserve the right to override external entry points
433  if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
434   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition")
435  endif()
436
437endif()
438
439# Clang on Darwin enables non-POSIX extensions by default, which allows the
440# macro HUGE to leak out of <math.h> even when it is never directly included,
441# conflicting with Flang's HUGE symbols.
442# Set _POSIX_C_SOURCE to avoid including these extensions.
443if (APPLE)
444  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_POSIX_C_SOURCE=200809")
445endif()
446
447list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS)
448
449# Determine HOST_LINK_VERSION on Darwin.
450set(HOST_LINK_VERSION)
451if (APPLE)
452  set(LD_V_OUTPUT)
453  execute_process(
454    COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
455    RESULT_VARIABLE HAD_ERROR
456    OUTPUT_VARIABLE LD_V_OUTPUT)
457  if (NOT HAD_ERROR)
458    if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
459      string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
460    elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
461      string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
462    endif()
463  else()
464    message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
465  endif()
466endif()
467
468include(AddFlang)
469
470if (FLANG_INCLUDE_TESTS)
471  add_compile_definitions(FLANG_INCLUDE_TESTS=1)
472endif()
473
474option(FLANG_CUF_RUNTIME
475  "Compile CUDA Fortran runtime sources" OFF)
476if (FLANG_CUF_RUNTIME)
477  find_package(CUDAToolkit REQUIRED)
478endif()
479
480add_subdirectory(include)
481add_subdirectory(lib)
482add_subdirectory(cmake/modules)
483
484option(FLANG_BUILD_TOOLS
485  "Build the Flang tools. If OFF, just generate build targets." ON)
486if (FLANG_BUILD_TOOLS)
487  add_subdirectory(tools)
488endif()
489
490add_subdirectory(runtime)
491
492if (LLVM_INCLUDE_EXAMPLES)
493  add_subdirectory(examples)
494endif()
495
496if (FLANG_INCLUDE_TESTS)
497  add_subdirectory(test)
498  if (FLANG_GTEST_AVAIL)
499    add_subdirectory(unittests)
500  endif ()
501endif()
502
503option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs."
504       ${LLVM_INCLUDE_DOCS})
505if (FLANG_INCLUDE_DOCS)
506  add_subdirectory(docs)
507endif()
508
509# Custom target to install Flang libraries.
510add_custom_target(flang-libraries)
511set_target_properties(flang-libraries PROPERTIES FOLDER "Flang/Meta")
512
513if (NOT LLVM_ENABLE_IDE)
514  add_llvm_install_targets(install-flang-libraries
515   DEPENDS flang-libraries
516   COMPONENT flang-libraries)
517endif()
518
519get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS)
520if (FLANG_LIBS)
521  list(REMOVE_DUPLICATES FLANG_LIBS)
522  foreach(lib ${FLANG_LIBS})
523    add_dependencies(flang-libraries ${lib})
524    if (NOT LLVM_ENABLE_IDE)
525      add_dependencies(install-flang-libraries install-${lib})
526    endif()
527  endforeach()
528endif()
529
530if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
531  add_llvm_install_targets(install-flang-headers
532    COMPONENT flang-headers)
533
534  install(DIRECTORY include/flang
535    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
536    COMPONENT flang-headers
537    FILES_MATCHING
538    PATTERN "*.def"
539    PATTERN "*.h"
540    PATTERN "*.inc"
541    PATTERN "*.td"
542    PATTERN "config.h" EXCLUDE
543    PATTERN ".git"     EXCLUDE
544    PATTERN "CMakeFiles" EXCLUDE)
545
546  install(DIRECTORY ${FLANG_INCLUDE_DIR}/flang
547    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
548    COMPONENT flang-headers
549    FILES_MATCHING
550    PATTERN "*.inc"
551    )
552endif()
553
554# Put ISO_Fortran_binding.h into the include files of the build area now
555# so that we can run tests before installing
556include(GetClangResourceDir)
557get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
558configure_file(
559  ${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
560  ${HEADER_BINARY_DIR}/ISO_Fortran_binding.h)
561
562# And also install it into the install area
563get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)
564install(
565  FILES include/flang/ISO_Fortran_binding.h
566  DESTINATION ${HEADER_INSTALL_DIR} )
567
568